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


154

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

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


4
Si vous faites deux points (carte 2D lat / lon), j'utiliserais le type de données Geometry. Si vous avez besoin d'introduire l'altitude ou la courbure de la terre dans vos calculs de distance, la géographie est l'endroit où vous voulez aller.
Douzième

4
L'une des réponses ci-dessous répondait-elle à votre question? Si oui, je vous encourage à en choisir une comme réponse :)
Volte

Réponses:


140

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

Ou faites-en deux colonnes de type float(= float8ou double precision). 8 octets chacun.
Ou real(= float4) si une précision supplémentaire n'est pas nécessaire. 4 octets chacun.
Ou mêmenumeric si vous avez besoin d'une précision absolue. 2 octets pour chaque groupe de 4 chiffres, plus 3 à 8 octets de surcharge.

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


Les types de données geometryet geographysont fournis par le module supplémentaire PostGIS et occupent une colonne dans votre tableau. Chacun occupe 32 octets pour un point. Il y a des frais généraux supplémentaires comme un SRID là-dedans. Ces types stockent (long / lat), pas (lat / long).

Commencez à lire le manuel PostGIS ici .


5
Je ne recommanderais pas d'utiliser le floattype de données. Cela rend le calcul avec les coordonnées très compliqué. Vous devez utiliser PostGIS et le geographytype de données pour de tels calculs.
m13r

9
C'est vraiment un bon manuel, n'est-ce pas? Un exemple brillant dans la documentation.
otocan

1
Serait-il plus rapide de stocker long, lat et geog plutôt que d'essayer d'analyser geog pour le long lat original?
Dan

1
@Dan: Ça dépend. Veuillez poser une nouvelle question avec des détails. Vous pouvez toujours créer un lien vers celui-ci pour le contexte. Les commentaires ne sont pas le lieu de nouvelles questions.
Erwin Brandstetter

40

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

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 ses données sont exprimées en degrés de longitude et de latitude, comme dans le GPS. En savoir plus: http://epsg.io/4326

L'ordre est la longitude, la latitude - donc si vous la tracez comme 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);

puis demandez, disons, 5 plus proches d'un point donné:

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

1
La clarification du SRID 4326 veut la longitude de latitude dans cet ordre. Mais l'interprétation de PostGIS du SRID 4326 veut la latitude de longitude dans cet ordre. L'exemple est correct pour l'utilisation de PostGIS. postgis.net/2013/08/18/tip_lon_lat
hahmed

26

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, entre autres opérations SIG que vous pourrez trouver utiles à l'avenir.


5

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

Vous pouvez maintenant utiliser la fonction earth_box pour - par exemple - rechercher des points à une certaine distance d'un emplacement.


2

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

Importez votre CSV dans les champs de lat long vers les DECIMAL(10,6)colonnes. 6 chiffres correspondent à une précision de 10 cm, ce qui devrait être suffisant pour la plupart des cas d'utilisation.

Puis diffusez vos données importées

SELECT 
    --ST_SetSRID(ST_Point(long, lat),4326) geom -- the wrong way because SRID not set in geometry_columns table
    ST_Point(long, lat)::geometry(Geometry, 4326) geom
INTO target_table
FROM source_table;

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

SELECT * FROM public.geometry_columns WHERE f_table_name = 'target_table';

Validez l'ordre de votre paramètre de lat longue à l'aide d'un visualiseur WKT et ST_AsEWKT(target_table.geom) .

Ensuite, indexez-le pour de meilleures performances

CREATE INDEX idx_target_table_geom_gist
    ON target_table USING gist(geom);
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.