PostGIS實現圓形檢索和矩形檢索

找到圓心 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)"

找到了三個點

相關文章
相關標籤/搜索