0

機能するクエリがありますが、使用できるより高速で鈍感でないフォームがあるかどうか疑問に思っています。検索を絞り込むためにジオメトリの周囲にバウンディング ボックスを作成しましたが、ST_Transforms を複数回呼び出すのは面倒です。ところで: 2 つの線 (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_Bufferinを使用すると、フィルタリングする前にすべてWHEREのジオメトリをバッファリングする必要があるため、コストがかかります。同じ効果のためにのみ使用してください。ST_DWithin

さらに、linesテーブルのスキーマはやり過ぎです。メトリック距離を照会するために変換する必要のない地理列が 1 つだけ必要です。バウンディング ボックスは、技術的には 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 に答える