PostGIS
Para criar uma coluna com dados sobre um mapa você tem duas escolhas:
GEOGRAPHY
GEOMETRY
Geography é realmente um ponto na terra. O problema é que existem funções limitadas para operar sobre ele. Como a terra é uma elipse (em termos cartográficos) esses cálculos são bem mais pesados, complexos e levemente precisos que o Geometry.
Geometry é um ponto em uma projeção plana. A projeção plana é uma aproximação em 2d da terra. Como é uma aproximação, podem haver distorções nos cálculos, então escolha sempre a projeção que menos distorcerá seu dado. Existem muitas funções para operar em um geometry. Como é um plano cartesiano simples, as operações são muito mais rápidas.
Tanto o Geography e o Geometry devem usar um formato de representação.
O formato mais comum de Geography é o WGS84, é o formato usado pelos GPS. O código dessa representação geográfica (SRID ou EPSG) é 4326.
Já em Geometry, existem muitos. Para cada ponto da terra, existe uma projeção cartográfica mais adequada que a representa.
Para Curitiba, o mais recomendado é o SIRGAS 2000 UTM 22s código (SRID ou EPSG) 31982.
A projeção mais famosa hoje em dia, usada no GoogleMaps é o Web Mercator, ou WGS 84 Web Mercator de código (SRID ou EPSG) 3857.
Um bom site para ver as distorções dos planos cartesianos é esse:
https://epsg.io/
Ao criar uma coluna do tipo GEOMETRY, você precisa dizer ao Postgre em qual plano cartesiano ele está. Atualize ele com o UpdateGeometrySRID:
SELECT UpdateGeometrySRID(varchar schema_name, varchar table_name, varchar column_name, integer srid);SELECT UpdateGeometrySRID('public', 'vehicles', 'position', 4326);
Para inserir um ponto (tanto em GEOGRAPHY como em GEOMETRY) em uma tabela você pode usar o ST_Point.
Atenção! Ao inserir um dado assim, o SRID do que você tiver inserindo deve ser igual ao SRID da coluna cadastrada no código acima, senão você receberá um erro do PostGIS (resolvemos isso no exemplo abaixo).
-- Para GEOMETRYSELECT ST_SetSRID(ST_Point(-71.1043443253471, 42.3150676015829),4326) -- Para GEOGRAPHY SELECT ST_SetSRID(ST_Point(-71.1043443253471, 42.3150676015829),4326)::GEOGRAPHY;
Caso queria converter planos cartesianos diferentes você pode usar:
-- Modelo da funçãoSELECT ST_Transform(coluna_geometria, srid); -- Pegando uma coordenada em GPS puro (WGS84) e transformando em SIRGAS 2000 UTM 22s SELECT ST_Transform(ST_SetSRID(ST_Point(-71.1043443253471, 42.3150676015829),4326),31982)
Instalando PostGIS
No Linux
Você pode instalar o PostGIS pelo próprio PPA do PostgreSQL. Descubra quais versões do PostGIS estão disponíveis pelo comando:
apt-cache search postgis
Referências
Instalando PostGIS
https://kitcharoenp.github.io/postgresql/postgis/2018/05/28/set_up_postgreSQL_postgis.html
Site Oficial PostGIS
https://postgis.net/install/
Documentação oficial do PostGIS
https://postgis.net/documentation/