Utilizando Python para verificar coordenadas geográficas em um mapa KML
Me chamo Egmara e sou Cientista de Dados no Delivery Center. Utilizo muito a linguagem Python no meu dia a dia e no post de hoje vou mostrar mais um exemplo de como esta poderosa linguagem pode ser útil!
A necessidade de checar coordenadas
O Delivery Center é uma empresa que atua como uma plataforma integradora de Marketplaces como iFood, Rappi, B2W, Mercado Livre e diversos outros. Através dela, lojistas podem controlar sua operação de pedidos vindos destes marketplaces em um único ambiente, além de ter acesso a serviços de melhoria nos anúncios do seu catálogo e delivery com nossos entregadores parceiros em grandes shoppings, os chamados Hubs.
Sendo assim, é fundamental que quando nós consumidores realizamos uma compra em determinado e-commerce, a plataforma consiga reconhecer se a nossa localização geográfica (latitude e longitude, código postal, etc) pertence a área de entrega estabelecida pelo próprio e-commerce, Hub ou lojista.
Muitas vezes deseja-se verificar se uma localização geográfica pertence a um determinado mapa, cuja representação é um arquivo no formato KML (Keyhole Markup Language). Este é um formato criado para armazenar dados geográficos e mapas.
Neste artigo, apresento uma forma de realizar essa verificação para um conjunto de pontos de latitude e longitude em uma região representada por um arquivo KML de mapa.
Como o Python pode ajudar?
Vou utilizar o GeoPandas, que é um projeto de código aberto para facilitar trabalhos com dados geoespaciais. Estes dados são variáveis no Python dos tipos ponto geométrico (Point) ou polígonos (Polygon), por exemplo. O GeoPandas permite operações espaciais em DataFrames com esses tipos de dados geométricos. A manipulação e análise de objetos de um DataFrame do GeoPandas são feitas pela biblioteca Shapely.
Mãos a obra!
Carregando bibliotecas
Você pode começar instalando o GeoPandas e o Shapely via terminal:
python3 -m pip install geopandas
python3 -m pip install shapely
Agora, carregue o GeoPandas, algumas funções do Shapely e o nosso amigo Pandas em seu ambiente Python:
import geopandas as gpd
from shapely.geometry import Point, Polygon
import pandas as pd
Lendo o dataset e o KML
Suponha que você possua um arquivo KML que represente um mapa, chamado de ‘meu_mapa.kml’, e um arquivo CSV de localizações geográficas de latitude e longitude, chamado de ‘localizacoes.csv’.
Utilize o GeoPandas para ler o arquivo KML e atribua o resultado a uma variável:
gpd.io.file.fiona.drvsupport.supported_drivers['KML'] = 'rw'
meu_mapa = gpd.read_file('meu_mapa.kml', driver='KML')
meu_mapa
A variável meu_mapa é um GeoDataFrame e a coluna ‘geometry’ contém a forma geométrica que representa o mapa KML, um polígono.
type(meu_mapa)geopandas.geodataframe.GeoDataFrame
Para ler o dataset de pontos com localizações de latitude e longitude, utilize o Pandas:
localizacoes = pd.read_csv('localizacoes.csv')
localizacoes
O bom e velho tratamento dos dados
Está quase tudo pronto para você realizar a checagem das localizações no mapa disponibilizado! Para que isso seja possível, você precisa converter cada uma dessas localizações em uma variável do tipo Point:
pontos_geometricos = []
for xy in zip(localizacoes['longitude'], localizacoes['latitude']):
pontos_geometricos.append(Point(xy))
e incluir esta lista em uma coluna de um GeoDataFrame para as localizações:
localizacoes_geo = gpd.GeoDataFrame(localizacoes,
crs = {'init': 'epsg:4326'},
geometry = pontos_geometricos)
localizacoes_geo
Verificando as localizações no polígono!
Para verificar quais localizações do conjunto de dados pertencem a região do polígono representado pela variável meu_mapa (mapa KML), o método contains() possui a solução para isto! Este retorna ‘True’ caso um ponto do tipo Point pertença a região e ‘False’, caso contrário. Utilize este método e crie uma nova coluna booleana chamada no GeoDataFrame:
for i in range(0, len(localizacoes_geo)):
ponto = localizacoes_geo.geometry.loc[i]
check = meu_mapa.contains(ponto).values
localizacoes_geo["pertence_ao_mapa"].loc[i] = checklocalizacoes_geo.head(5)
Concluindo a checagem!
Pronto! Agora o GeoDataFrame localizacoes_geo possui uma coluna que afirma se a localização geográfica pertence ou não ao mapa KML. Além disso, as quantidades de localizações dentro e fora do mapa são mostradas abaixo:
print("Pontos dentro da região KML: ", sum(localizacoes_geo.pertence_ao_mapa == True))
print("Pontos fora da região KML: ", sum(localizacoes_geo.pertence_ao_mapa == False))Pontos dentro da região KML: 99
Pontos fora da região KML: 1
Visualizando o KML e o dataset com o Folium!
Concluímos anteriormente que somente uma localização não pertence a região KML. Vamos visualizar esse dado?
O Folium é uma biblioteca bastante útil para a visualização de mapas em formato GeoJSON. Podemos converter o nosso arquivo KML, ‘meu_mapa.kml’, em um GeoJSON, ‘meu_mapa.geojson’ usando este link. Seguindo alguns passos deste belo tutorial aqui do Medium, você consegue visualizar o mapa e o dataset!
Importe a biblioteca de visualização Folium e defina uma figura:
import folium
fig = folium.Map(width=900, height=600)
Leia o arquivo ‘meu_mapa.geojson’ e o adicione na figura:
geo_json_mapa = json.load(open('meu_mapa.geojson'))
folium.Choropleth(
geo_data = geo_json_mapa,
fill_color = "steelblue",
fill_opacity = 0.4,
line_color = "steelblue",
line_opacity = 0.9
).add_to(fig)
Por fim, adicione seus pontos na figura!
pontos = localizacoes_geo[['latitude', 'longitude']].values.tolist()
for point in range(0, len(pontos)):
folium.Marker(locationlist[point]).add_to(fig)fig
Legal! Podemos ver que de fato somente um ponto está fora da nossa região KML, como o GeoPandas havia nos informado no GeoDataFrame localizacoes_geo!
Obrigada pela leitura e até a próxima!