Type de données décimal ou ponctuel pour le stockage des données de géolocalisation dans MySQL


8

Je veux stocker l'emplacement géographique de chaque adresse dans ma table "tblAddress" MySQL (Innodb) et je pense avoir 2 options:

1) 2 columns for Each Address:
Latitude DECIMAL(10, 8), 
Longitude DECIMAL(11, 8)

2) One Column for Each Address:
GeoLocation POINT

Mon programme doit trouver toutes les adresses qui tombent sous un rayon de 1 kilomètre de l'emplacement actuel (Mobile Client).

La commande ci-dessous ne fonctionne pas pour moi, je ne sais pas ce que je dois avoir pour cela.

CREATE SPATIAL INDEX GeoLocation ON tblAddress (GeoLocation);

Alors, quelle est l'approche suggérée pour stocker les données pour un calcul et une récupération plus rapides ici. S'il vous plaît donnez votre avis.

Réponses:


6

Vous pouvez utiliser les extensions spatiales de MySQL avec SIG.

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.

Vous pouvez également essayer DECIMALcomme le suggère @ gandaliter .

DECIMALest le type de données MySQL pour l'arithmétique exacte. Contrairement à FLOATsa précision qui est fixée pour n'importe quelle taille de nombre, donc en l'utilisant à la place, FLOATvous pouvez éviter des erreurs de précision lors de certains calculs. Si vous stockiez et récupériez simplement les chiffres sans calcul, dans la pratique, ce FLOAT serait sûr, bien qu'il n'y ait aucun mal à l'utiliser DECIMAL. Avec des calculs, FLOATc'est toujours ok, mais pour être absolument sûr de 8d.p. précision que vous devez utiliser DECIMAL.

Les latitudes varient de -90 à +90 (degrés), donc DECIMAL(10,8)c'est ok pour cela, mais les longitudes varient de -180 à +180 (degrés), donc vous en avez besoin DECIMAL(11,8). Le premier nombre est le nombre total de chiffres stockés et le second est le nombre après la virgule décimale. En bref: lat DECIMAL(10,8) NOT NULL, lng DECIMAL(11,8) NOT NULL cela explique comment MySQL fonctionne avec les types de données à virgule flottante.

Informations connexes:


Merci @oNare pour vos explications détaillées et références. J'ai vu la suggestion de gandaliter dans la question ( stackoverflow.com/questions/12504208/… ). J'ai également vu la suggestion de ypercube ici ( stackoverflow.com/questions/9560147/… ).
Prabhat
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.