Heim >Datenbank >MySQL-Tutorial >Wie kann man mithilfe von PostGIS effizient Gebäude innerhalb eines bestimmten Umkreises abrufen?

Wie kann man mithilfe von PostGIS effizient Gebäude innerhalb eines bestimmten Umkreises abrufen?

DDD
DDDOriginal
2025-01-09 11:41:43895Durchsuche

How to Efficiently Retrieve Buildings within a Specified Radius Using PostGIS?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn