Voltar para a lista de artigos Artigos
11 minutos de leitura

Um guia para o PostGIS: Exemplos básicos de consulta de dados geoespaciais

Os dados geoespaciais estão se tornando cada vez mais importantes em muitos campos, do planejamento urbano à ciência ambiental. Neste artigo, demonstraremos consultas básicas do PostgreSQL PostGIS para trabalhar com esse tipo de dados.

Os dados geoespaciais, que contêm informações sobre locais na Terra, requerem ferramentas especializadas para uso eficaz. O PostGIS é uma poderosa extensão do PostgreSQL que transforma um banco de dados Postgres em um Sistema de Informações Geográficas (GIS) completo. Com o PostGIS, você pode armazenar objetos geográficos, executar consultas espaciais e realizar análises avançadas diretamente no SQL. Isso o torna uma ferramenta essencial para quem trabalha com dados baseados em localização.

A instalação do PostGIS permite que você execute operações espaciais que normalmente exigem um software GIS especializado. Se você precisa calcular distâncias, medir áreas ou analisar relações espaciais, o PostGIS o equipa com as ferramentas necessárias para lidar com dados espaciais complexos de forma eficiente.

Se você deseja aprofundar seus conhecimentos em PostGIS, considere a possibilidade de se inscrever em nosso curso PostGIS. Ele o levará dos conceitos básicos de GIS às técnicas avançadas de PostGIS. Depois de concluí-lo, você saberá como aproveitar o poder do PostGIS em seus projetos.

Neste guia, apresentaremos a você os conceitos básicos do PostGIS. Começaremos com consultas espaciais simples e passaremos para técnicas avançadas, como análise de proximidade e análise de rede. Se quiser saber ainda mais sobre dados geoespaciais, consulte nosso artigo Introdução a bancos de dados espaciais e dados geoespaciais.

Nossa amostra de dados geoespaciais

Neste artigo, trabalharemos com um conjunto de dados espaciais extraído de São Francisco, Califórnia. Usaremos várias tabelas:

  • sf_tram_stops: Essa tabela contém os locais das paradas de bonde em toda a cidade; ela também armazena as coordenadas do local e se é possível fazer transferências entre linhas nessa parada. Ela tem as seguintes colunas:
    • id - Um identificador exclusivo para cada parada.
    • coordinates - As coordenadas de localização da parada.
    • transfer_possible - Se um passageiro pode trocar de bonde nessa parada.
  • sf_planning_districts: Essa tabela define os limites dos distritos de planejamento de São Francisco; essas informações são essenciais para análises urbanas. Ela tem as seguintes colunas:
    • id - Um identificador exclusivo para cada distrito de planejamento.
    • name - O nome do distrito.
    • boundaries - Os limites do distrito (como coordenadas de localização).
  • sf_bicycle_routes: Essa tabela armazena informações sobre as rotas de bicicleta da cidade; você precisará dela para analisar a infraestrutura de bicicleta da SanFran. Ela tem as seguintes colunas:
    • id - Um identificador exclusivo para cada rota de bicicleta.
    • course - O percurso da rota.
    • condition_rating - A classificação da rota (com base em suas condições).
  • sf_restaurants: Esta tabela lista informações sobre os restaurantes de São Francisco, incluindo seus nomes, locais, classificações e tipos de cozinha. Ela tem as seguintes colunas:
    • id - Um identificador exclusivo para cada restaurante.
    • name - O nome do restaurante.
    • food_type - O tipo de culinária servida nesse restaurante.
    • rating - A classificação do restaurante.
    • coordinates - As coordenadas de localização do restaurante.
  • sf_sights: Essa tabela registra informações sobre marcos notáveis e pontos de interesse (POIs) na cidade. Ela tem as seguintes colunas:
    • id - Um identificador exclusivo para cada ponto de interesse.
    • name - O nome do PI.
    • coordinates - A localização do PI.
  • sf_atms: Essa tabela armazena detalhes dos caixas eletrônicos da SanFran, incluindo a localização de cada caixa eletrônico e a empresa que o opera. Ela tem as seguintes colunas:
    • id - Um identificador exclusivo para cada caixa eletrônico.
    • company - A empresa que opera esse caixa eletrônico.
    • coordinates - A localização do caixa eletrônico.

Esses dados servem como base para as consultas espaciais que exploraremos. Usaremos essas consultas para analisar a proximidade entre pontos de referência e comodidades, calcular áreas dentro de distritos de planejamento e muito mais. Cada consulta demonstrará como o PostGIS o ajuda a extrair percepções significativas dos dados espaciais.

