使用postgreSQL和PostGIS查询空间交集(点 - 列中的多边形)

时间:2016-05-17 20:14:28

标签: postgresql postgis

我试图弄清楚如何创建一个查询,该查询要求多边形内的点。 我的设置是postgreSQL 9.5实例,其中安装了PostGIS 2.2.2。 从理论上讲,这可能不是很困难,因为它显示在PostGIS documentation中,但我无法得到任何结果。

我创建了下表:

CREATE TABLE app_db.testTable
(
  message_text text,
  message_picture text,
  message_date timestamp with time zone DEFAULT now(),
  message_id uuid NOT NULL DEFAULT uuid_generate_v4(),
  message_position app_db.geometry,
  message_radius integer,
  message_circle app_db.geometry,
  message_userid uuid,
  CONSTRAINT messages_pkey PRIMARY KEY (message_id)
)

我使用以下命令为我的架构启用了PostGIS:

CREATE EXTENSION postgis SCHEMA app_db;

我在上面提到的表格中放了一些示例数据集。 到目前为止一切都很好。

我没有尝试创建一个查询,该查询应该询问所有数据,其中定义的点与我的表格列 app_db - >中存储的几何图形之一相交。 message.circle : 据我所知,ST_Intersects需要两个几何作为参数,但如何针对完整列执行查询?

1 个答案:

答案 0 :(得分:2)

请注意,通常人们会将postgis安装到public和/或在search_path上安装架构,因此您无需提供app_db.ST_Intersects等完整路径。对于下面的示例,我假设SET search_path TO app_db;使其更简单。

message_position中的单个多边形中选择message_circle中的所有点:

SELECT p.*
FROM testTable p
JOIN testTable c ON c.message_id='the id of the circle'
    AND p.message_id <> c.message_id
    AND ST_Intersects(p.message_position, c.message_circle);

我不确定message_circle是如何制作的,但如果它是从message_positionmessage_radius创建的,那么更好的方法是使用ST_DWithin,它使用SELECT p.* FROM testTable p JOIN testTable c ON c.message_id='the id of the circle' AND p.message_id <> c.message_id AND ST_DWithin(p.message_position, c.message_position, c.message_radius); 距离阈值,而不是更昂贵和不完美的几何分析。

message_position

可以通过在DECLARE @blah VARCHAR(100) -- SET @blah = '100 main' SET @blah = '100 main st' SELECT SUBSTRING(@blah, 1, CHARINDEX(' ', @blah)) AS col_E_Part1, SUBSTRING(@blah, CHARINDEX(' ', @blah) + 1, CASE WHEN CHARINDEX(' ', @blah, CHARINDEX(' ', @blah) + 1) - (CHARINDEX(' ', @blah) + 1) > 0 THEN CHARINDEX(' ', @blah, CHARINDEX(' ', @blah) + 1) - (CHARINDEX(' ', @blah) + 1) ELSE LEN(@blah) END) AS col_E_blah_Part2 上创建GiST空间索引加快速度。