232 votes

Quel type de données pour la latitude et la longitude ?

Je suis novice en matière de PostgreSQL et PostGIS. Je veux stocker les valeurs de latitude et de longitude dans une table de base de données PostgreSQL 9.1.1. Je vais calculer la distance entre deux points, trouver les points les plus proches en utilisant ces valeurs de localisation.

Quel type de données dois-je utiliser pour la latitude et la longitude ?

226voto

Erwin Brandstetter Points 110228

Vous pouvez utiliser le type de données point - combinaisons (x,y) qui peut être votre lat / long. Occupe 16 octets : 2 float8 des numéros en interne.

Ou bien deux colonnes de type float (= float8 ou double precision ). 8 octets chacun.
Ou real (= float4 ) si une précision supplémentaire n'est pas nécessaire. 4 octets chacun.
Ou même numeric si vous avez besoin d'une précision absolue. 2 octets pour chaque groupe de 4 chiffres, plus 3 à 8 octets de frais généraux.

Lisez le manuel détaillé sur types numériques et types géométriques .


Le site geometry et geography Les types de données sont fournis par le module supplémentaire PostGIS et occuper un dans votre tableau. Chacun occupe 32 octets pour un point. Il y a des frais généraux supplémentaires comme un SRID. Ces types stockent (long/lat), et non (lat/long).

Commencez à lire le Manuel PostGIS ici .

69voto

Dans PostGIS, pour les points avec une latitude et une longitude, il existe un type de données géographiques.

Pour ajouter une colonne :

alter table your_table add column geog geography;

Pour insérer des données :

insert into your_table (geog) values ('SRID=4326;POINT(longitude latitude)');

4326 est l'ID de référence spatiale qui indique que les données sont exprimées en degrés de longitude et de latitude, comme pour le GPS. Pour en savoir plus : http://epsg.io/4326

L'ordre est Longitude, Latitude - donc si vous le tracez sur la carte, c'est (x, y).

Pour trouver le point le plus proche, vous devez d'abord créer un index spatial :

create index on your_table using gist (geog);

et ensuite demander, disons, les 5 plus proches d'un point donné :

select * 
from your_table 
order by geog <-> 'SRID=4326;POINT(lon lat)' 
limit 5;

29voto

tvieira Points 830

Je préconise fortement PostGis . Il est spécifique à ce type de données et dispose de méthodes prêtes à l'emploi pour calculer la distance entre les points, parmi d'autres opérations SIG que vous pourrez trouver utiles à l'avenir.

14voto

Si vous n'avez pas besoin de toutes les fonctionnalités offertes par PostGIS, Postgres (aujourd'hui) propose un module d'extension appelé distance terrestre . Il utilise le point ou cube en fonction de vos besoins de précision pour les calculs de distance.

Vous pouvez maintenant utiliser le Boîte à terre pour, par exemple, rechercher des points situés à une certaine distance d'un lieu.

10voto

TimDude Points 95

Dans PostGIS, la géométrie est préférée à la géographie (modèle de la terre ronde) car les calculs sont beaucoup plus simples et donc plus rapides. Elle a également beaucoup plus de fonctions disponibles, mais elle est moins précise sur les très longues distances.

Importez vos champs CSV long et lat vers DECIMAL(10,6) colonnes. 6 chiffres représentent une précision de 10 cm, ce qui devrait être suffisant pour la plupart des cas. Ensuite, convertissez vos données importées dans le SRID correct.

Dans le mauvais sens !

/* try what seems the obvious solution */
DROP TABLE IF EXISTS public.test_geom_bad;
-- Big Ben, London
SELECT ST_SetSRID(ST_MakePoint(-0.116773, 51.510357),4326) AS geom
INTO public.test_geom_bad;

La bonne façon

/* add the necessary CAST to make it work */
DROP TABLE IF EXISTS public.test_geom_correct;
SELECT ST_SetSRID(ST_MakePoint(-0.116773, 51.510357),4326)::geometry(Geometry, 4326) AS geom
INTO public.test_geom_correct;

Vérifiez que le SRID n'est pas nul !

/* now observe the incorrect SRID 0 */
SELECT * FROM public.geometry_columns
WHERE f_table_name IN ('test_geom_bad','test_geom_correct');

Valider l'ordre de votre paramètre de long lat en utilisant un visualiseur WKT et

SELECT ST_AsEWKT(geom) FROM public.test_geom_correct

Puis l'indexer pour une meilleure performance

CREATE INDEX idx_target_table_geom_gist
    ON target_table USING gist(geom);

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