Consultas espaciais básicas com o PostGIS

Depois que seus dados geoespaciais estiverem armazenados no PostgreSQL com o PostGIS, você poderá começar a consultá-los! As consultas espaciais permitem selecionar, filtrar e manipular dados com base em sua localização, forma e relações espaciais. Então, vamos começar a trabalhar com dados geoespaciais.

Visualização de dados geoespaciais

Primeiro, vamos ver como são os dados geoespaciais. Aqui, selecionamos IDs de paradas de bonde e coordenadas para as paradas onde os passageiros podem fazer transferência:

SELECT
  id, 
  coordinates
FROM sf_tram_stops
WHERE transfer_possible = true;

Veja como é o resultado:

idcoordinates
10101000020E610000030D80DDB16995EC0742497FF90CE4240…
40101000020E61000000DAB7823F3985EC010AFEB17ECCE4240…
50101000020E6100000FDD98F1491995EC07AC7293A92CF4240…

Como você pode ver, os dados geoespaciais na coluna de coordenadas não são realmente legíveis. Para que sejam realmente utilizáveis, você precisaria de um software especializado para plotá-los no mapa. Felizmente, nosso curso PostGIS vem com um mapa integrado; agora você pode ver a localização dessas paradas de bonde:

Um guia para o PostGIS

Conversão de dados geoespaciais em texto

Talvez você queira ver as coordenadas de localização das paradas de bonde acima sem um mapa. Você pode usar a seguinte consulta para converter os dados em coordenadas legíveis por humanos:

SELECT
  id, 
  ST_AsText(coordinates),
  ST_Y(coordinates),
  ST_X(coordinates)
FROM sf_tram_stops
WHERE transfer_possible = true;

Essa consulta usa a função PostGIS ST_AsText para obter as coordenadas em um formato legível. Ela usa ST_Y e ST_X para extrair os valores de latitude e longitude. Aqui está um resultado parcial:

idst_astextst_yst_x
1POINT(-122.39202 37.6138)37.6138-122.39202
2POINT(-122.38984 37.61658)37.61658-122.38984
3POINT(-122.39948 37.62165)37.62165-122.39948

Relações espaciais

O PostGIS oferece várias funções para explorar as relações espaciais de objetos geoespaciais. Vamos examiná-las rapidamente.

ST_Intersecção

Essa função retorna a parte compartilhada (ou seja, a interseção) de duas geometrias. A consulta a seguir mostra todas as rotas de bicicleta (ou suas partes) dentro dos limites do distrito de Downtown:

SELECT
  sfbr.id,
  ST_Intersection(sfpd.boundaries, sfbr.course)
FROM sf_bicycle_routes sfbr
JOIN sf_planning_districts sfpd
  ON ST_Intersects(sfpd.boundaries, sfbr.course)
WHERE sfpd.name = 'Downtown';

A função ST_Intersection encontra a área onde duas formas se sobrepõem - nesse caso, onde as rotas de bicicleta cruzam os limites do distrito "Downtown". A função ST_Intersects verifica se as rotas de bicicleta e os limites do distrito se tocam ou se cruzam, certificando-se de que apenas aqueles que o fazem sejam incluídos.

E aqui está um resultado parcial como texto:

idst_intersection
4090102000020E61000000C000000438F3471DF9A5EC058F13A2…
4410102000020E6100000100000007451E9429B995EC0EF7A00F..
4120102000020E610000009000000ED6FEAA8999A5EC06469EB2..

E como um mapa:

Um guia para o PostGIS

ST_Contains

A função ST_Contains verifica se uma geometria contém totalmente outra. Para listar os distritos de planejamento que contêm caixas eletrônicos da empresa Crown Financial, é possível executar essa consulta:

SELECT DISTINCT sfn.name
FROM sf_planning_districts sfn
JOIN sf_atms sfa
  ON ST_Contains(sfn.boundaries, sfa.coordinates)
WHERE sfa.company = 'Crown Financial Inc.';

Aqui está o resultado:

name
Downtown
Northeast

ST_Within

A função ST_Within também verifica se uma geometria está totalmente dentro de outra. Essa consulta localiza restaurantes com uma classificação acima de 4,0 no distrito Nordeste:

SELECT 
  sep.name,
  sep.coordinates
