1
resposta

Cálculo do centroid não funciona

Olá colegas, estou com difilculdade para resolver um problema que persiste quando fazemos o cálculo do centroid.

y= salvador.centroid.y.iloc[0]
x= salvador.centroid.x.iloc[0]

Esse código me retorna o seguinte UserWarning:

UserWarning: Geometry is in a geographic CRS. Results from 'centroid' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.

Procurei na net uma forma de solucionar mas não obtive êxito.

Tentei seguir essa solução:

https://gis.stackexchange.com/questions/372564/userwarning-when-trying-to-get-centroid-from-a-polygon-geopandas

1 resposta

Oii Vitor, como você está?

Sinto muito pela demora em obter um retorno.

O warning nada mais é do que um aviso, é uma mensagem que indica que em algum momento algo pode vir a gerar um erro, o que fará com que o código não seja executado, mas o warning por si só não impede a execução. Nesse trecho mostrado por você, por mais que o aviso seja gerado, o código continuará funcionando normalmente.

Esse warning é decorrente de atualizações da biblioteca geopandas e folium.

A tradução literal deste warning diz que temos que converter o CRS (Sistema de Referência Espacial) para que o cálculo da centróide seja mais preciso. E isso ocorre porque para calcular a centróide temos que trabalhar com um sistema de coordenadas projetado/plano, porém, estamos realizando essa operação em um sistema de coordenadas geográficas sem uma projeção definida.

Sendo assim, manteremos a conversão do CRS para o EPSG:4326, mas antes, para calcular a centróide faremos a conversão para um sistema de coordenadas planas, como o EPSG:31983 (SIRGAS 2000 / UTM zone 23S).

Em código teremos o seguinte (considere os espaços de um trecho ao outro como células do notebook):

%matplotlib inline
import pandas as pd
import geopandas as gpd
import folium

rj = gpd.read_file('../01.Dados/Mapas/RJ-MUNIC/RJ-MUNIC.shp')
geo_dados = gpd.read_file('../01.Dados/Mapas/RJ-DATASET/DATASET.shp')
setor = gpd.read_file('../01.Dados/Mapas/RJ-SETOR/RJ-SETOR.shp')
bairro = gpd.read_file('../01.Dados/Mapas/RJ-BAIRRO/RJ-BAIRRO.shp')

setor = setor.fillna(0)

rj =rj.to_crs(epsg=4326)
print(rj.crs)
rj.head()

rj = rj.to_crs(epsg=32723)

valores_centroid = rj.centroid.to_crs(epsg=4326)
valores_centroid

x = valores_centroid.x.iloc[0]
y = valores_centroid.y.iloc[0]
x, y


rj = rj.to_crs(epsg=4326)
rj

base = folium.Map([y,x], zoom_start=11, tiles='OpenStreetMap')
folium.Choropleth(rj).add_to(base)
base

Resultado:

Imagem que mostra o jupyter notebook aberto com o código mostrado acima e o respectivo resultado da execução, que possui um mapa do rio de janeiro na cor roxa

A título de reforço dos conceitos, recomendo a aula Sistema de coordenadas do curso de GeoPandas Parte 1: Trabalhando com dados Geoespaciais que aborda a diferença dos tipos de planos.

Qualquer dúvida fico à disposição.

Grande abraço!