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?
postgis
postgis-1.5
Nik
quelle
quelle
Antworten:
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:
Es hat einen
geography
Typ, 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.
quelle
Vielleicht möchten Sie stattdessen die Funktion ST_DWithin. Siehe Hinweis im Dokument st_buffer.
ST_Buffer
quelle