Utilizando Python para verificar coordenadas geográficas em um mapa KML

Egmara Antunes dos Santos
4 min readJan 14, 2021

--

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] = check
localizacoes_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!

--

--

Egmara Antunes dos Santos
Egmara Antunes dos Santos

Written by Egmara Antunes dos Santos

Graduated in Industrial Mathematics | Data Scientist at Delivery Center|

No responses yet