sql >> Base de Datos >  >> RDS >> Mysql

Seleccione todos los puntos geoespaciales dentro de un cuadro delimitador

Presumiblemente, los elementos x e y en sus datos de PUNTO en su geometry la columna está en grados de latitud y longitud.

Para realizar esta búsqueda de manera eficiente en MySQL, necesitará algunas cosas.

  • Una tabla MyISAM (o MySQL versión 5.7 y posterior e InnoDB o MyISAM)
  • UNA calificación NOT NULL en su columna de geometría
  • Un índice espacial ALTER TABLE flags ADD SPATIAL INDEX (coordinates)
  • Código para crear una representación textual del rectángulo que desea buscar
  • Uso de las funciones GeomFromText y MBRContains / MBRWithin en su instrucción SELECT.

Suponga que su cuadro de latitud/longitud es un rectángulo de un grado de extensión centrado alrededor de Catedral de Winchester (51.0606, -1.3131) . Necesita un cuadro delimitador alrededor de ese punto. Esta consulta de MySQL generará un LINESTRING (texto) para una línea que cruza en diagonal ese cuadro delimitador.

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 consulta te da esto:

LINESTRING(50.5606 -1.8131,51.5606 -0.8131)

También puede utilizar el procesamiento de cadenas en un idioma anfitrión para generar un tipo similar de cadena de texto. El formato que necesitas es este.

 LINESTRING(lat1 long1, lat2 long2) 

Luego puede usarlo para buscar en su tabla espacial de la siguiente manera:

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

Esto explotará el índice espacial y encontrará cada fila de flags cuyas coordenadas se encuentran dentro del cuadro delimitador de esa línea diagonal.

Aquí hay algo de documentación .

Si tus flags contiene menos de unos pocos cientos de miles de filas, es posible que una tabla normal (no una tabla espacial) con columnas de latitud y longitud (tipos de datos FLOAT, indexados) funcione igual de bien y sea más fácil de desarrollar y depurar.

He escrito un tutorial sobre esa técnica. http://www.plumislandmedia.net/mysql/haversine-mysql- ubicación-más-cercana/