ST_DWithin Calc Meters-変換またはキャスト?


9

4326のSRIDジオメトリに保存されているデータにST_DWithinを使用し、距離パラメーターとしてメートルを使用したいと思います。メートル単位のSRIDへのキャスト(例:data.geom :: geography)または変換(例:ST_Transform(geom、3857))を行う方が効率的ですか?それともどちらですか?


データはどの空間範囲ですか?
DPSSpatial '19

データは米国全体をカバーしています。
kingzing1 '19 / 12/16

インデックス付きデータは地理でない場合、ヤウド...その後のST_Distanceとキャストを使用して、ST_DWithin中度で近似したほうが良い
ヴィンス

私はアメリカ大陸のアルバースの等面積円錐に変換しようとします。これはメートル(メートル)だと思います...最初にいくつかの機能で試してみてください...そこから始めます...
DPSSpatial

「どちらが速いか試してみて」はどうですか?
Stophface 16

回答:


14

説明したように、答えは次の理由により「どちらでもない」です。

  • 4326で空間テーブルを取ります。その上に空間インデックスを作成します。空間インデックスは、4326のフィーチャの2D境界で構成される平面インデックスで、ツリー構造にソートされます。
  • (a)のようなキャストを使用して距離フィルタークエリを実行しますST_DWithin(geom::geography, %anothergeom, %radius)。地理が含まれているため、システムは地理インデックス(平面ではなく球体上に構築されている)を探し、何も検出しません。インデックスがないため、テーブルのフルスキャンを使用して結合を実行します。遅くなります。
  • (b)のような変換を使用して距離フィルタークエリを実行しますST_DWithin(ST_Transform(geom, 2163), %anothergeom, %radius)。テストは、インデックス付きの列(geom)に対してではなく、列(ST_Transform(geom,2163))に適用された関数に対して行われるため、空間インデックスは使用されません。遅くなります。

クエリとインデックスを調和させる必要があります。データの射影を変更したくない場合は、関数インデックスを使用する必要があります。たとえば、関数geographyインデックスを作成する場合は、地理ベースのクエリを使用できます。

CREATE INDEX mytable_geog_x 
  ON mytable USING GIST (geography(geom));

SELECT * 
  FROM mytable 
  WHERE ST_DWithin(geography(geom), %anothergeography, %radius);

または、変換の場合:

CREATE INDEX mytable_geog_x 
  ON mytable USING GIST (ST_Transform(geom, 2163));

SELECT * 
  FROM mytable 
  WHERE ST_DWithin(ST_Transform(geom, 2163), %another2163geometry, %radius);

絶対最速のパフォーマンスは、テーブル内のデータを平面投影(EPSG:2163など)に変換し、空間インデックスを作成ST_DWithin()して、その結果で使用する場合です。

ALTER TABLE mytable 
  ALTER COLUMN geom 
  TYPE Geometry(Point, 2163) 
  USING ST_Transform(geom, 2163);

CREATE INDEX mytable_geom_x ON mytable USING GIST (geom);

SELECT * 
  FROM mytable
  WHERE ST_DWithin(geom, %some2163geom, %radius)

このポールをありがとう。非常に役立つ-処理時間を大幅に短縮します。
kingzing1 2016

しかし、最後の2つのクエリは、後者が平面距離を計算する最初のクエリ、および前者の測地クエリと異なるのではないでしょうか。
Andre Silva

これは素晴らしい答えですが、混乱しているのは、ドキュメントと矛盾しているように思われる ことです。
オルシャンスク
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.