13 votos

Calcular el área total de los polígonos en el shapefile usando GDAL.

Tengo un shapefile en proyección British National Grid:

Geometría: Polígono 3D
Recuento de entidades: 5378
Extensión: (9247.520209, 14785.170099) - (638149.173223, 1217788.569952)
Capa SRS WKT:
PROJCS["British_National_Grid",
    GEOGCS["GCS_airy",
        DATUM["OSGB_1936",
            SPHEROID["Airy_1830",6377563.396,299.3249646]],
        PRIMEM["Greenwich",0],
        UNIT["Degree",0.017453292519943295]],
    PROJECTION["Transverse_Mercator"],
    PARAMETER["latitude_of_origin",49],
    PARAMETER["central_meridian",-2],
    PARAMETER["scale_factor",0.9996012717],
    PARAMETER["false_easting",400000],
    PARAMETER["false_northing",-100000],
    UNIT["Meter",1]]
cat: Entero (9.0)

¿Puedo usar GDAL/OGR para obtener el área total de todos los polígonos en el shapefile, en hectáreas?

Me pregunto si esto es posible con -sql, algo así como:

ogrinfo -sql "SELECT SUM(ST_Area(geom::geography)) FROM mytable" myshapefile.shp

Pero al intentarlo obtengo ERROR 1: Undefined function 'ST_Area' used..

Supongo que podría importar el Shapefile en QGIS, agregar un atributo de área a cada polígono y luego sumarlo, pero preferiría usar una herramienta de línea de comandos si es posible.

18voto

Nikola Puntos 21

Existe un campo especial en OGR SQL llamado OGR_GEOM_AREA que devuelve el área de la geometría de la entidad:

ogrinfo -sql "SELECT SUM(OGR_GEOM_AREA) AS TOTAL_AREA FROM myshapefile" myshapefile.shp

donde la unidad de medida de TOTAL_AREA depende del SRS de la capa (lee los comentarios abajo).

1 votos

¡Increíble! Esto me da SUM_OGR_GEOM_AREA (Real) = 4459037129.50955. ¿Esto está en hectáreas u otra unidad? ¿Y importa en qué proyección esté mi shapefile de origen?

2 votos

La unidad de medida se deriva de cómo se proyectan tus geometrías, por lo que son metros cuadrados.

2 votos

Probablemente en m^2, divida por 10000 para convertir a hectáreas

9voto

Peter Kahn Puntos 1860

Sí, es posible, pero necesitas usar el dialecto SQLite de OGR como sigue:

ogrinfo -dialect SQLite -sql 'SELECT SUM(ST_Area(geometry))/10000 FROM myshapefile' myshapefile.shp

También asegúrate de que myshapefile sea el nombre de la capa en myshapefile.shp. Puedes hacer esto de la siguiente manera:

ogrinfo myshapefile.shp

INFO: Open of `myshapefile.shp`
    using driver `ESRI Shapefile' successful.
1: myshapefile (Polygon)

0 votos

¡Gracias! En realidad veo no such column: geometry. ¿Cómo puedo averiguar cómo se llama la columna de geometría? Este es el resultado de ogrinfo -al -fid 1: OGRFeature(mylayer):1 cat (Integer) = 2 POLYGON ((463267.036276041297242 1216886.583904854720458 0,463267.693611663184129 1216956.525473011657596 0,463405.369117364054546 1216820.109560555079952 0,463404.712737055611797 1216750.1665881925728170,463267.036276041297242 1216886.583904854720458 0,463267.036276041297242 1216886.583904854720458 0)).

1 votos

¿Hacer ogrinfo -so -al Pero @dmci, no entiendo ni una palabra de tu respuesta: para los shapefiles de GDAL siempre tienen una capa y su nombre es igual al nombre base del shapefile. ¿Cómo puedes obtener el nombre "mytable" en lugar de "myshapefile"?

0 votos

¡Gracias! La salida de ese comando está en la pregunta original.

4voto

Geoffrey Puntos 228

Usando QGIS, puedes ejecutar este código simple para imprimir el área total del archivo de formas (asumo que estás evaluando el área en un sistema de referencia proyectado):

from qgis.core import *

filepath = 'C:/Usuarios/ruta_al_archivo_de_formas/archivo_de_formas.shp'
capa = QgsVectorLayer(filepath, 'capa' , 'ogr')

area = 0
for feat in capa.getFeatures():
    area += feat.geometry().area()

print area # área total en metros cuadrados

print area/10000 # área total en hectáreas

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