FROM sf_planning_districts spd
JOIN sf_restaurants sep
  ON ST_Within(sep.coordinates, spd.boundaries)
WHERE rating > 4.0
  AND spd.name = 'Northeast';

Essa consulta retorna os nomes e as coordenadas dos restaurantes, facilitando a visualização em um mapa.

namecoordinates
Fast Duck0101000020E6100000B9FC87F4DB995EC02E73BA2C26E64240
Red Curry0101000020E6100000569FABADD8995EC0E1455F419AE54240
The Saloon0101000020E6100000D52137C30D9A5EC0431CEBE236E64240
Um guia para o PostGIS

Cálculos de distância e área

O cálculo de distâncias e áreas é outro aspecto fundamental do trabalho com dados geoespaciais. Esses cálculos podem ajudar a responder perguntas como "Qual é a distância deste caixa eletrônico de uma determinada vista?" ou "Qual é a área deste distrito de planejamento?"

Cálculos de distância

A função ST_Distance retorna a distância entre dois objetos geoespaciais. Ela recebe dois argumentos de geometria: ST_Distance(geometryA, geometryB).

Para visualizar todos os caixas eletrônicos localizados a 300 metros do Fisherman's Wharf, use a seguinte consulta:

SELECT   
  sa.id,
  sa.coordinates,
  ST_Distance(
    ST_Transform(sa.coordinates, 26910), 
    ST_Transform(ss.coordinates, 26910)) AS distance
FROM sf_sights ss
JOIN sf_atms sa
  ON ST_Distance(
     ST_Transform(sa.coordinates, 26910), 
     ST_Transform(ss.coordinates, 26910)) < 300
WHERE ss.name = 'Fisherman''s Wharf';

Nessa consulta, a função ST_Transform converte as coordenadas fornecidas em um sistema de coordenadas específico adequado para cálculos espaciais. O sistema de coordenadas garante que todas as operações espaciais (como cálculos de distância) sejam precisas e relevantes para as necessidades específicas da área geográfica e do projeto.

Nessa consulta, usamos o sistema de coordenadas definido pelo SRID (Spatial Reference System Identifier) 26910, que corresponde ao sistema NAD83 / UTM zona 10N. Esse sistema é comumente usado para cálculos precisos de distância na área de São Francisco.

Como você pode encontrar o SRID correto? Experimente um destes sites:

Ao transformar as coordenadas, a consulta garante que o cálculo da distância entre o caixa eletrônico e o Fisherman's Wharf seja preciso. Aqui está o resultado:

idcoordinatesdistance
1320101000020E6100000FC00A436719A5EC009FEB7921DE74240189.1839552624224
1330101000020E61000000D897B2C7D9A5EC033A7CB6262E74240277.9680083048927
1350101000020E61000000E15E3FC4D9A5EC0650113B875E74240216.11656973079064
1360101000020E6100000910A630B419A5EC033FE7DC685E74240283.89507791796825
Um guia para o PostGIS

Cálculos de área

Para calcular a área de um distrito de planejamento, use a função ST_Area. Ela recebe um argumento de geometria (ST_Area(geometry)) e retorna a área da forma resultante.

Aqui está a consulta. Observe que estamos usando SRID = 26910 novamente como nosso sistema de coordenadas:

SELECT
  ST_Area(ST_Transform(boundaries, 26910))
FROM sf_planning_districts
WHERE name = 'Buena Vista';

E este é o resultado:

st_area
2617829.8666631826

Com SRID = 26910, a unidade padrão é metros. Portanto, o resultado do ST_Area é apresentado em metros quadrados.

Análise espacial avançada

À medida que você se familiariza com o PostGIS, pode usar seus recursos avançados para realizar análises espaciais aprofundadas. Essas técnicas permitem explorar relações espaciais, realizar análises de proximidade e até mesmo conduzir análises de rede, tornando os insights sobre os dados geoespaciais muito mais práticos.

Buffering e análise de proximidade

O buffer cria zonas em torno de recursos espaciais. Isso é particularmente útil na análise de proximidade, em que você precisa determinar a proximidade de determinados recursos entre si. Por exemplo, se quiser identificar todos os restaurantes em um raio de 3.000 metros do "Palace of Fine Arts", você pode usar a função ST_DWithin:

SELECT   
  sep.name,
  sep.rating,
  sep.food_type,
  sep.coordinates,
  ST_Distance(
    ST_Transform(sep.coordinates, 26910), 
    ST_Transform(ss.coordinates, 26910)) AS distance
