PostGIS 查询某点周围指定范围内的兴趣点

问题描述

在我们生活中,想必很多人都使用过一个功能就是查找附近XX米内的美食、景点等信息。那么该功能是如何实现的呢?本文将带你一探究竟。
具体问题:查询给定点(如:113.678 34.796)周围1000米内的学校。

数据库

PostgresSQL/PostGIS

主要方法

boolean ST_DWithin(geometry g1, geometry g2, double precision distance_of_srid);
boolean ST_DWithin(geography gg1, geography gg2, double precision distance_meters, boolean use_spheroid);

官方说明是:

Returns true if the geometries are within the specified distance of one another.
For geometry: The distance is specified in units defined by the spatial reference system of the geometries. For this function to make sense, the source geometries must both be of the same coordinate projection, having the same SRID.
For geography units are in meters and measurement is defaulted to use_spheroid=true, for faster check, use_spheroid=false to measure along sphere.

翻译过来大致是说:
(1)对于geometry第三个距离参数单位和数据的坐标系有关,如果数据使用的是地理坐标系,则距离单位是度。
(2)对于geography第三个距离参数单位是米。

Geometry与Geography

GIS坐标系简介

GIS中坐标系统有两种,一种是球面坐标,也叫地理坐标;一种是平面坐标,也叫投影坐标。在应用时,球面坐标通常用于计算,平面坐标通常用于展示(当然也可以用于计算)。
投影坐标是从球坐标投影后展开得来(用一个圆柱将地球包起来,把地球当成会发光的光源,投影后,将圆柱展开得到),投影的范围越大,精度就越低。范围越小,精度就越高。除了投影扇形的大小有区别,在不同的行业,也有不同的坐标系,例如用于测绘的坐标系。

Geometry与Geography支持的坐标系

Geometry支持地理坐标和平面坐标,Geometry支持更多的函数,一些几何计算的代价更低;
Geography仅支持地理坐标,Geography支持的函数略少,计算代价更高。

那为什么还需要Geography呢,请看官方给出的解释:

4.2.2. When to use Geography Data type over Geometry data type    
    
The geography type allows you to store data in longitude/latitude coordinates,     
but at a cost: there are fewer functions defined on GEOGRAPHY than there are on GEOMETRY;     
those functions that are defined take more CPU time to execute.    
    
The type you choose should be conditioned on the expected working area of the application you are building.     
Will your data span the globe or a large continental area, or is it local to a state, county or municipality?    
    
If your data is contained in a small area, you might find that choosing an appropriate     
projection and using GEOMETRY is the best solution, in terms of performance and functionality available.    
    
If your data is global or covers a continental region, you may find that GEOGRAPHY     
allows you to build a system without having to worry about projection details.     
You store your data in longitude/latitude, and use the functions that have been defined on GEOGRAPHY.    
    
If you don't understand projections, and you don't want to learn about them,     
and you're prepared to accept the limitations in functionality available in GEOGRAPHY,     
then it might be easier for you to use GEOGRAPHY than GEOMETRY.     
Simply load your data up as longitude/latitude and go from there.      
    
Refer to Section 14.11, “PostGIS Function Support Matrix” for compare between     
what is supported for Geography vs. Geometry.     
For a brief listing and description of Geography functions,     
refer to Section 14.4, “PostGIS Geography Support Functions”   

完整示例

示例1:使用Geometry

SELECT *
FROM school_table t
WHERE ST_DWithin(ST_Transform(ST_GeomFromText('POINT(113.678425 34.796591666)',4326),XXXX),ST_Transform(t.geom,XXXX),1000)

说明:语句中“XXXX”,需根据项目的精度要求,选择不同的投影以及所在的条度带。该方法适合小区域范围的查询,如果区域范围横跨两个条度带的时候,查出的内容会出错。
解决方法:在精度要求不高的时候,可使用WGS_1984_World_Mercator投影。
示例2:使用Geography

SELECT *
FROM school_table t
WHERE ST_DWithin(ST_GeographyFromText('SRID=4326;POINT(113.678425 34.796591666)'),t.geom::geography,1000)

与我国相关的坐标系

Geographic Coordinate System 地理坐标,参考资料:https://developers.arcgis.com/javascript/3/jshelp/gcs.html

WKID名称
4214GCS_Beijing_1954
4326GCS_WGS_1984
4490GCS_China_Geodetic_Coordinate_System_2000
4555GCS_New_Beijing
4610GCS_Xian_1980

Projected Coordinate System 投影坐标,参考资料:https://developers.arcgis.com/javascript/3/jshelp/pcs.html

WKID名称
2327Xian_1980_GK_Zone_13
2328Xian_1980_GK_Zone_14
2329Xian_1980_GK_Zone_15
2330Xian_1980_GK_Zone_16
2331Xian_1980_GK_Zone_17
2332Xian_1980_GK_Zone_18
2333Xian_1980_GK_Zone_19
2334Xian_1980_GK_Zone_20
2335Xian_1980_GK_Zone_21
2336Xian_1980_GK_Zone_22
2337Xian_1980_GK_Zone_23
2338Xian_1980_GK_CM_75E
2339Xian_1980_GK_CM_81E
2340Xian_1980_GK_CM_87E
2341Xian_1980_GK_CM_93E
2342Xian_1980_GK_CM_99E
2343Xian_1980_GK_CM_105E
2344Xian_1980_GK_CM_111E
2345Xian_1980_GK_CM_117E
2346Xian_1980_GK_CM_123E
2347Xian_1980_GK_CM_129E
2348Xian_1980_GK_CM_135E
2349Xian_1980_3_Degree_GK_Zone_25
2350Xian_1980_3_Degree_GK_Zone_26
2351Xian_1980_3_Degree_GK_Zone_27
2352Xian_1980_3_Degree_GK_Zone_28
2353Xian_1980_3_Degree_GK_Zone_29
2354Xian_1980_3_Degree_GK_Zone_30
2355Xian_1980_3_Degree_GK_Zone_31
2356Xian_1980_3_Degree_GK_Zone_32
2357Xian_1980_3_Degree_GK_Zone_33
2358Xian_1980_3_Degree_GK_Zone_34
2359Xian_1980_3_Degree_GK_Zone_35
2360Xian_1980_3_Degree_GK_Zone_36
2361Xian_1980_3_Degree_GK_Zone_37
2362Xian_1980_3_Degree_GK_Zone_38
2363Xian_1980_3_Degree_GK_Zone_39
2364Xian_1980_3_Degree_GK_Zone_40
2365Xian_1980_3_Degree_GK_Zone_41
2366Xian_1980_3_Degree_GK_Zone_42
2367Xian_1980_3_Degree_GK_Zone_43
2368Xian_1980_3_Degree_GK_Zone_44
2369Xian_1980_3_Degree_GK_Zone_45
2370Xian_1980_3_Degree_GK_CM_75E
2371Xian_1980_3_Degree_GK_CM_78E
2372Xian_1980_3_Degree_GK_CM_81E
2373Xian_1980_3_Degree_GK_CM_84E
2374Xian_1980_3_Degree_GK_CM_87E
2375Xian_1980_3_Degree_GK_CM_90E
2376Xian_1980_3_Degree_GK_CM_93E
2377Xian_1980_3_Degree_GK_CM_96E
2378Xian_1980_3_Degree_GK_CM_99E
2379Xian_1980_3_Degree_GK_CM_102E
2380Xian_1980_3_Degree_GK_CM_105E
2381Xian_1980_3_Degree_GK_CM_108E
2382Xian_1980_3_Degree_GK_CM_111E
2383Xian_1980_3_Degree_GK_CM_114E
2384Xian_1980_3_Degree_GK_CM_117E
2385Xian_1980_3_Degree_GK_CM_120E
2386Xian_1980_3_Degree_GK_CM_123E
2387Xian_1980_3_Degree_GK_CM_126E
2388Xian_1980_3_Degree_GK_CM_129E
2389Xian_1980_3_Degree_GK_CM_132E
2390Xian_1980_3_Degree_GK_CM_135E
2401Beijing_1954_3_Degree_GK_Zone_25
2402Beijing_1954_3_Degree_GK_Zone_26
2403Beijing_1954_3_Degree_GK_Zone_27
2404Beijing_1954_3_Degree_GK_Zone_28
2405Beijing_1954_3_Degree_GK_Zone_29
2406Beijing_1954_3_Degree_GK_Zone_30
2407Beijing_1954_3_Degree_GK_Zone_31
2408Beijing_1954_3_Degree_GK_Zone_32
2409Beijing_1954_3_Degree_GK_Zone_33
2410Beijing_1954_3_Degree_GK_Zone_34
2411Beijing_1954_3_Degree_GK_Zone_35
2412Beijing_1954_3_Degree_GK_Zone_36
2413Beijing_1954_3_Degree_GK_Zone_37
2414Beijing_1954_3_Degree_GK_Zone_38
2415Beijing_1954_3_Degree_GK_Zone_39
2416Beijing_1954_3_Degree_GK_Zone_40
2417Beijing_1954_3_Degree_GK_Zone_41
2418Beijing_1954_3_Degree_GK_Zone_42
2419Beijing_1954_3_Degree_GK_Zone_43
2420Beijing_1954_3_Degree_GK_Zone_44
2421Beijing_1954_3_Degree_GK_Zone_45
2422Beijing_1954_3_Degree_GK_CM_75E
2423Beijing_1954_3_Degree_GK_CM_78E
2424Beijing_1954_3_Degree_GK_CM_81E
2425Beijing_1954_3_Degree_GK_CM_84E
2426Beijing_1954_3_Degree_GK_CM_87E
2427Beijing_1954_3_Degree_GK_CM_90E
2428Beijing_1954_3_Degree_GK_CM_93E
2429Beijing_1954_3_Degree_GK_CM_96E
2430Beijing_1954_3_Degree_GK_CM_99E
2431Beijing_1954_3_Degree_GK_CM_102E
2432Beijing_1954_3_Degree_GK_CM_105E
2433Beijing_1954_3_Degree_GK_CM_108E
2434Beijing_1954_3_Degree_GK_CM_111E
2435Beijing_1954_3_Degree_GK_CM_114E
2436Beijing_1954_3_Degree_GK_CM_117E
2437Beijing_1954_3_Degree_GK_CM_120E
2438Beijing_1954_3_Degree_GK_CM_123E
2439Beijing_1954_3_Degree_GK_CM_126E
2440Beijing_1954_3_Degree_GK_CM_129E
2441Beijing_1954_3_Degree_GK_CM_132E
2442Beijing_1954_3_Degree_GK_CM_135E
21413Beijing_1954_GK_Zone_13
21414Beijing_1954_GK_Zone_14
21415Beijing_1954_GK_Zone_15
21416Beijing_1954_GK_Zone_16
21417Beijing_1954_GK_Zone_17
21418Beijing_1954_GK_Zone_18
21419Beijing_1954_GK_Zone_19
21420Beijing_1954_GK_Zone_20
21421Beijing_1954_GK_Zone_21
21422Beijing_1954_GK_Zone_22
21423Beijing_1954_GK_Zone_23
21473Beijing_1954_GK_Zone_13N
21474Beijing_1954_GK_Zone_14N
21475Beijing_1954_GK_Zone_15N
21476Beijing_1954_GK_Zone_16N
21477Beijing_1954_GK_Zone_17N
21478Beijing_1954_GK_Zone_18N
21479Beijing_1954_GK_Zone_19N
21480Beijing_1954_GK_Zone_20N
21481Beijing_1954_GK_Zone_21N
21482Beijing_1954_GK_Zone_22N
21483Beijing_1954_GK_Zone_23N
3395WGS_1984_World_Mercator

EPSG:3857与EPSG:900913

EPSG:3857与EPSG:900913等效

扫描下方二维码,关注微信公众号,精彩内容同步更新,有问题可随时交流
微信公众号

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值