找到圓心 POINT(1000 1000) 100米範圍內的查詢以下:算法
SELECT * FROM geotable WHERE ST_DWithin(geocolumn, ‘POINT(1000 1000)’, 100.0);
又或者你須要的是矩形檢索:ST_MakeBox2D(geometry pointLowLeft, geometry pointUpRight);函數
SELECT feature_id, feature_name, the_geom FROM features WHERE the_geom && ST_SetSRID(ST_MakeBox2D(ST_Point(-989502.1875, 528439.5625), ST_Point(-987121.375 ,529933.1875)),2163)
如下是詳細的解釋:post
在地圖中一個任意經,緯度下點擊.想要找到以這個點爲中心指定半徑下包含多少個興趣點.spa
查看postgis手冊找到了這麼一個函數(ST_Distance(geometry g1, geometry g2);)code
官方文檔上是這麼說的:orm
ST_Distance — For geometry type Returns the 2-dimensional cartesian minimum distance (based on spatial ref) between two geometries in projected units. For geography type defaults to return spheroidal minimum distance between two geographies in meters.ci
即給定兩個空間點計算兩點間的距離.計算結果的單位與你的空間數據的參考系有關.文檔
若是你使用的是4326(wgs84)這個座標系的話他是以度爲單位的.要想轉成米爲單位的話還得作一下轉換.下面會提到:it
GEOCS表明的是地理座標系,也就是以經緯度表示的座標系統,例如4326
PROJCS表明的投影座標系,它是經過一種算法把球面座標系轉成平面座標系,以便計算,通常是以米爲單位表示, 例如26986
所以,在求兩點之間的距離時,因爲存的數據都是經緯度,所以它參考的是GEOCS,要想獲得以米爲單位的結果,首先要把它轉成PROJCS,能夠經過ST_Transform來實現io
查看postgis手冊 geometry ST_Transform(geometry g1, integer srid);
第一個參數是原來的幾何對像. 第二個參數爲要把他轉換到這個投影所表明的作標系下.
這時咱們只要找一個單位是米的投影作標系把他轉換過去就行了
例:
SELECT ST_Distance(
ST_Transform(ST_GeomFromText('POINT(-87.734087560562 43.770129071141)',4326),26986),
ST_Transform(ST_GeomFromText('POINT(-87.747382933006 43.759234252055)', 4326),26986)
);
這個查出來的結果便是以米爲單位的兩點間的距離了
如今在說如何查找必定範圍內的點
這裏用到了postgis裏的這第一個函數:boolean ST_DWithin(geometry g1, geometry g2, double precision distance_of_srid);
第一個參數爲參考對像.第二個參數爲目標對像.第三個參數爲距離(一樣若是是地理座標系單位是度.投影作標系單位是米)
即以g1爲中心,半徑爲distance_of_srid,這個範圍內包不包含g2,若是包含反回true,不然即爲假
下面給一個完整的例子.查找以(-87.71 43.741)爲中心半徑1516米範圍內的興趣點,以後按與這個中心點由近到遠的順序排列結果
SELECT t.feat_id,astext(t.geometry) FROM gis_site t
WHERE ST_DWithin(
ST_Transform(GeomFromText('POINT(-87.71 43.741)',4326),26986),
ST_Transform(t.geometry,26986),
1516)
ORDER BY ST_Distance(GeomFromText('POINT(-87.71 43.741)',4326), t.geometry);
結果:
24;"POINT(-87.718330082111 43.753078987035)"
17;"POINT(-87.726085716036 43.736952192682)"
18;"POINT(-87.726085716036 43.736952192682)"
找到了三個點