web-dev-qa-db-fra.com

Problème de stockage des valeurs de latitude et de longitude dans la base de données MySQL

Je souhaite stocker les valeurs de latitude et de longitude extraites de l'API Google Maps GeoCoding dans une base de données MySQL. Les valeurs sont au format float.

12.9274529

77.5905970

Et quand je veux le stocker dans la base de données (qui est datatype float), il arrondit float et le stocke au format suivant:

12.9275

77.5906

Est-ce que j'utilise le mauvais type de données? Si oui, quel type de données devrais-je utiliser pour stocker les valeurs de latitude et de longitude?

Mettre à jour :

voici le CREATE TABLE tel que demandé par Allin

CREATE TABLE `properties` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(100) NOT NULL,
  `description` text,
  `latitude` float DEFAULT NULL,
  `longitude` float DEFAULT NULL,
  `landmark` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `serial` (`serial`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;
17

Vous devez utiliser décimal si vous ne voulez pas que les nombres soient approximés.

Types à point fixe (valeur exacte)

Les types DECIMAL et NUMERIC stockent des valeurs de données numériques exactes. Ces types sont utilisés lorsqu'il est important de conserver une précision exacte, par exemple avec des données monétaires.

Et maintenant le "voila" repondre:

Utilisez DECIMAL(10,7). Où 10 correspond au nombre total de chiffres du numéro et 7 correspond au nombre de chiffres suivant le .. (Cela signifie qu'avant le point, il y aura 3 chiffres.)

Ajustez ces chiffres si nécessaire. Aussi s'il vous plaît jetez un oeil à l'entrée manuelle que j'ai liée plus tôt dans la réponse.

40
Alin Purcaru

MySQL a des types spéciaux pour les applications SIG.

Utilisez le type point et voir:

http://dev.mysql.com/doc/refman/5.0/en/spatial-extensions.html

Pour une discussion générale, voir: http://dev.mysql.com/tech-resources/articles/4.1/gis-with-mysql.html

Certains gars ont créé un fichier UDF spécial pour calculer les distances entre les points d’une sphère (par exemple, la Terre).
Voir: http://www.lenzg.net/archives/220-New-UDF-for-MySQL-5.1-provides-GIS-functions-distance_sphere-and-distance_spheroid.html

Voici un guide pratique: http://howto-use-mysql-spatial-ext.blogspot.com/2007/11/using-circular-area-selection.html

8
Johan

utiliser double

float n'a pas la précision nécessaire pour enregistrer ce nombre de chiffres après la virgule décimale. double, même s’il n’est pas toujours garanti d’avoir 7 décimales pour tous les nombres, aura où il n’ya pas plus de 8 chiffres à gauche de la décimale, cela devrait donc répondre à vos besoins.

7
Billy Moon

La configuration optimale dans mon expérience est DOUBLE (11,8), gardez à l’esprit que lat/lng pourrait être> 99

2
peerless

Modifiez votre table pour qu'il s'agisse d'un double précision float au lieu d'un float simple précision:

alter table properties modify latitude double, modify longitude double;
0

Utilisez double

CREATE TABLE `properties` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(100) NOT NULL,
  `description` text,
  `latitude` Double DEFAULT NULL,
  `longitude` Double DEFAULT NULL,
  `landmark` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `serial` (`serial`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;
0
Adonias

Le nombre décimal (10,8) est plus que suffisant. Certains appareils GPS fournissent une position plus précise.

0
Fredrik