Geoespacial Python PDF
Geoespacial Python PDF
Geoespacial Python PDF
5
Introdução à Análise de Dados Geoespaciais com
Python
Resumo
A análise espacial, ou apenas análise geoespacial, é uma abordagem para aplicar a aná-
lise estatística e outras técnicas analíticas a dados que possuem um aspecto geográfico
ou espacial. Essa análise normalmente é feita utilizando técnicas de renderização de ma-
pas a partir do processamento de dados espaciais e a aplicação de métodos analíticos a
conjuntos de dados terrestres ou geográficos. Este minicurso é uma introdução à análise
de dados geoespaciais com Python, com foco em dados vetoriais tabulares usando Geo-
Pandas. O conteúdo concentra-se em apresentar as diferentes bibliotecas para trabalhar
com dados geoespaciais e as relações no espaço. Isso inclui a importação de dados em
diferentes formatos (por exemplo, shapefile, GeoJSON), visualizando, combinando e
organizando-os para análise, fazendo o uso de bibliotecas como pandas, geopandas,
shapely, pyproj, matplotlib, cartopy, dentre outras.
5.1. Introdução
A compreensão da distribuição espacial a partir de dados originados de fenômenos ocor-
ridos no espaço constitui um grande desafio para diversas áreas do conhecimento, seja em
saúde, em geologia, em agronomia, computação entre tantas outras. Tais estudos vem se
tornando cada vez mais comum, devido a crescente disponibilidade de dados espaciais,
além do crescimento vertiginoso das tecnologias de Sistemas de Informação Geográficas
- SIG (do inglês, Geographic Information System – GIS) aliada procedimentos computa-
cionais e recursos humanos [Monteiro et al. 2004].
Entender a distribuição dos dados geoespaciais, ou seja, levando em conta a lo-
calização espacial do fenômeno em estudo de forma explícita, e traduzi-los em padrões
considerando propriedades mensuráveis e relacionadas faz parte da Análise Espacial de
Dados Geográficos [Monteiro et al. 2004].
A partir dos dados espaciais, é possível descobrir não apenas a localização, mas
também o comprimento, tamanho, área ou forma de qualquer objeto. Os dados geo-
espaciais têm um grande número de aplicações em nossa vida cotidiana, indo desde o
entendimento e modelagem do comportamento urbano de pessoas, veículos e outros ob-
jetos móveis e utilizando esse entendimento na construção e aperfeiçoamento de modelos
de contágio, auxiliando no desenvolvimento de ações e medidas preventivas no controle
de epidemias [Zheng et al. 2014, Domingues et al. 2020].
Neste minicurso será apresentada uma introdução à análise de dados geoespaciais
com Python, com foco em dados vetoriais tabulares a partir de diferentes bibliotecas para
trabalhar com dados geoespaciais e as relações no espaço, como pandas, geopandas,
shapely, pyproj, matplotlib, dentre outras.
• Pandas: Pandas1 é uma biblioteca licenciada com código aberto que oferece estru-
turas de dados de alto desempenho e de fácil utilização voltado a análise de dados
para a linguagem de programação Python [Coelho 2017].
• Matplotlib: O Matplotlib2 é uma biblioteca de plotagem 2D do Python que produz
números de qualidade de publicação em vários formatos de cópia impressa e ambi-
entes interativos entre plataformas. O Matplotlib pode ser usado em scripts Python,
nos shell Python e IPython, notebooks Jupyter e em servidores web.
• GDAL: GDAL3 é uma biblioteca de tradução para formatos de dados geoespaciais
vetoriais e raster que é lançada sob uma Licença de Código Aberto do estilo X/MIT
pela Open Source Geospatial Foundation. Como uma biblioteca, ela apresenta um
único modelo de dados abstratos de rasterização e um único modelo de dados abs-
tratos de vetor para o aplicativo de chamada para todos os formatos suportados.
• Shapely: Shapely4 é um pacote Python para análise teórica de conjunto e mani-
pulação de recursos planares usando (via módulo ctypes do Python) funções da
biblioteca GEOS5 bem conhecida e amplamente implantada.
• GeoPandas: GeoPandas6 é um projeto de código aberto para facilitar o trabalho
com dados geoespaciais em python. GeoPandas estende os tipos de dados usados
pelos pandas para permitir operações espaciais em tipos geométricos. As operações
geométricas são realizadas pelo shapely.
1 Disponível em https://pandas.pydata.org/
2 Disponível em https://matplotlib.org/
3 Disponível em https://gdal.org/
4 Disponível em https://github.com/Toblerity/Shapely
5 GEOS, uma porta do Java Topology Suite (JTS), é o mecanismo de geometria da extensão espacial
Shapely
tebook, ao invés de serem exibidos em uma janela diferente. Além disso, importaremos o
GeoPandas com o alias gpd, linha 2.
Assumindo que temos um arquivo contendo dados e geometria (por exemplo, Geo-
Package, GeoJSON, Shapefile), podemos lê-lo facilmente usando a função gpd.read_ f ile,
que detecta automaticamente o tipo de arquivo e cria um GeoDataFrame. Para criar nosso
primeiro mapa, utilizaremos a malha de setores censitários do estado do Piauí que pro-
vêm do Instituto Brasileiro de Geografia e Estatística (IBGE) e que pode ser baixado no
seguinte endereço: https://shorturl.at/klAF7.
A Figura 5.4 apresenta os primeiros cinco registros do GeoDataFrame da malha
de setores censitários do estado do Piauí.
• Line (“LineString”): representa uma sequência de pontos que formam uma linha.
coordenadas Y , que é a latitude. Mas a terna (X,Y, Z) também contêm um valor de altura
para elevação. O valor Z geralmente se refere à elevação naquele local do ponto.
As linhas de longitude têm coordenadas X entre -180 e +180 graus. O Meridiano
de Greenwich (ou meridiano principal) é uma linha zero de longitude a partir da qual
medimos o leste e o oeste. Longitudes positivas estão a leste do meridiano principal e as
negativas estão a oeste. Na verdade, a linha zero passa pelo Observatório Real de Gre-
enwich, na Inglaterra. Em um sistema de coordenadas geográficas, o meridiano principal
é a linha que tem 0° de longitude. O Meridiano de Greenwich separa o leste do oeste da
mesma forma que o Equador separa o norte do sul.
As linhas de latitudes têm valores Y que estão entre -90 e +90 graus. O equador
é onde medimos o norte e o sul. Tudo ao norte do equador tem valores de latitude po-
sitivos. Considerando que, tudo ao sul do equador tem valores de latitude negativos. A
Figura 5.2.5 a divisão do globo terrestre a partir do Meridiano de Greenwich e da Linha
do Equador.
Figura 5.8. Código com exemplos de dados vetoriais espaciais da biblioteca shapely.
medida que estão sendo trabalhadas. A Figura 5.15 uma possível configuração para o CRS
com UTM para a cidade de Teresina/PI. Note que, para o parâmetro zone, escolhemos o
valor 23 - que é exatamente a projeção em que está localizada a Teresina/PI. Também
utilizamos o parâmetro south, definindo que estamos trabalhando com o hemisfério sul, e
a unidade (units) como m, de “metros”.
TOUCHES: Analisa se há interseção entre os limites das geometrias, mas seus interiores
não se intersectam.
WITHIN: Verifica se uma geometria está dentro da outra. Representa a relação inversa
de CONTAINS.
Existem também outras operações que não analisam apenas a relação entre duas
geometrias, retornando VERDADEIRO ou FALSO, mas realizam operações espaciais,
retornando valores ou novas geometrias como saída. Tais operações são:
BUFFER: Dada uma distância especificada pelo usuário, a operação irá gerar e retor-
nar uma nova geometria resultante da adição de uma silhueta à geometria original
(Figura 5.3).
(a) (b)
Figura 5.16. Operação BUFFER. (a) Geometria Base. (b) Geometria Resultante.
(a) (b)
Figura 5.17. Operação CONVEXHULL. (a) Geometria Base. (b) Geometria Resultante.
DIFFERENCE: Retorna uma geometria que contém todos os pontos que estão na repre-
sentação de base mas não na geometria de comparação (Figura 5.3).
(a) (b)
Figura 5.18. Operação DIFFERENCE. (a) Geometria Base. (b) Geometria Resultante.
Figura 5.19. Operação INTERSECTION. (a) Geometria Base. (b) Geometria Resultante.
(a) (b)
Figura 5.20. Operação SYMDIFFERENCE. (a) Geometria Base. (b) Geometria Resultante.
SYMDIFFERENCE: Retorna a geometria que contém todas aquelas que não se inter-
sectam nas representações utilizadas (Figura 5.3).
UNION: Retorna a geometria obtida com a união de todas aquelas presentes nas duas
representações (Figura 5.3).
(a) (b)
Figura 5.21. Operação UNION. (a) Geometria Base. (b) Geometria Resultante.
Figura 5.22. Cálculo dos centroides dos setores censitários urbanos de Teresina/PI.
Figura 5.23. Mapa com os setores censitários urbanos de Teresina/PI com seus
respectivos centroides.
Agora, vamos calcular a área de cada setor censitário urbano de Teresina/PI, linhas
de 1 a 3 da Figura 5.24, e em seguida plotar essa área calculado com uma legenda, linha
4 da Figura 5.24. O resultado dessa operação pode ser observado na Figura 5.25
Figura 5.24. Cálculo da área dos dos setores censitários urbanos de Teresina/PI.
Figura 5.25. Mapa dos setores censitários urbanos de Teresina/PI graduados pela área.
• Altair: https://altair-viz.github.io/gallery/choropleth.html
• Plotly: https://plot.ly/python/#maps
Figura 5.26. Código para criação de um mapa interativo com o Folium em Python.
php?pagename=Teresina¶ms=5_05_20_S_42_48_07_W_type:city_region:BR
representar dados no mapa. O Folium nos permite criar mapas com diferentes tiles como
Stamen Terrain, Stamen Toner, Stamen Water Color, CartoDB Positron. Por padrão,
Folium define o OpenStreetMap como tile padrão. Na Figura 5.28 temos o mapa de
Teresina/PI com o tiles Stamen Terrain que mostra o relevo.
Como agora sabemos que cada tileset fornece informações de uma maneira dife-
rente e serve a um propósito diferente, podemos sobrepô-los para obter mais informações
apenas traçando um único mapa. Podemos fazer isso adicionando diferentes camadas de
blocos a um único mapa. Na Figura 5.29 temos o mapa de Teresina/PI com os tiles Sta-
men Terrain, Stamen Toner, Stamen Water Color, CartoDB Positron, Carto Dark Matter,
além do OpenStreetMap, adicionado através do método TitleLayer(), da linha 1 até
a linha 5.
É possível observar na Figura 5.29 que foi adicionado cinco camadas de tiles dife-
rentes a um único mapa e agora se tem 6 camadas diferentes de conjuntos de tiles. Tam-
bém foi adicionado ao mapa o LayerControl(), linha 6 da Figura 5.29, que fornece
um ícone no canto superior direito do mapa para alternar entre as diferentes camadas.
Criando Marcadores
Marcadores são um dos itens mais utilizados para marcar uma localização em um mapa.
Por exemplo, quando se usa o Google Maps para navegação, é marcada a localização de
origem por um marcador e o destino é marcado por outro marcador. Vale ressaltar que os
marcadores estão entre as coisas mais importantes e úteis em um mapa interativo.
Folium fornece uma classe folium.Marker() para criar marcadores em um
mapa interativo. Basta passar a latitude e longitude do local, mencionar um pop-up e um
tooltip e adicioná-lo ao mapa. A plotagem de marcadores é um processo de duas etapas.
Primeiro, você precisa criar um mapa básico no qual seus marcadores serão colocados
e, em seguida, adicionar seus marcadores a ele. Na Figura 5.30 é definido um array
com as coordenadas da Ponte Estaiada João Isidoro França14 , um dos mais importantes
pontos turísticos da capital piauiense, linha 1, e em seguida é criado um marker com essa
coordenada e adicionado ao mapa de Teresina, linhas de 3 a 5. O resultado do código da
Figura 5.30 pode ser observado na Figura 5.31.
Figura 5.30. Código para criação do marker nas coordenadas da Ponte Estaiada
em Teresina/PI.
Na linha 1 da Figura 5.34 temos a importação da função built-in Python para ge-
ração de números aleatório segundo uma função uniforme de probabilidade. Já linha 2
é feito a importação da classe Point do shapely para criar as geometrias para o GeoDa-
taFrame. Na linha 4 é feita a agregação das geometrias do setores censitários através da
função dissolve() do GeoPandas, em seguida extraímos os limites da agregação re-
sultante dos setores censitários através da função bounds. Nas linhas de 10 até 17 temos
laço de repetição responsável por gerar um ponto aleatório a partir dos limites da agre-
gação dos setores censitários e verificar se ele está contido dentro dos limites dos setores
censitários urbanos de Teresina/PI. Após é criado um novo GeoDataFrane com esse con-
juntos de pontos aleatórios, linha 19, com o mesmo sistema de coordenadas dos setores
censitários, linha 20.
De posse do GeoDataFrame da Figura 5.34, podemos adicioná-lo ao mapa inte-
rativa de Teresina/PI criado na Figura 5.27, através da classe GeoJson do Folium (Fi-
gura 5.35).
Figura 5.35. Adição do GeoDataFrame com 100 pontos aleatório ao mapa intera-
tivo de Teresina/PI.
Figura 5.36. Mapa interativo de Teresina/PI com 100 markers criados aleatoriamente.
Como pode ser observado na Figura 5.36, os marcadores parecem estar empilha-
dos e um pouco bagunçados. Uma forma de organizar os markers é através de clusters
de markers. O Folium disponibiliza um plugin com essa finalidade, o MarkerCluster. A
Figura 5.37 é apresentado como utilizar o plugin MasterCluster com o nosso GeoData-
Frame criado na Figura 5.34.
Figura 5.37. Exemplo de utilização do plugin MasterCluster do Folium.
Figura 5.38. Mapa interativo de Teresina/PI com 100 markers criados aleatoria-
mente agrupados.
Criando HeatMaps
É possível também implementar HeatMaps, ou mapas de calor, usando Folium. Um
HeatMap é uma representação gráfica de dados que usa um sistema de codificação de
cores para representar diferentes valores. Isso é útil para monitorar a intensidade das
estatísticas regionais com mais facilidade em uma determinada região por exemplo.
Para criação de um HeatMap o Folium disponibiliza um plugin chama justamente
HeatMap e para exemplificar, vamos criar um HeatMap com o GeoDataFrame criado na
Figura 5.34. Na Figura 5.39 temos o código para essa finalidade. Na linha 1 é feita a
importação do plugin do Folium HeatMap responsável por criar o mapa de calor. Já na
linha 3 é feita a criação do HeatMap passando como parâmetro uma lista de pontos na
forma [lat, lng] que se deseja plotar, também é possível passar uma lista na [lat, lng,
weight]) ou fornecer um numpy.array (n,2) ou (n,3). O resultado do código da
Figura 5.39 pode ser observado na Figura 5.40.
Figura 5.39. Código para criação de um HeatMap.
Figura 5.40. Mapa de calor de Teresina/PI com 100 markers criados aleatoriamente.
Figura 5.43. Código de exemplo para criação de um mapa coroplético por meio
da classe Choropleth.
Agradecimentos
Este trabalho foi realizado com apoio financeiro da CAPES, CNPq, Fundação de Amparo
à Pesquisa e ao Desenvolvimento Científico e Tecnológico do Maranhão (FAPEMA) e
Fundação de Amparo à Pesquisa do Estado de São Paulo (FAPESP), processo 2020/16578-
5. Agradecemos também ao ICMC-USP e ao LCR por oferecerem a infraestrutura neces-
sária para este estudo.
Referências
[crs ] Coordinate reference systems. https://docs.qgis.org/2.8/en/docs/
gentle_gis_introduction/coordinate_reference_systems.
html. Acessado em: 10-09-2021.
[Bolstad 2016] Bolstad, P. (2016). GIS fundamentals: A first text on geographic infor-
mation systems. Eider (PressMinnesota).
[Coelho 2017] Coelho, A. S. (2017). Introdução a análise de dados com python e pandas.
Anais Eletrônicos ENUCOMP, pages 862–876.
[Domingues et al. 2020] Domingues, A., Silva, F., Santos, L., Souza, R., Coimbra, G.,
and Loureiro, A. A. F. (2020). Dados geoespaciais: Conceitos e técnicas para coleta,
armazenamento, tratamento e visualização. Sociedade Brasileira de Computação.
[Lawhead 2015] Lawhead, J. (2015). Learning geospatial analysis with Python. Packt
Publishing Ltd.
[Lopes et al. 2019] Lopes, G. R., Almeida, A. W. S., Delbem, A. C., and Toledo, C. F. M.
(2019). Introdução à análise exploratória de dados com python. In Minicursos ERCAS
ENUCMPI 2019, pages 160–176, Porto Alegre, RS, Brasil. SBC.
[Maling 2013] Maling, D. H. (2013). Coordinate systems and map projections. Elsevier.
[Monteiro et al. 2004] Monteiro, A. M. V., Câmara, G., Carvalho, M., and Druck, S.
(2004). Análise espacial de dados geográficos. Brasília: Embrapa.
[Pimentel et al. 2021] Pimentel, J. F., Oliveira, G. P., Silva, M. O., Seufitelli, D. B., and
Moro, M. M. (2021). Ciência de dados com reprodutibilidade usando jupyter. Socie-
dade Brasileira de Computação.
[Rosa and BRITO 2013] Rosa, R. and BRITO, J. L. S. (2013). Introdução ao geoproces-
samento. UFU: Apostila. Uberlândia.
[Shen 2014] Shen, H. (2014). Interactive notebooks: Sharing the code. Nature News,
515(7525):151.
[Zheng et al. 2014] Zheng, Y., Capra, L., Wolfson, O., and Yang, H. (2014). Urban com-
puting: concepts, methodologies, and applications. ACM Transactions on Intelligent
Systems and Technology (TIST), 5(3):1–55.