我试图弄清楚如何创建一个查询,该查询要求多边形内的点。 我的设置是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需要两个几何作为参数,但如何针对完整列执行查询?
答案 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_position
和message_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空间索引加快速度。