Types de données pour stocker lng / lat dans MySQL

14

Je stocke une grande liste de points lnt / lat dans une base de données MySQL. Pour le moment, ce sont des points projetés pour le Royaume-Uni en M, mais à long terme, je voudrais m'assurer de pouvoir stocker les coordonnées des points pour le monde entier. Quel type de données dois-je utiliser?

J'ai commencé à utiliser decimal(18,12), mais je ne savais pas si cette précision était nécessaire ou si je pouvais simplement utiliser a float. J'ai inclus mon code, au cas où je devrais envisager autre chose:

CREATE TABLE UKTest
(
lat FLOAT,
lng FLOAT
)

Je suis assez nouveau dans SQL, donc je ne sais pas si le type de données est significatif lors de l'exécution d'une requête. J'ai supposé que la mémoire globale varierait en fonction du type de variable. Y a-t-il un avantage à utiliser une base de données spatiale par rapport à une base de données MySQL de base pour ce type de travail?

djq
la source

Réponses:

16

Cette question a également été posée sur StackOverlow .

La première réponse suggère les extensions spatiales MySQL . Il existe une multitude de liens sur l'utilisation de ces extensions ici .

Si vous ne souhaitez pas utiliser de types spatiaux et que vous obtenez des valeurs d'une unité GPS ou d'un service de géocodage, vous pouvez faire correspondre votre précision décimale à la source de données. Une règle générale consiste à stocker les données avec une précision de deux endroits supérieure à celle que vous afficherez dans une application.

Dans un exemple de code de Google affichant des points sur une carte, ils indiquent:

Lorsque vous créez la table MySQL, vous souhaitez prêter une attention particulière aux attributs lat et lng. Avec les capacités de zoom actuelles de Google Maps, vous ne devriez avoir besoin que de 6 chiffres de précision après la décimale.

Pour garder l'espace de stockage requis pour notre table au minimum, vous pouvez spécifier que les attributs lat et lng sont des flottants de taille (10,6). Cela permettra aux champs de stocker 6 chiffres après la décimale, plus jusqu'à 4 chiffres avant la décimale, par exemple -123,456789 degrés

Je ne m'inquiéterais pas des différences de performances entre les types numériques. Des indices décents auront un effet beaucoup plus important.

geographika
la source
+1 pour une bonne réponse! C'est ce que j'aurais dit et fait.
OptimizePrime
Merci pour la réponse - j'ai lu la documentation des extensions spatiales MySQL, mais comment commencez-vous à les utiliser? J'ai juste une base de données MySQL par défaut sur GoDaddy; Je ne sais pas par où commencer.
djq
1
@celenius maisonbisson.com/blog/post/12147/…
geographika
1
Et réponse mise à jour avec un lien vers plus de liens
geographika
Pourquoi 4 chiffres entiers?
Alix Axel
6

Sauf si vous êtes lié à MySQL pour une autre raison, vous devriez vraiment envisager d'utiliser une base de données activée spatialement comme postgis qui a un objet Point (et Line, Polygon, etc.) pour gérer ces détails pour vous. Vous bénéficiez également d'un support de projection lorsque vous apportez ce changement dans le monde entier.

2019 : Pour les gens comme moi qui ne lisent pas non plus les commentaires - MySQL prend en charge les types de données spatiales, soi-disant plus lents, sans preuves.

Ian Turton
la source
Remarque: pour ceux qui sont nouveaux et lisent ce qui précède, MySql 5.7+ fonctionne désormais avec les index spatiaux.
HopeKing
mais c'est encore lent
Ian Turton
Pourriez-vous s'il vous plaît aider avec des ressources qui montrent à quel point lent? J'envisage de l'utiliser sur un projet avec moins d'un million d'enregistrements. Merci.
HopeKing
expérience personnelle pas de données publiques. Trop de problèmes avec des géométries invalides, etc., cassant des choses
Ian Turton
Merci. Mon besoin est juste la distance entre les points basée sur les enregistrements de la base de données (et aucune exigence complexe comme Polygon) - par conséquent, il sera probablement sûr d'utiliser mysql pour l'instant.
HopeKing