Mysql
 sql >> Database >  >> RDS >> Mysql

Seleziona tutti i punti geospaziali all'interno di un rettangolo di selezione

Presumibilmente gli elementi xey nei tuoi dati POINT nella tua geometry la colonna è in gradi di latitudine e longitudine.

Per eseguire questa ricerca in modo efficiente in MySQL, avrai bisogno di alcune cose.

  • Una tabella MyISAM (o MySQL versione 5.7 e successive e InnoDB o MyISAM)
  • Una qualifica NON NULL sulla colonna della geometria
  • Un indice spaziale ALTER TABLE flags ADD SPATIAL INDEX (coordinates)
  • Codice per creare una rappresentazione testuale del rettangolo che vuoi cercare
  • Utilizzo delle funzioni GeomFromText e MBRContains / MBRWithin nell'istruzione SELECT.

Supponiamo che il tuo box lat/long sia un rettangolo di estensione di un grado centrato su Cattedrale di Winchester (51.0606, -1.3131) . Hai bisogno di un rettangolo di selezione attorno a quel punto. Questa query MySQL genererà un LINESTRING (testo) per una linea che attraversa diagonalmente quel riquadro di delimitazione.

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

La query ti ottiene questo:

LINESTRING(50.5606 -1.8131,51.5606 -0.8131)

Puoi anche utilizzare l'elaborazione delle stringhe in una lingua host per ottenere un tipo simile di stringa di testo. Il formato che ti serve è questo.

 LINESTRING(lat1 long1, lat2 long2) 

Quindi puoi usarlo per cercare la tua tabella spaziale come segue:

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

Questo sfrutterà l'indice spaziale e troverà ogni riga di flags le cui coordinate si trovano all'interno del riquadro di delimitazione di quella linea diagonale.

Ecco alcuni documentazione .

Se i tuoi flags table contiene meno di poche centinaia di migliaia di righe, potresti scoprire che anche una tabella normale (non una tabella spaziale) con colonne di latitudine e longitudine (tipi di dati FLOAT, indicizzati) funziona ed è più facile da sviluppare ed eseguire il debug.

Ho scritto un tutorial su quella tecnica. http://www.plumislandmedia.net/mysql/harsine-mysql- loc-più vicino/