FROM sf_sights ss
JOIN sf_restaurants sep
  ON ST_DWithin(
     ST_Transform(sep.coordinates, 26910), 
     ST_Transform(ss.coordinates, 26910), 
     3000)
WHERE ss.name = 'Palace of Fine Arts';

E aqui estão seus resultados em forma de tabela e mapa:

nameratingfood_typecoordinatesdistance
Olive2.10Greek0101000020E6100000C9AB730CC89A5EC0527E52EDD3E542402764.17980825426
La fragranza4.86Italian0101000020E61000008811C2A38D9D5EC038F3AB3940E442402361.1920187470487
Um guia para o PostGIS

Operações de sobreposição

No mapeamento, as operações de sobreposição nos permitem ver como diferentes conjuntos de informações geográficas se combinam ou interagem. Imagine que você tenha dois mapas, um que mostre todos os parques de uma cidade e outro que mostre áreas propensas a inundações. Ao colocar um mapa sobre o outro, você pode descobrir quais parques correm o risco de inundação. Esse processo nos ajuda a entender e visualizar onde diferentes características geográficas coincidem; ele torna o planejamento, as análises e a tomada de decisões mais eficazes.

A consulta a seguir usa a função ST_Union para mesclar os limites de todos os distritos de planejamento "recreativos" em uma forma geométrica unificada:

SELECT
  ST_Union(boundaries) 
FROM sf_planning_districts 
WHERE type = 'recreational';
Um guia para o PostGIS

Da mesma forma, você poderia usar ST_Intersection para fazer a mesma coisa.

Análise de rede

A análise de rede envolve o exame de rotas, a identificação dos caminhos mais curtos e o aprimoramento da eficiência de viagens em uma rede. É fundamental para compreender e otimizar os sistemas de transporte e a conectividade. O PostGIS, quando associado ao site pgRouting, oferece ferramentas robustas para esse tipo de análise.

A extensão pgRouting fornece algoritmos avançados para otimização de rotas. Um dos mais conhecidos é a função pgr_dijkstra, que calcula o caminho mais curto ou mais rápido entre dois pontos, considerando fatores como tipos de estradas, condições de tráfego e outras variáveis. Esse recurso é inestimável para sistemas de navegação, planejamento de logística, gerenciamento de transporte e muito mais. Ao aproveitar essas extensões, os usuários podem aprimorar o planejamento de rotas, reduzir os tempos de viagem e melhorar a eficiência geral da rede.

Continue explorando dados espaciais com o PostGIS

O PostGIS, com sua integração perfeita ao PostgreSQL, oferece uma plataforma avançada para gerenciar e analisar dados geoespaciais. Ao longo deste artigo, abordamos os conceitos básicos de consultas espaciais, nos aventuramos em análises espaciais avançadas e demonstramos como o PostGIS pode ajudá-lo a responder a questões geográficas complexas com precisão e eficiência.

Aprender o PostGIS pode transformar sua abordagem aos dados espaciais. Isso facilitará a extração de insights valiosos, a otimização de fluxos de trabalho e a tomada de decisões baseadas em dados. Quer você esteja envolvido em planejamento urbano, análise ambiental, redes de transporte ou qualquer área relacionada a GIS, o PostGIS o equipará com as ferramentas necessárias para lidar com dados geoespaciais de forma eficaz.

Ao explorar as possibilidades do PostGIS, você descobrirá que ele aprimora sua capacidade de trabalhar com dados geoespaciais e abre novos caminhos para inovação e descoberta. A combinação dos robustos recursos de banco de dados do PostgreSQL com as funções geoespaciais do PostGIS permite que você enfrente até mesmo os desafios espaciais mais complexos com confiança.

Antes de ir embora, vou mencionar novamente nosso curso abrangente sobre PostGIS; ele é realmente uma excelente opção para obter prática real com dados espaciais. Ele o guiará por todos os aspectos do PostGIS, desde os fundamentos até as técnicas avançadas. Antes que se dê conta, você estará lidando com confiança com projetos de dados geoespaciais.

O PostGIS é mais do que apenas uma extensão do PostgreSQL. Ele é uma porta de entrada para liberar todo o potencial dos dados geoespaciais em seus sistemas de banco de dados. Ao dominar os recursos do PostGIS, você pode transformar os dados espaciais em percepções acionáveis que geram sucesso em seus projetos e na sua empresa.