Mysql
 sql >> Base de données >  >> RDS >> Mysql

Sélectionner tous les points géospatiaux à l'intérieur d'une zone de délimitation

Vraisemblablement les éléments x et y dans vos données POINT dans votre geometry la colonne est en degrés de latitude et de longitude.

Pour effectuer cette recherche efficacement dans MySQL, vous aurez besoin de quelques éléments.

  • Une table MyISAM (ou MySQL version 5.7 et ultérieure et InnoDB ou MyISAM)
  • Une qualification NOT NULL sur votre colonne de géométrie
  • Un index spatial ALTER TABLE flags ADD SPATIAL INDEX (coordinates)
  • Code pour créer une représentation textuelle du rectangle que vous souhaitez rechercher
  • Utilisation des fonctions GeomFromText et MBRContains / MBRWithin dans votre instruction SELECT.

Supposons que votre boîte lat/long soit un rectangle d'un degré centré sur Cathédrale de Winchester (51.0606, -1.3131) . Vous avez besoin d'une boîte englobante autour de ce point. Cette requête MySQL générera un LINESTRING (texte) pour une ligne passant en diagonale à travers cette boîte englobante.

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 requête vous donne ceci :

LINESTRING(50.5606 -1.8131,51.5606 -0.8131)

Vous pouvez également utiliser le traitement de chaîne dans un langage hôte pour créer un type de chaîne de texte similaire. Le format dont vous avez besoin est celui-ci.

 LINESTRING(lat1 long1, lat2 long2) 

Ensuite, vous pouvez l'utiliser pour rechercher votre table spatiale comme suit :

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

Cela exploitera l'index spatial et trouvera chaque rangée de flags dont les coordonnées se trouvent dans la boîte englobante de cette ligne diagonale.

Voici quelques documentation .

Si vos flags contient moins de quelques centaines de milliers de lignes, vous constaterez peut-être qu'une table ordinaire (pas une table spatiale) avec des colonnes de latitude et de longitude (types de données FLOAT, indexées) fonctionne aussi bien et est plus facile à développer et à déboguer.

J'ai écrit un tutoriel sur cette technique. http://www.plumislandmedia.net/mysql/haversine-mysql- emplacement-le-plus-proche/