Heim >Datenbank >MySQL-Tutorial >Wie kann ich MySQL verwenden, um Punkte innerhalb eines bestimmten Breiten- und Längenradius zu finden?

Wie kann ich MySQL verwenden, um Punkte innerhalb eines bestimmten Breiten- und Längenradius zu finden?

Susan Sarandon
Susan SarandonOriginal
2025-01-06 12:44:41471Durchsuche

How Can I Use MySQL to Find Points Within a Given Radius of Latitude and Longitude?

Verwenden von MySQL Spatial Extensions zum Abrufen von Punkten innerhalb eines Kreises

Um räumliche Abfragen basierend auf Breiten- und Längengrad durchzuführen, ist die Erweiterung von MySQL um Geodatenfunktionen erforderlich. Es ist jedoch wichtig zu beachten, dass MySQL über integrierte räumliche Funktionen verfügt, die speziell für Entfernungsberechnungen mit diesen Koordinaten entwickelt wurden.

Stattdessen erfordern Näherungskreise auf der Erdoberfläche die Verwendung der Großkreisentfernung Formel, die mithilfe des Haversinus oder anderer geeigneter Algorithmen implementiert werden kann. MySQL 5.6 bietet eine undokumentierte Funktion st_distance(p1, p2), die kartesische Abstände innerhalb planarer Formen berechnet. Diese ist jedoch aufgrund der durch kartesische Abstände verursachten Verzerrungen für Breiten- und Längengrad-basierte Berechnungen ungeeignet.

Für eine praktische Anwendung können Sie eine Abfrage in Betracht ziehen, um alle Flaggen innerhalb von zehn Meilen um einen bestimmten Breiten-/Längengrad zu finden Punkt:

SELECT id, coordinates, name, r,
        units * DEGREES(ACOS(LEAST(1.0, COS(RADIANS(latpoint))
                  * COS(RADIANS(latitude))
                  * COS(RADIANS(longpoint) - RADIANS(longitude))
                  + SIN(RADIANS(latpoint))
                  * SIN(RADIANS(latitude))))) AS distance
   FROM flags
   JOIN (
        SELECT 42.81  AS latpoint,  -70.81 AS longpoint, 
               10.0 AS r, 69.0 AS units
        ) AS p ON (1=1)
  WHERE MbrContains(GeomFromText (
        CONCAT('LINESTRING(',
              latpoint-(r/units),' ',
              longpoint-(r /(units* COS(RADIANS(latpoint)))),
              ',', 
              latpoint+(r/units) ,' ',
              longpoint+(r /(units * COS(RADIANS(latpoint)))),
              ')')),  coordinates)

In dieser Abfrage:

  • Latpoint und Longpoint stellen den Breiten- und Längengrad des Standorts des Benutzers dar.
  • r ist der Suchradius in Meilen .
  • Einheiten stellen die Entfernungseinheiten pro Breitengrad auf der Erdoberfläche dar (z. B. 69 Meilen für Meilen oder 111,045 km für Kilometer).
  • MbrContains schließt Punkte aus, die definitiv außerhalb des Suchbereichs liegen, basierend auf einem umgrenzenden Rechteck.
  • Die Great Circle Distance-Formel berechnet den Abstand zwischen Punkten.

Um die Ergebnisse auf Punkte innerhalb des Kreises zu beschränken und sie nach Nähe zu sortieren, schließen Sie die Abfrage in eine andere ein Abfrage:

SELECT id, coordinates, name
   FROM (
         /* the above query, pasted in here */
        ) AS d
  WHERE d.distance <= d.r
  ORDER BY d.distance ASC

Das obige ist der detaillierte Inhalt vonWie kann ich MySQL verwenden, um Punkte innerhalb eines bestimmten Breiten- und Längenradius zu finden?. 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