34 votos

Obtención de áreas de polígonos mediante GeoPandas

Dada una GeoPandas GeoDataFrame que contiene una serie de polígonos, me gustaría obtener el área en km2 de cada característica de mi lista.

Este es un problema bastante común, y la solución habitual sugerida en el pasado ha sido utilizar shapely y pyproj directamente (por ejemplo aquí y aquí ).

¿Hay alguna manera de hacer esto en GeoPandas puro?

35voto

GreyCat Puntos 146

Si se conoce el crs del GeoDataFrame (EPSG:4326 unit=degree, aquí), no necesita Shapely, ni pyproj en su script porque GeoPandas los utiliza).

import geopandas as gpd
test = gpd.read_file("test_wgs84.shp")
print test.crs
test.head(2)

enter image description here

Ahora copia tu GeoDataFrame y cambia la proyección a un sistema cartesiano (EPSG:3857, unidad= m como en la respuesta de ResMar)

tost = test.copy()
tost= tost.to_crs({'init': 'epsg:3857'})
print tost.crs
tost.head(2)

enter image description here

Ahora la superficie en kilómetros cuadrados

tost["area"] = tost['geometry'].area/ 10**6
tost.head(2)

enter image description here

Pero las superficies en la proyección Mercator no son correctas, así que con otra proyección en metros.

tost= tost.to_crs({'init': 'epsg:32633'})
tost["area"] = tost['geometry'].area/ 10**6
tost.head(2)

enter image description here

10voto

Chuck Puntos 1

Sí, simplemente asegúrese de reproyectar su forma en Cilindro de igual área formato con {'proj':'cea'} que preservan la medida del área.

Entonces puede utilizar .area de su GeoDataFrame.

También hay que dividir por 1000000 porque .area dan la superficie en metros cuadrados.

import geopandas as gpd

gdf = gpd.read_file("YOUR_SHAPE_FILE.shp")
gdf = gdf['geometry'].to_crs({'proj':'cea'}) 

gdf.area / 10**6

9voto

netcoder Puntos 558

Creo que sí. Lo siguiente debería funcionar:

gdf['geometry'].to_crs({'init': 'epsg:3395'})\
               .map(lambda p: p.area / 10**6)

Esto convierte la geometría en una proyección de igual área, obtiene el shapely (devuelto en m^2), y lo mapea a un km^2 (este último paso es opcional).

0voto

Praveen Puglia Puntos 161

Sólo una idea rápida sobre el código EPSG apropiado para una estimación de igual área - 6933 puede ser una mejor solución "genérica" (ver https://epsg.io/6933 / https://www.mdpi.com/2220-9964/1/1/32 )

No es la solución perfecta por razones obvias, pero el 6933 parece fusionar muy bien las ventajas de un área de cea y de Lambert.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X