簡體   English   中英

多邊形內的 postGIS 點

[英]postGIS Points within polygons

我正在使用 postgres/postGIS 我有兩個表我有興趣查詢:

 table A: contains geometry values as (POINT)  such as (P1, P2,P3,...) 
 table B: contains geometry values as (POLYGON) such as (Polygon 1, polygon 2, ...)

我試圖找到每個點位於哪個多邊形內。 我最有可能尋找的答案列出了它包含的點和多邊形,例如:

觀點 多邊形
P1 多邊形 3
P2 多邊形 1

我嘗試的是以下內容:

SELECT *
FROM area, points 
WHERE st_intersects(area.polygons, points.point) ;

我收到以下錯誤: ERROR: ST_Intersects: Operation on mixed SRID geometries (Polygon, 4326),= (Point, 8307)

非常感謝您的幫助。

如上一個答案所述,您無法執行涉及以不同 SRS 編碼的幾何圖形的空間操作。 換句話說,您必須使用ST_Transform ,例如

SELECT * FROM area a
JOIN points p ON ST_Contains(a.polygons, ST_Transform(p.point,4326));

關於索引的觀察也很好。 但是,您不一定需要創建更多列才能在不同的 SRS 中使用空間索引。 這意味着您需要 1) 復制列,這取決於幾何大小可能會變得非常昂貴,並且 2) 需要大量開銷來保持兩列同步。 您需要創建一個單獨的索引,該索引采用先前轉換的坐標,以便在查詢時不需要這樣做:

CREATE INDEX idx_points_geom_4326 ON points USING gist (ST_Transform(point,4326));

演示: db<>fiddle - 請注意Index Scan using idx_points_geom_4326 on points p

EXPLAIN ANALYSE
SELECT * FROM area a
JOIN points p ON ST_Contains(a.polygons, ST_Transform(p.point,4326));

                                                               QUERY PLAN                                                               
----------------------------------------------------------------------------------------------------------------------------------------
 Nested Loop  (cost=0.14..59.18 rows=1 width=64) (actual time=0.036..0.175 rows=94 loops=1)
   ->  Seq Scan on area a  (cost=0.00..1.01 rows=1 width=32) (actual time=0.004..0.005 rows=1 loops=1)
   ->  Index Scan using idx_points_geom_4326 on points p  (cost=0.14..58.16 rows=1 width=32) (actual time=0.029..0.161 rows=94 loops=1)
         Index Cond: (st_transform(point, 4326) @ a.polygons)
         Filter: st_contains(a.polygons, st_transform(point, 4326))
 Planning Time: 0.064 ms
 Execution Time: 0.193 ms

您無法比較不同空間參考系統中的幾何圖形,因此您需要轉換其中一列以匹配另一列的 SRID。 您可以即時解決此問題:

SELECT *
FROM area, points 
WHERE st_intersects(area.polygons, st_transform(points.point,4326));
--or, dynamically: st_transform(points.point,st_srid(area.polygons))

但這將表現不佳,無法使用索引。 因此,您可以制作一個版本的point列,將點轉換為 4326。

alter table points add column point_4326 geometry;
update points set point_4326=st_transform(point,4326);
create index on area using gist(polygons);
create index on points using gist(point_4326);

SELECT *
FROM area, points 
WHERE st_intersects(area.polygons, points.point_4326);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM