Ich möchte ST_DWithin für Daten verwenden, die in der SRID-Geometrie von 4326 gespeichert sind, und Meter als Abstandsparameter verwenden. Ist es effizienter, einen Cast (z. B. data.geom :: geography) oder eine Transformation in eine SRID mit Einheiten von Metern (z. B. ST_Transform (geom, 3857)) durchzuführen? Oder auch nicht?
postgis
coordinate-system
st-dwithin
kingzing1
quelle
quelle
Antworten:
Wie beschrieben lautet die Antwort aus folgenden Gründen "weder":
ST_DWithin(geom::geography, %anothergeom, %radius)
. Da es sich um eine Geografie handelt, sucht das System nach einem Geografieindex (der auf einer Kugel und nicht auf einer Ebene erstellt wird) und findet keinen. Da es keinen Index hat, führt es den Join mit vollständigen Scans der Tabelle (n) durch. Es wird langsam sein.ST_DWithin(ST_Transform(geom, 2163), %anothergeom, %radius)
. Ihre Tests richten sich nicht gegen die indizierte Spalte (geom), sondern gegen eine Funktion, die auf die Spalte (ST_Transform(geom,2163)
) angewendet wird. Daher wird Ihr räumlicher Index nicht verwendet. Es wird langsam sein.Sie müssen Ihre Abfrage und Ihren Index harmonisieren. Wenn Sie die Projektion Ihrer Daten nicht ändern möchten, müssen Sie einen Funktionsindex verwenden. Wenn Sie beispielsweise einen Funktionsgeografieindex erstellen, können Sie eine geografiebasierte Abfrage verwenden:
Oder im Transformationsfall:
Die absolut schnellste Leistung wird erzielt, wenn Sie die Daten in Ihrer Tabelle in eine planare Projektion (wie EPSG: 2163 ) konvertieren , einen räumlichen Index erstellen und dann
ST_DWithin()
für das Ergebnis verwenden.quelle