使用 PostGIS 找尋那些點位於多邊形裡

PostGIS 是一個開源程式,它為物件-關係型資料庫PostgreSQL提供了儲存空間地理資料的支援,使PostgreSQL成為了一個空間資料庫,能夠進行空間資料管理、數量測量與幾何拓撲分析。PostGIS 實現了Open Geospatial Consortium所提出的基本要素類(點、線、面、多點、多線、多面等)的SQL實現參考。(資料來源:維基百科

需求:如何有一個城市或是一個區域的多點坐標,我如何找出在這些區塊裡有的景點、飯店等資料呢?

如何安裝PostGIS 這裡我就不多說,最快的方式去Docker Repository 上找個 Docker Image 就可以立馬開始測試了。

  1. 首先我們先建立一個地區的表格
CREATE TABLE place_test
(
  cid character varying(100) PRIMARY KEY,
  cid_name character varying(500),
  the_geom_polygon geography(polygon),
  the_geom_center geography
 )

the_geom_polygon 的形態是用 geography(polygon) 表示內容為多邊形的geography
the_geom_center 則是一點坐標點

  1. 新增一個地區的多邊形資料,這裡我新增一個 Ozark 區域的多邊形經緯度,你必須用PostGIS 的函式把坐標轉換成
INSERT INTO place_test VALUES ('Ozark','Ozark',
ST_GeogFromText('POLYGON((-93.233393 37.028373,-93.194201 37.028041,-93.192648 37.001514,-93.23247 37.002062,-93.233393 37.028373))'),
ST_POINT(-93.20526, 37.020943)
);
  1. 透過語法來判斷一個經緯度是不是有符合在多邊形裡
--符合的點
SELECT  * from place_test
WHERE   ST_INTERSECTS(ST_POINT(-93.20526, 37.020943), the_geom_polygon)
--不符合的點
SELECT  * from place_test
WHERE   ST_INTERSECTS(ST_POINT(-104.660908, 38.2672246), the_geom_polygon)

透過上面簡單的測試相信上述的需求應該不難解決了吧。

參考資料:http://www.vertabelo.com/blog/technical-articles/getting-started-with-postgis-your-first-steps-with-the-geography-data-type

補充資料:
Geometry:平面坐標系,计算出的二點間距離,距離單位是度(degree)
Geography:地理坐標系,SRID-4326计算出的二點間,距離單位是公尺(meter)
我們可以透過 ST_Distance 來計算二點距,所以透過這個公式,我們可以輕易找出你現在附近有什麼景點、餐廳的應用。
ex:


SELECT ST_Distance(
  ST_GeomFromText('POINT(-104.660908,35.2672246)'),
  ST_GeomFromText('POINT(-102.660908,38.2672246)')
);
SELECT ST_Distance(
  ST_GeogFromText('POINT(-104.660908,35.2672246)'),
  ST_GeogFromText('POINT(-102.660908,38.2672246)')
);

以上二個查詢的結果幾乎是不一樣,為什麼呢?因為回傳的單位是不同的。
另外透過 Google Maps 查詢經緯度的結果,它返回的是 (lat, lon) ,但 PostGIS 要求的是 (lon lat),所以使用上時要特別注意。

Related Posts

發佈留言