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
Freigeben: 2025-01-06 12:44:41
Original
491 Leute haben es durchsucht

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)
Nach dem Login kopieren

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
Nach dem Login kopieren

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!

Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage