0

我有一个有效的查询,但想知道是否有更快更不钝的形式可以使用。我已经在我的几何图形周围创建了一个边界框来缩小搜索范围,但是对 ST_Transforms 的多次调用似乎很尴尬。顺便说一句:两条线(gg 和 gm)具有相同的点。

在此先感谢,-
马特

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);
4

1 回答 1

1

使用ST_BufferinWHERE很昂贵,因为它需要在过滤之前缓冲所有几何图形。仅ST_DWithin用于相同的效果。

此外,lines表模式是矫枉过正的。您只需要一个地理列,不需要转换为查询公制距离。边界框在技术上应该存储在 gist 索引中,但如果您出于某种目的需要它,可以将其提取为框类型。大多数时候你不需要关心,只要 gist 索引在那里。

将表重新定义lines为更简单的模式:

CREATE TABLE lines
(
  gid bigserial primary key,
  geog geography(LineString,4326)
);
CREATE INDEX ON lines USING gist (geog);

如果您尝试查询兴趣点 200 m 内的所有线,请将查询简化为:

SELECT l.*
FROM lines AS l
WHERE ST_DWithin(l.geog, ST_MakePoint(-71.44513306666667, 42.7368536), 200);
于 2013-01-20T22:39:48.893 回答