Geojson não funciona no Folium(Python)

Boa tarde,
estou tentando fazer um mapa que usa a divisão de bairros de Belo Horizonte pelo Folium, no Python. Já fiz esse tipo de gráfico antes mas o geojson que encontrei no site da prefeitura de Belo Horizonte parece ter algo errado. Alguém sabe o que pode ser, ou tem um geojson com os limites da cidade disponível?

Ps: Uma coisa que percebi é que as coordenadas talves precisem do negativo na frente para indicar os hemisférios. Se souberem uma forma fácil de inverter isso talvez dê certo.

Esse é o link para o arquivo json
https://geoservicos.pbh.gov.br/geoserver/wfs?service=WFS&version=1.0.0&request=GetFeature&typeName=ide_bhgeo:BAIRRO&srsName=EPSG:31983&outputFormat=application%2Fjson

1 Curtida

Olá @gmg16

Eu conversei com um colega da Hungria fera em mapas, Mór Kapronczay. Uma das abordagens possíveis é primeiro ler a URL com o geopandas, testar com o matplotlib e aí usar o folium

Mas precisa de algumas tarefas:

  • O folium espera coordenadas de latitude longitude, mas esses dados da Prefeitura estão no EPSG 31983, que é um sistema de referência de coordenadas específico do Brasil (crs)

  • Você pode verificar isso com: gdf.crs
    Para converter em coordenadas lat-long, é necessário: gdf=gdf.to_crs(epsg=4326)

  • Também você precisa fornecer um parâmetro de bloco para o seu mapa funcionar. O Mór mostrou um exemplo com OpenStreetMap

  • Para ver também seus polígonos no mapa, você precisa adicioná-los ao mapa

Ele sugeriu ler este texto para aprender mais

Para adicionar os polígonos necessários:
folium.GeoJson(
gdf
).add_to(mymap)

O código ficou assim inteiro (usei Ubuntu):

import geopandas as gpd
import folium
import matplotlib.pyplot as plt

# Lê os dados
url = 'https://geoservicos.pbh.gov.br/geoserver/wfs?service=WFS&version=1.0.0&request=GetFeature&typeName=ide_bhgeo:BAIRRO&srsName=EPSG:31983&outputFormat=application%2Fjson'
gdf = gpd.read_file(url)

# Você pode agora ver os dados em formato df
gdf

# Verifica se os dados estão certos
fig, ax = plt.subplots(figsize=(10,10))
gdf.plot(ax=ax)

# Converte para lat-long
gdf = gdf.to_crs(epsg=4326)

# Faz o mapa
bh = gdf[['id','geometry', 'NOME']]
x_map=bh.geometry.centroid.x.mean()
y_map=bh.geometry.centroid.y.mean()
mymap = folium.Map(location=[y_map, x_map], zoom_start=11,tiles='OpenStreetMap')

# Adiciona polígonos
folium.GeoJson(
    gdf
    ).add_to(mymap)

mymap

Ele também colocou o código aqui

2 Curtidas

Acho que o principal ponto é o @reichaves falou da projeção, está em EPSG 31938, o que é fora da especificação geojson. Se você mudar pra 4326 deve rolar: https://geoservicos.pbh.gov.br/geoserver/wfs?service=WFS&version=1.0.0&request=GetFeature&typeName=ide_bhgeo:BAIRRO&srsName=EPSG:4326&outputFormat=application%2Fjson

2 Curtidas

@reichaves muito obrigado pela resposta e dedicação. Já tinha até desistido do meu mapa haha. Vou retomar a visualização aqui testando as orientação dos códigos. Realmente não era algo muito simples. Obrigado ao @bernardol também pela dica

Editado:
Voltei para dizer que rodei aqui e deu tudo certo. Obrigado mais uma vez

1 Curtida

boa @gmg16, depois conta pra gente como ce fez pra dar certo :wink: