web-dev-qa-db-fra.com

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

Je veux stocker l'emplacement géographique de chaque adresse dans ma table "tblAddress" MySQL (Innodb) et je pense que j'ai 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.

8
Prabhat

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 ex. -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 DECIMAL comme le suggère @ gandaliter .

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

Les latitudes varient de -90 à +90 (degrés), donc DECIMAL(10,8) est acceptable pour cela, mais les longitudes varient de -180 à +180 (degrés), vous avez donc besoin de 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 NULLThis explique comment MySQL fonctionne avec les types de données à virgule flottante.

Informations connexes:

6
oNare