37 votes

Stocker les valeurs Lat Lng dans MySQL en utilisant le type de point spatial

Technologie utilisée: MySQL 5.1 et PHP 5.3

Je suis juste à la conception d'une nouvelle base de données pour un site que je suis en train d'écrire. Je suis en train de regarder la meilleure façon de maintenant, le stockage de la Lat et de Gnl valeurs.

Dans le passé, j'ai été en utilisant la VIRGULE et l'utilisation de PHP/MySQL sélectionner dans le formulaire:

SQRT(POW(69.1 * (fld_lat - ( $lat )), 2) + POW(69.1 * (($lon) - fld_lon) * COS(fld_lat / 57.3 ), 2 )) AS distance

pour trouver le plus proche des lieux correspondants.

En commençant à lire plus sur les nouvelles technologies, je me demande si je dois utiliser les Extensions Spatiales. http://dev.mysql.com/doc/refman/5.1/en/geometry-property-functions.html

L'Information est assez mince sur le sol, si et a eu une question sur la façon de stocker les données. Au lieu d'utiliser la VIRGULE, j'ai maintenant l'utiliser comme un Type de données?

Aussi, une fois stockée comme un POINT est-il facile juste pour obtenir le Lat Gnl valeurs dans le cas où je veux tracer sur une carte ou dois-je en outre de stocker le lat lngs que DÉCIMALES encore ainsi?

Je sais que je devrais prob utiliser PostGIS comme la plupart des posts ici dire que je n'ai pas envie d'apprendre une nouvelle DB si!

Suivi

J'ai été à jouer avec le nouveau type de POINT. J'ai été en mesure d'ajouter Lat Gnl valeurs à l'aide des éléments suivants:

INSERT INTO spatialTable (placeName, geoPoint) VALUES( "London School of Economics", GeomFromText( 'POINT(51.514 -0.1167)' ));

Je peux alors obtenir la Lat, Lng valeurs de retour de la Db à l'aide de:

SELECT X(geoPoint), Y(geoPoint) FROM spatialTable;

Tout cela semble bon, mais le calcul de la distance est le bit j'ai besoin de résoudre. Apparemment, MySQL dispose d'une place de titulaire pour une fonction de distance, mais ne sera pas publié depuis un moment. Quelques posts que j'ai trouvé j'ai besoin de faire quelque chose comme ci-dessous, mais je pense que mon code est un peu mal:

SELECT
 placeName,
 ROUND(GLength(
  LineStringFromWKB(
   LineString(
    geoPoint, 
    GeomFromText('POINT(52.5177, -0.0968)')
  )
  )
))
AS distance
FROM spatialTable
ORDER BY distance ASC;

Dans cet exemple geoPoint est un POINT d'entrée dans la DB à l'aide de l'INSÉRER au-dessus.

GeomFromText('POINT(52.5177, -0.0968)' est un Lat de valeur du Gnl je veux calculer une distance à partir de.

Plus de Suivi

Plutôt bêtement je venais de mettre dans la partie RONDE de la SQL sans vraiment le penser. Prenant cela me donne:

SELECT
placeName,
(GLength(
LineStringFromWKB(
  LineString(
    geoPoint, 
    GeomFromText('POINT(51.5177 -0.0968)')
  )
 )
))
AS distance
FROM spatialTable
ORDER BY distance ASC

Qui semble me donner les distances exactes dont j'ai besoin.

Je suppose que la seule chose actuellement à laquelle il faut répondre est une pensée que je suis vient de rendre la vie difficile pour moi-même en utilisant Spatiale maintenant ou à l'avenir de l'étanchéité à moi-même...

8voto

Julian Points 904

Je pense que vous devriez toujours utiliser le plus haut niveau d'abstraction facilement disponibles. Si vos données géospatiales, puis utiliser des objets géospatiaux.

Mais soyez prudent. Mysql est la pire des bases de données géospatiales, il est. Son OK pour les points mais tous ses polygone fonctions sont complètement cassé - ils changer le polygone de son rectangle de délimitation et ensuite faire la réponse sur ce point.

Le pire exemple qui m'a frappé, c'est que si vous avez un polygone représentant le Japon et vous vous demandez quels sont les lieux qui sont au Japon, Vladivostok pénètre dans la liste!

Oracle et PostGIS n'ont pas ce problème. J'attends MSSQL ne l'est pas et Java de base de données à l'aide de JTS que son moteur ne fonctionne pas. Géospatiales Bon. MySQL Géospatiales Mauvais.

Viens de lire ici Comment utiliser MySQL spatial requêtes pour rechercher tous les enregistrements dans X rayon? fixes dans 5.6.1.

Hoorah!

1voto

Aredridel Points 763

C'est une bonne chose, car vous pourrez alors utiliser des index spatiaux sur vos requêtes. Limiter à un cadre de sélection, par exemple, pour limiter le nombre de lignes à comparer.

1voto

ashwoods Points 1479

Mysql SIG yagni:

Si vous n'avez pas d'expérience avec les SIG, de l'apprentissage spatial extensions est pratiquement comme l'apprentissage d'une nouvelle base de données, plus un peu de mathématiques, et beaucoup d'acronymes. Des cartes, des projections, srids, formats... vous devez apprendre tout ce que pour le calcul des distances entre les points de bénéficier d'une certaine latitude/longitude: probablement pas, serez-vous l'intégration de la 3e partie des données SIG ou de travailler avec quelque chose de plus complexe que de points, ce système de coordonnées allez-vous utiliser?

Revenir à yagni: faire les choses aussi simples que possible, dans ce cas de mettre en œuvre votre code en php ou SQL. Une fois que vous atteignez un obstacle et décidez que vous avez besoin spatiale, lire sur les SIG, systèmes de coordonnées, des projets et des conventions.

D'ici là, vous aurez probablement envie de PostGIS.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X