Que tipo de dados para latitude e longitude?

154

Sou novato no PostgreSQL e PostGIS. Quero armazenar os valores de latitude e longitude na tabela do banco de dados PostgreSQL 9.1.1. Vou calcular a distância entre dois pontos, encontrar pontos mais próximos usando esses valores de localização.

Que tipo de dados devo usar para latitude e longitude?

user1008404
fonte
4
Se você estiver fazendo dois pontos (mapa 2D lat / lon), eu usaria o tipo de dados Geometry. Se você precisar introduzir a altitude ou a curvatura da Terra nos seus distanciadores, Geografia é para onde você quer ir.
12
4
Alguma das respostas abaixo abordou sua pergunta? Se assim for, eu encorajá-lo a selecionar uma como a resposta :)
Volte

Respostas:

140

Você pode usar o tipo de dados point- combina, (x,y)que pode ser o seu lat / long. Ocupa 16 bytes: 2float8 números internamente.

Ou faça duas colunas do tipo float(= float8ou double precision). 8 bytes cada.
Ou real(= float4) se não for necessária precisão adicional. 4 bytes cada.
Ou mesmo numericse você precisar de precisão absoluta. 2 bytes para cada grupo de 4 dígitos, mais 3-8 bytes de sobrecarga.

Leia o manual fino sobre tipos numéricos e geométricos .


Os tipos de dados geometrye geographysão fornecidos pelo módulo adicional PostGIS e ocupam uma coluna na sua tabela. Cada um ocupa 32 bytes para um ponto. Há alguma sobrecarga adicional como um SRID lá. Esses tipos armazenam (longo / lat), não (lat / long).

Comece a ler o manual do PostGIS aqui .

Erwin Brandstetter
fonte
5
Eu não recomendaria o uso do floattipo de dados. Isso torna o cálculo com as coordenadas muito complicado. Você deve usar o PostGIS e o geographytipo de dados para esses cálculos.
M13r
8
É realmente um bom manual, não é? Um exemplo brilhante na documentação.
Otocan
1
Seria mais rápido armazenar geog longo, lat e geog do que tentar analisar geog para o lat longo original?
Dan
1
@ Dan: Depende. Faça uma nova pergunta com detalhes. Você sempre pode vincular a este para contextualizar. Comentários não são o lugar para novas perguntas.
Erwin Brandstetter
40

No PostGIS, para pontos com latitude e longitude, há um tipo de dados geográficos.

Para adicionar uma coluna:

alter table your_table add column geog geography;

Para inserir dados:

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

4326 é um código de referência espacial que indica os dados em graus de longitude e latitude, o mesmo que no GPS. Mais sobre isso: http://epsg.io/4326

A ordem é Longitude, Latitude - portanto, se você o traçar como mapa, será (x, y).

Para encontrar o ponto mais próximo, primeiro você precisa criar um índice espacial:

create index on your_table using gist (geog);

e então solicite, digamos, 5 o mais próximo de um determinado ponto:

select * 
from your_table 
order by geog <-> 'SRID=4326;POINT(lon lat)' 
limit 5;
Darafei Praliaskouski
fonte
1
Esclarecimento que o SRID 4326 deseja longitude de latitude nessa ordem. Mas a interpretação do SRID 4326 feita pelo PostGIS quer a latitude da longitude nessa ordem. O exemplo está correto para o uso do PostGIS. postgis.net/2013/08/18/tip_lon_lat
hahmed 29/06/19
26

Eu defendo fortemente o PostGis . É específico para esse tipo de dados e possui métodos prontos para calcular a distância entre pontos, entre outras operações GIS que você pode achar útil no futuro

tvieira
fonte
5

Se você não precisa de todas as funcionalidades que o PostGIS oferece, o Postgres (atualmente) oferece um módulo de extensão chamado earthdistance . Ele usa o tipo de dados de ponto ou cubo, dependendo de suas necessidades de precisão para cálculos de distância.

Agora você pode usar a função earth_box para, por exemplo, consultar pontos a uma certa distância de um local.

Hans Bouwmeester
fonte
2

No PostGIS, a geometria é preferida à geografia (modelo de terra redonda) porque os cálculos são muito mais simples e, portanto, mais rápidos. Ele também possui MUITAS funções mais disponíveis, mas é menos preciso em distâncias muito longas.

Importe seu CSV para campos latinos longos para DECIMAL(10,6)colunas. 6 dígitos tem 10 cm de precisão, deve ser suficiente para a maioria dos casos de uso.

Em seguida, transmita seus dados importados

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;

Verifique se o SRID não é zero!

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

Valide a ordem do seu parâmetro long lat usando um visualizador WKT e ST_AsEWKT(target_table.geom).

Em seguida, indexe-o para obter o melhor desempenho

CREATE INDEX idx_target_table_geom_gist
    ON target_table USING gist(geom);
golfalot
fonte