我有一个有效的查询,但想知道是否有一个我可以使用的更快的钝角形式。我已经在我的几何体周围创建了一个边界框来缩小搜索范围,但是对ST_Transforms的多次调用似乎很尴尬。 BTW:两条线(gg和gm)具有相同的点。
提前致谢,
-Matt
CREATE TABLE lines
(
line_id bigserial NOT NULL,
line_gm_bbox geometry,
line_gm_line geometry,
line_gg_line geography(LineString,4326),
)
WITH ( OIDS=FALSE );
CREATE INDEX line_bbox_idx
ON lines
USING gist
(line_gm_bbox );
SELECT l.* FROM lines AS l WHERE l.line_gm_bbox && ST_Transform( ST_Buffer( ST_Transform( ST_GeomFromText('POINT(-71.44513306666667 42.7368536)',4326),3395 ), 2000 ), 4326 )
AND ST_DWithin( l.line_gg_line, ST_GeomFromText('POINT(-71.44513306666667 42.7368536)',4326), 200);
答案 0 :(得分:1)
在ST_Buffer
中使用WHERE
的费用很高,因为在过滤之前需要缓冲几何所有。仅使用ST_DWithin
获得相同的效果。
此外,lines
表架构 overkill 。您只需要一个地理列,无需转换为查询度量标准距离。边界框应该在技术上存储在gist索引中,否则可以提取到box type,如果您出于某种目的需要它。大多数时候你不需要关心,只要有gist索引就可以了。
将lines
表重新定义为更简单的架构:
CREATE TABLE lines
(
gid bigserial primary key,
geog geography(LineString,4326)
);
CREATE INDEX ON lines USING gist (geog);
如果您尝试查询感兴趣点200米范围内的所有行,请将查询简化为:
SELECT l.*
FROM lines AS l
WHERE ST_DWithin(l.geog, ST_MakePoint(-71.44513306666667, 42.7368536), 200);