【问题标题】:POSTGIS SELECT optmizationPOSTGIS SELECT 优化
【发布时间】:2013-01-03 08:16:06
【问题描述】:

我有一个可以使用的查询,但想知道是否有更快更不钝的形式可以使用。我已经在我的几何图形周围创建了一个边界框来缩小搜索范围,但是对 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);

【问题讨论】:

    标签: postgresql postgis postgresql-9.1


    【解决方案1】:

    WHERE 中使用ST_Buffer 成本很高,因为它需要在过滤之前缓冲所有 几何体。仅使用 ST_DWithin 即可获得相同的效果。

    此外,lines 表架构矫枉过正。您只需要一个地理列,不需要转换为查询公制距离。从技术上讲,边界框应存储在 gist 索引中,但如果出于某种目的需要,可以将其提取到 box type 中。大多数时候你不需要关心,只要有要点索引。

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

    【讨论】:

      猜你喜欢
      • 2015-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-27
      • 2013-02-18
      • 2011-12-01
      • 1970-01-01
      • 2011-12-15
      相关资源
      最近更新 更多