Ei! Tudo bem, William?
Seu código está bem encaminhado, o que precisa adicionar ou ajustar:
- Importe o
Point
do Shapely
:
from shapely.geometry import Point
- Depois, a mudança de CRS para UTM em quilômetros: seu código lê o
GeoJSON
do metrô e o redefine para o mesmo CRS (redundante). No do instrutor, por exemplo, assume o arquivo em 4326 e muda ambos os GeoDataFrames
para uma projeção UTM personalizada com unidades em km (zona 23 sul, elipsoide GRS80). Isso é crucial para calcular distâncias em km de forma precisa. Após criar gdf
e ler metro, adicione:
utm_crs = '+proj=utm +zone=23 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=km +no_defs'
gdf = gdf.to_crs(utm_crs)
metro = metro.to_crs(utm_crs)
Sem isso, as distâncias saem em graus decimais, não em km.
- Criação das colunas com cálculos de distância: seu código para aí, mas o instrutor aplica funções lambda para calcular:
gdf['Metro_Perto'] = gdf['geometry'].apply(lambda x: metro['nome'].iloc[metro.distance(x).idxmin()])
gdf['Dist_Min'] = gdf['geometry'].apply(lambda x: "{0:.2f} km".format(metro.distance(x).min()))
gdf['Metro_Longe'] = gdf['geometry'].apply(lambda x: metro['nome'].iloc[metro.distance(x).idxmax()])
gdf['Dist_Max'] = gdf['geometry'].apply(lambda x: "{0:.2f} km".format(metro.distance(x).max()))
- Finalize para exibir o resultado:
print(gdf[['Metro_Perto', 'Dist_Min', 'Metro_Longe', 'Dist_Max']])
Retorno:

Essa é uma das formas para obter o retorno adequado de acordo com o solicitado na atividade. Deixo aqui o notebook usado para teste: https://colab.research.google.com/drive/1jbOOvCPbNq6mREEP3QyzJWMVkzPO9Rn8?usp=sharing
Espero ter ajudado e qualquer dúvida, compartilhe no fórum.
Até mais!
Caso este post tenha lhe ajudado, por favor, marcar como solucionado!