postGIS 多边形内的点

Sar*_*ohn 1 postgresql geometry postgis intersection

我正在使用 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, ...)
Run Code Online (Sandbox Code Playgroud)

我试图找到每个点位于哪个多边形内。我最有可能寻找的答案列出了点及其包含的多边形,例如:

观点 多边形
P1 多边形3
P2 多边形1

我尝试过以下内容:

SELECT *
FROM area, points 
WHERE st_intersects(area.polygons, points.point) ;
Run Code Online (Sandbox Code Playgroud)

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

非常感谢您的帮助。

Zeg*_*rek 5

为什么会出现错误:

您无法比较不同空间参考系统中的几何图形,因此您需要转换其中一列以匹配另一列的 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))
Run Code Online (Sandbox Code Playgroud)

性能和可用性

上面的方法会表现得很差,无法使用索引。假如说:

  1. 您的数据是静态的,这意味着您只需导入一次数据即可执行操作。这与系统形成鲜明对比,在系统中维护新几何图形的传入流。
  2. 您计划执行更多涉及这两个或更多表的操作。
  3. 您知道您感兴趣的区域(特定城市、国家、大陆)。

在每个表上构建一个单独的列,或者仅保留已经转换的数据版本,所有这些都在一个参考系统中是有意义的。

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);
Run Code Online (Sandbox Code Playgroud)

如果您负担得起,您可以保留原始列作为参考 - SRS 转换并不总是完全无损,因此最好保留原始数据。