PostGIS ST_Buffer Radius-Hilfe

9

Ich versuche, alle Punkte innerhalb eines Radius von fünf Meilen um einen bestimmten Punkt zu finden. Ich habe eine Frage wie diese:

SELECT * FROM table WHERE ST_Contains(ST_Buffer(geomFromText('POINT(0 0)', 4326), ?), latlon)

Ich kann nicht herausfinden, was ich anstelle von ?(Radius) gesetzt habe, um fünf Meilen zu bekommen. Alles ist in EPSG 4326 enthalten, und laut PostGIS-Dokumentation (soweit ich das beurteilen kann) sollte mein Radius in Metern angegeben werden. Wenn ich 12.070,0 m (ungefähr 5 Meilen) einsetze, bekomme ich Streichhölzer auf halber Strecke im ganzen Land. Weiß jemand was ich vermisse?

Nik
quelle
4326 ist dd (Dezimalgrad). 12070 ist ein ziemlich großes Gebiet (Radius), wenn es als Latlon projiziert wird.
Brad Nesom
1
falsch - 12 070 Meter = 7,49995029 Meilen, also 5 Meilen sind 8046,72 Meter, also (? = 8046,72) - ist Ihre Daten geografisch oder geometrisch?
Mapperz

Antworten:

14

Da Ihre Daten nicht projiziert werden - es handelt sich um Punkte auf einem Sphäroid - sind lineare Abstände irgendwie nicht sinnvoll. Fünf Meilen am Äquator sind ein viel kleinerer Winkel als fünf Meilen am Polarkreis. Glücklicherweise hat PostGIS (> = 1,5) die Antwort, nach der Sie suchen:

SELECT * FROM table WHERE ST_DWithin(ST_GeogFromText('SRID=4326;POINT(0,0)'), geography(latlon), 12070);

Es hat einen geographyTyp, der genau für diese Art von Dingen entwickelt wurde. Es ähnelt der Geometrie, verwendet jedoch immer nur EPSG: 4326, und es gibt weitaus weniger Funktionen, die damit arbeiten.

Im obigen Beispiel habe ich ST_GeogFromText () aufgerufen (es gibt auch einen ST_GeographyFromText () , und ich bin nicht sicher, ob es einen Unterschied gibt), was den interessierenden Punkt betrifft (dies könnte mit regulärem WKT funktionieren, da der SRID-Parameter lautet redundant) und gießen Sie die Latlon-Säule auf den geografischen Typ. Wenn Sie viele davon ausführen, kann es effizienter sein, eine Geografiespalte in Ihrer Tabelle zu erstellen und die Besetzung vollständig zu überspringen. Schließlich kann ST_DWithin () Geografieparameter annehmen und macht mit linearen Entfernungen das Richtige.

MerseyViking
quelle
Ich schätze die Hilfe. Ich bin noch ziemlich neu bei PostGIS.
Nik
4

Vielleicht möchten Sie stattdessen die Funktion ST_DWithin. Siehe Hinweis im Dokument st_buffer.
ST_Buffer

Menschen machen oft den Fehler, diese Funktion zu verwenden, um Radius-Suchen durchzuführen. Das Erstellen eines Puffers für eine Radius-Suche ist langsam und sinnlos. Verwenden Sie stattdessen ST_DWithin .

Brad Nesom
quelle