MANIPULANDO DADOS GEOESPACIAIS EM PYTHON
Cada vez mais as empresas estão fazendo uso de dados na tomada de decisões. Todavia, fazer esta análise de forma a levarmos em consideração informações de geolocalização poderá trazer mais valor à análise, na mesma medida que a torna mais desafiadora.
Aqui no time de Insights da Geofusion, utilizamos Python e suas bibliotecas para manipular e enriquecer geometrias com dados, para gerar valor tanto para o nosso principal produto, o OnMaps, quanto para projetos e análises complexas em conjunto do nosso time de consultoria.
Neste artigo, iremos demonstrar algumas análises simples, mas poderosas, que podem auxiliar cientistas de dados a trabalharem com dados geoespaciais.
O notebook com os códigos e análise estão no github da Geo e as geometrias e dados sociodemográficos podem ser encontrados no IBGE!
O QUE É WKT?
Well-known text (WKT) é uma linguagem de marcação de texto usada para representar objetos vetoriais em um mapa.
WKT pode ser utilizada para representar diversos tipos de objetos geométricos. Os mais utilizados aqui no time são pontos, linhas (linestring e multilinestring), polígonos e multipolígonos.
Usaremos estas geometrias ao associá-las a dados sociodemográficos ou a uma quantidade de POIs (Points of Interest).
Para demonstrar como manipular dados geoespaciais em Python, usaremos um exemplo bem simples: associaremos as geometrias de cada setor censitário da cidade de São Paulo à sua renda nominal, quantidade de domicílios e renda média — sendo esta última definida como o resultado da divisão da renda nominal pela quantidade de domicílios.
O setor censitário é uma geometria definida pelo Instituto Brasileiro de Geografia e Estatística (IBGE), que pode ter qualquer medida. O que define esses setores não é o espaço geográfico que eles ocupam, mas a quantidade de domicílios que cada setor censitário comporta.
Entenda melhor sobre esta geometria e a sua importância no blog da Geofusion.
Mesmo com este dado estando em formato WKT, não conseguiremos manipulá-lo sem fazer uso de outras bibliotecas de Python específicas para dados geoespaciais. Até o momento, o dado é interpretado como uma string.
SHAPELY
A biblioteca que usamos aqui no time é a Shapely, que permite com que façamos diversas operações geoespaciais de maneira simples e intuitiva.
A primeira delas é transformar o dado em formato WKT em um objeto geométrico que até então é apenas uma string, que não permite com que façamos nenhuma operação geoespacial com ele.
Agora podemos realizar manipulações geométricas, visto que construímos um objeto geoespacial.
OPERAÇÕES GEOESPACIAIS
O desafio deste artigo foi calcular a renda média domiciliar de um buffer (área gerada a partir de um raio), com 500 metros de raio, realizando o cálculo proporcional da renda nominal e quantidade de domicílios dos setores censitários contidos dentro dela.
Para isto, definimos quais setores censitários intersectam o buffer e verificamos o quanto destes setores está contido dentro da isocota para, então, realizar o cálculo proporcional.
Ou seja, se 50% da área do setor estiver contido no buffer, apenas 50% do valor de renda nominal e domicílios serão associados ao mesmo.
Utilizamos o método Intersects da biblioteca Shapely, e após iterar em todos os setores censitários de São Paulo, levantamos uma lista final com 59 geometrias que intersectam o buffer.
O método utilizado para obter a geometria da intersecção entre a isocota e os 59 setores censitários é o Intersection.
O método Intersection retorna a intersecção entre duas geometrias. Para saber o quanto das áreas se intersectam, basta fazer a razão da área interseccionada pela área do setor censitário.
A partir daí, podemos obter a proporção da área do setor censitário que intersecciona o buffer.
Também podemos fazer este mesmo processo para múltiplas geometrias. No exemplo abaixo, fazemos o cálculo proporcional para três buffers dentro de São Paulo.
Para isto, foi criado um dataframe (df_buffers) com a latitude e longitude dos pontos que desejamos estudar. O método ‘geodesic_point_buffer’ retorna o buffer (um objeto de classe Polygon) e em seguida iteramos em todos os setores censitários do município.
Se o setor intersecta o buffer, é feito o cálculo proporcional da renda nominal e domicílios, adicionando estes valores ponderados a uma lista, que é somada ao final da iteração e retorna o valor da renda nominal e de domicílios da isocota.
Como você pode ver, o buffer 0 está em uma área de maior renda nominal e menor densidade domiciliar, resultando em uma renda média domiciliar bastante superior às demais.
Enquanto isso, o buffer 1 possui um acúmulo de renda nominal superior ao buffer 2. Contudo, a quantidade de domicílios é muito superior, fazendo com que o mesmo tenha uma renda média domiciliar inferior.
CONCLUSÃO
Neste artigo deu para notar a importância e a riqueza de insights que podemos ter ao associar geometrias geoespaciais com dados, deixando nossa análise mais completa.
Entendeu-se o conceito de WKT, e vimos como usar o Shapely para manipular geometrias geoespaciais.
Conferimos, também, métodos como o Intersects, que define se houve ou não intersecção entre as geometrias, e o Intersection, que retorna a geometria resultante da intersecção entre duas outras geometrias.
Finalmente, realizamos cálculo proporcional dentro de um buffer, utilizando estes métodos.
Ficou com alguma dúvida ou quer trocar experiências com a gente? É só deixar seu comentário no campo abaixo.
Até a próxima!
- Mais sobre Shapely: https://shapely.readthedocs.io/en/latest/manual.html
- Mais sobre OnMaps: https://geofusion.com.br/produto/onmaps/