Heim >Datenbank >MySQL-Tutorial >Wie kann man Gebäude im Umkreis von 5 Meilen um gegebene Koordinaten effizient abrufen?

Wie kann man Gebäude im Umkreis von 5 Meilen um gegebene Koordinaten effizient abrufen?

Barbara Streisand
Barbara StreisandOriginal
2025-01-09 11:47:42188Durchsuche

How to Efficiently Retrieve Buildings within 5 Miles of Given Coordinates?

Ortung von Gebäuden im Umkreis von 5 Meilen: Eine raumbezogene Lösung

Dieser Artikel befasst sich mit der häufigen Herausforderung, alle Gebäude innerhalb eines 5-Meilen-Radius um bestimmte Koordinaten zu identifizieren. Wir stellen eine leistungsstarke Lösung für diese räumliche Abfrage vor.

Szenario:

Stellen Sie sich eine Datenbanktabelle „Gebäude“ mit den Spalten „Name“, „Breitengrad“ („lat“) und „Längengrad“ („lng“) vor. Der Standort jedes Gebäudes wird durch seinen Breiten- und Längengrad definiert.

Das Problem:

Das Ziel besteht darin, alle Gebäude im Umkreis von 5 Meilen um ein bestimmtes Koordinatenpaar abzurufen, zum Beispiel: -84.38653999999998, 33.72024.

Ineffiziente Ansätze:

Die Verwendung von Funktionen wie ST_CONTAINS mit separat gespeicherten Breiten- und Längengradwerten ist ineffizient. Dieser Ansatz führt zu einem erheblichen Mehraufwand bei der Abfrageverarbeitung.

Optimale Lösung: Nutzung räumlicher Datentypen

Für eine optimale Leistung speichern Sie Koordinaten als Geometrie- oder Geografie-Datentypen. Dies vereinfacht die Entfernungsberechnung erheblich. Wir demonstrieren die Verwendung von PostGIS-Funktionen.

Effiziente Methoden: ST_DWithin und ST_Distance

PostGIS bietet leistungsstarke räumliche Funktionen für effiziente Entfernungsberechnungen. So verwenden Sie ST_DWithin und ST_Distance:

Verwendung von ST_DWithin (Boolesches Ergebnis):

ST_DWithin gibt einen booleschen Wert zurück, der angibt, ob Geometrien innerhalb eines angegebenen Abstands liegen.

<code class="language-sql">SELECT name, lng, lat,
  ST_Distance('POINT(-4.6314 54.0887)'::geography,
              ST_MakePoint(lng,lat)::geography) * 0.000621371 AS distance
FROM building
WHERE
  ST_DWithin('POINT(-4.6314 54.0887)'::geography,
              ST_MakePoint(lng,lat)::geography, 8046.72); -- 8046.72 meters = 5 miles</code>

Mit ST_Distance (Entfernung in Meilen):

ST_Distance gibt die Entfernung in Metern zurück. Wir rechnen mithilfe des Umrechnungsfaktors in Meilen um.

<code class="language-sql">SELECT name, lng, lat,
  ST_Distance('POINT(-4.6314 54.0887)'::geography,
              ST_MakePoint(lng,lat)::geography) * 0.000621371 AS distance
FROM building
WHERE 
  ST_Distance('POINT(-4.6314 54.0887)'::geography,
              ST_MakePoint(lng,lat)::geography) * 0.000621371 <= 5;</code>

Durch die Verwendung dieser räumlichen Funktionen und die entsprechende Speicherung von Koordinaten erreichen Sie eine genaue und effiziente Abfrage von Gebäuden in einem Umkreis von 5 Meilen, was für effektive Geodatenanwendungen von entscheidender Bedeutung ist. Denken Sie daran, (-4.6314, 54.0887) durch Ihre tatsächlichen Koordinaten zu ersetzen.

Das obige ist der detaillierte Inhalt vonWie kann man Gebäude im Umkreis von 5 Meilen um gegebene Koordinaten effizient 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