Quale tipo di dati per latitudine e longitudine?


154

Sono un novizio di PostgreSQL e PostGIS. Voglio memorizzare i valori di latitudine e longitudine nella tabella del database PostgreSQL 9.1.1. Calcolerò la distanza tra due punti, troverò punti più vicini usando questi valori di posizione.

Quale tipo di dati dovrei usare per latitudine e longitudine?


4
Se stai facendo due punti (mappa lat / lon 2D) utilizzerei il tipo di dati Geometry. Se devi introdurre l'altitudine o la curvatura della terra nei tuoi calcoli della distanza, la geografia è dove vuoi andare.
Dodicesimo

4
Qualcuno delle risposte di seguito ha risposto alla tua domanda? In tal caso, ti incoraggio a selezionarne una come risposta :)
Volte

Risposte:


140

È possibile utilizzare il tipo di dati point: combinazioni (x,y)che possono essere lat / long. Occupa 16 byte: 2 float8numeri internamente.

Oppure crea due colonne di tipo float(= float8o double precision). 8 byte ciascuno.
Oppure real(= float4) se non è necessaria ulteriore precisione. 4 byte ciascuno.
O anche numericse hai bisogno di assoluta precisione. 2 byte per ogni gruppo di 4 cifre, più 3 - 8 byte di sovraccarico.

Leggi il manuale fine sui tipi numerici e sui tipi geometrici .


I tipi di dati geometrye geographysono forniti dal modulo aggiuntivo PostGIS e occupano una colonna della tabella. Ciascuno occupa 32 byte per un punto. C'è un sovraccarico aggiuntivo come un SRID. Questi tipi memorizzano (long / lat), non (lat / long).

Inizia a leggere il manuale di PostGIS qui .


5
Non consiglierei di usare il floattipo di dati. Rende molto complicato il calcolo con le coordinate. geographyPer tali calcoli è necessario utilizzare PostGIS e il tipo di dati.
m13r,

8
È davvero un bel manuale, vero? Un brillante esempio nella documentazione.
otocan,

1
Sarebbe più veloce memorizzare long, lat e geog nel tentativo di analizzare geog per il long lat originale?
Dan,

1
@Dan: dipende. Si prega di porre una nuova domanda con i dettagli. Puoi sempre collegarti a questo per il contesto. I commenti non sono il posto per nuove domande.
Erwin Brandstetter,

40

In PostGIS, per i punti con latitudine e longitudine esiste un tipo di dati geografico.

Per aggiungere una colonna:

alter table your_table add column geog geography;

Per inserire dati:

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

4326 è l'ID di riferimento spaziale che indica che sono dati in gradi di longitudine e latitudine, come nel GPS. Maggiori informazioni: http://epsg.io/4326

L'ordine è Longitudine, Latitudine - quindi se la traccia come mappa, è (x, y).

Per trovare il punto più vicino devi prima creare l'indice spaziale:

create index on your_table using gist (geog);

e quindi richiedi, diciamo, il 5 più vicino a un determinato punto:

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

1
Chiarimento SRID 4326 vuole latitudine longitudine in questo ordine. Ma l'interpretazione di PostGIS di SRID 4326 vuole latitudine di longitudine in questo ordine. L'esempio è corretto per l'uso di PostGIS. postgis.net/2013/08/18/tip_lon_lat
hahmed

26

Sostengo fortemente PostGis . È specifico per quel tipo di tipo di dati e ha metodi predefiniti per calcolare la distanza tra i punti, tra le altre operazioni GIS che potresti trovare utili in futuro


5

Se non hai bisogno di tutte le funzionalità offerte da PostGIS, Postgres (oggi) offre un modulo di estensione chiamato earthdistance . Utilizza il tipo di dati punto o cubo in base alle esigenze di precisione per i calcoli della distanza.

Ora puoi usare la funzione earth_box per -per esempio- cercare i punti entro una certa distanza da una posizione.


2

In PostGIS la geometria è preferita alla geografia (modello di terra circolare) perché i calcoli sono molto più semplici e quindi più veloci. Ha anche MOLTE funzioni più disponibili, ma è meno preciso su distanze molto lunghe.

Importa il tuo CSV in campi lat lunghi in DECIMAL(10,6)colonne. 6 cifre ha una precisione di 10 cm, dovrebbe essere sufficiente per la maggior parte dei casi d'uso.

Quindi trasmettere i dati importati

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;

Verifica che SRID non sia zero!

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

Convalida l'ordine del tuo parametro lat lungo usando un visualizzatore WKT e ST_AsEWKT(target_table.geom).

Quindi indicizzalo per le migliori prestazioni

CREATE INDEX idx_target_table_geom_gist
    ON target_table USING gist(geom);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.