Heim >Datenbank >MySQL-Tutorial >Wie kann man mithilfe von PostGIS effizient Gebäude innerhalb eines bestimmten Umkreises abrufen?
Effizientes Finden von Gebäuden innerhalb eines bestimmten Umkreises mit PostGIS
Diese Anleitung zeigt, wie Sie mit PostGIS alle Gebäude innerhalb eines bestimmten Umkreises abrufen, vorausgesetzt, Ihre Datenbanktabelle „Gebäude“ enthält die Spalten „name“, „lat“ und „lng“. Nehmen wir an, Sie müssen alle Gebäude im Umkreis von 5 Meilen um die Koordinaten (-84,38653999999998, 33,72024) finden.
Optimierung der räumlichen Datenspeicherung
Es ist wichtig zu verstehen, dass das Speichern von Breiten- und Längengraden in separaten Spalten ineffizient ist. Für eine optimale PostGIS-Leistung speichern Sie Ihre Koordinaten als Geometrie- oder Geografie-Datentyp. Dies vermeidet unnötige Konvertierungen bei Abfragen.
Nutzung von ST_DWithin und ST_Distance für Entfernungsberechnungen
PostGIS bietet zwei Hauptfunktionen für Entfernungsberechnungen: ST_DWithin
und ST_Distance
.
1. Verwendung von ST_DWithin für effiziente Radiussuchen:
ST_DWithin
prüft effizient, ob Geometrien innerhalb eines bestimmten Abstands liegen. Die folgende Abfrage verwendet ST_DWithin
, um Gebäude in einem Umkreis von 5 Meilen (ca. 8046,72 Meter) zu finden:
<code class="language-sql">SELECT name, long, lat FROM building WHERE ST_DWithin( ST_GeographyFromText('SRID=4326;POINT(-84.38653999999998 33.72024)'), ST_MakePoint(long, lat)::geography, 8046.72 -- Distance in meters );</code>
Beachten Sie die Verwendung von ST_GeographyFromText
und die Umwandlung von ST_MakePoint
in die Geographie für genaue Entfernungsberechnungen auf einer sphärischen Oberfläche. Die Verwendung von geography
wird im Allgemeinen gegenüber geometry
für geografische Koordinaten bevorzugt.
2. Verwenden von ST_Distance für detaillierte Entfernungsinformationen:
ST_Distance
berechnet den Abstand zwischen zwei Geometrien. Im Gegensatz zu ST_DWithin
profitiert es nicht von räumlichen Indizes und sollte für eine bessere Leistung in der SELECT-Klausel anstelle der WHERE-Klausel verwendet werden. Dieser Ansatz ist nützlich, wenn Sie die genaue Entfernung zu jedem Gebäude benötigen:
<code class="language-sql">SELECT name, long, lat, ST_Distance( ST_GeographyFromText('SRID=4326;POINT(-84.38653999999998 33.72024)'), ST_MakePoint(long, lat)::geography ) AS distance_meters FROM building ORDER BY distance_meters;</code>
Diese Abfrage gibt die Entfernung in Metern zurück. Sie können es in Meilen umrechnen, indem Sie es mit 0,000621371 multiplizieren.
Wichtiger Hinweis zu ST_MakePoint:
Denken Sie daran, dass ST_MakePoint
zuerst der Längengrad und dann der Breitengrad ermittelt wird. Eine falsche Reihenfolge führt zu ungenauen Ergebnissen. Überprüfen Sie immer Ihre Koordinatenreihenfolge. Die Verwendung des geografischen Datentyps ist für genaue Entfernungsberechnungen auf der Erdoberfläche von entscheidender Bedeutung.
Das obige ist der detaillierte Inhalt vonWie kann man mithilfe von PostGIS effizient Gebäude innerhalb eines bestimmten Umkreises abrufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!