Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wählen Sie alle Geodatenpunkte innerhalb eines Begrenzungsrahmens aus

Vermutlich die x- und y-Elemente in Ihren POINT-Daten in Ihrer geometry Spalte ist in Breiten- und Längengrad.

Um diese Suche in MySQL effizient durchzuführen, benötigen Sie einige Dinge.

  • Eine MyISAM-Tabelle (oder MySQL Version 5.7 und höher und entweder InnoDB oder MyISAM)
  • Eine NOT NULL-Qualifikation in Ihrer Geometriespalte
  • Ein räumlicher Index ALTER TABLE flags ADD SPATIAL INDEX (coordinates)
  • Code zum Erstellen einer Textdarstellung des zu durchsuchenden Rechtecks
  • Verwendung der Funktionen GeomFromText und MBRContains / MBRWithin in Ihrer SELECT-Anweisung.

Angenommen, Ihr Lat/Long-Feld ist ein Rechteck mit einer Ausdehnung von einem Grad, das um Kathedrale von Winchester (51.0606, -1.3131) . Sie benötigen einen Begrenzungsrahmen um diesen Punkt. Diese MySQL-Abfrage generiert einen LINESTRING (Text) für eine Linie, die diagonal über diesen Begrenzungsrahmen verläuft.

SELECT 
       CONCAT('LINESTRING(',
              latitude-0.5,' ',longitude-0.5,
              ',', 
              latitude+0.5 ,' ',longitude +0.5,
              ')') AS box
   FROM (
      SELECT 51.0606 AS latitude, -1.3131 AS longitude
   ) AS coord

Die Abfrage liefert Folgendes:

LINESTRING(50.5606 -1.8131,51.5606 -0.8131)

Sie können auch die Zeichenfolgenverarbeitung in einer Hostsprache verwenden, um eine ähnliche Art von Textzeichenfolge zu erhalten. Das Format, das Sie benötigen, ist dieses.

 LINESTRING(lat1 long1, lat2 long2) 

Dann können Sie damit Ihre räumliche Tabelle wie folgt durchsuchen:

SELECT whatever, whatever 
  FROM flags
 WHERE MBRContains(
        GeomFromText( 'LINESTRING(50.5606 -1.8131,51.5606 -0.8131)' ),
        flags.coordinates)     

Dadurch wird der räumliche Index ausgenutzt und jede Reihe von flags gefunden dessen Koordinaten innerhalb des Begrenzungsrahmens dieser diagonalen Linie liegen.

Hier ist einige Dokumentation .

Wenn Ihr flags Tabelle weniger als ein paar Hunderttausend Zeilen enthält, stellen Sie möglicherweise fest, dass eine gewöhnliche Tabelle (keine räumliche Tabelle) mit Breiten- und Längengradspalten (FLOAT-Datentypen, indiziert) genauso gut funktioniert und einfacher zu entwickeln und zu debuggen ist.

Ich habe ein Tutorial zu dieser Technik geschrieben. http://www.plumislandmedia.net/mysql/haversine-mysql- nächster-ort/