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

11

Tengo un shapefile en la proyección de British National Grid:

Geometry: 3D Polygon
Feature Count: 5378
Extent: (9247.520209, 14785.170099) - (638149.173223, 1217788.569952)
Layer 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: Integer (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 -sqlalgo como:

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

Pero tratando de conseguirlo ERROR 1: Undefined function 'ST_Area' used..

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

Ricardo
fuente

Respuestas:

15

Hay 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 TOTAL_AREAunidad de medida depende de la capa SRS (lea los comentarios a continuación).

Antonio Falciano
fuente
¡Asombroso! Esto me da SUM_OGR_GEOM_AREA (Real) = 4459037129.50955. ¿Está en hectáreas o en alguna otra unidad? ¿Y importa en qué proyección se encuentre mi archivo de forma fuente?
Richard
1
La unidad de medida se deriva de cómo se proyectan sus geometrías, por lo que son metros cuadrados.
Antonio Falciano
1
muy probablemente en m ^ 2, dividir por 10000 para convertir a hectáreas
dmci
¡Gracias! Acabo de encontrar los documentos: gdal.org/classOGRSurface.html#a3b2c3125ec8c0b3a986e43cd1056f9e4 Devuelve el área de la entidad en unidades cuadradas del sistema de referencia espacial en uso . Lamento ser un principiante total, pero en caso de que esté usando un shapefile en un SRS diferente, ¿cómo puedo saber cuáles son las unidades cuadradas de un SRS en particular?
Richard
1
Mirando en su capa SRS WKT (es decir, el archivo de proyección), encontrará UNIT ["Meter", 1]]
Antonio Falciano
6

Sí, es posible, pero debe usar el dialecto OGR SQLite de la siguiente manera:

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

Además, asegúrese de que myshapefilesea ​​el nombre de la capa en myshapefile.shp. Puede hacer esto de la siguiente manera:

ogrinfo myshapefile.shp

INFO: Open of `myshapefile.shp`
    using driver `ESRI Shapefile' successful.
1: myshapefile (Polygon)
dmci
fuente
¡Gracias! En realidad ya veo no such column: geometry. ¿Cómo averiguo cómo se llama la columna de geometría? Esta es la salida 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)).
Richard
1
Hacer ogrinfo -so -alPero @dmci, que no entiendo un bit en su respuesta: para archivos de forma GDAL tener siempre una capa y su nombre es el nombre base del archivo de formas. ¿Cómo puede obtener el nombre "mytable" en lugar de "myshapefile"?
user30184
¡Gracias! El resultado de ese comando está en la pregunta original.
Richard
@ user30184 - totalmente de acuerdo - pero estaba replicando las convenciones de nomenclatura que el OP había usado en su pregunta. Por coherencia, he actualizado mi propia respuesta
dmci
2
Ok, parece ser específico del controlador. Algunos controladores lo informan como Geometry Column = GEOMETRYcon ogrinfo -so -al pero el controlador shapefile no. Con shapefiles, supongo que el nombre es "OGR_GEOMETRY" para el dialecto SQL de OGR (ver campos especiales en gdal.org/ogr_sql.html ) y "geometría" para el dialecto SQLite.
user30184
4

Con QGIS, puede ejecutar este código simple para imprimir el área total del archivo de forma (supongo que está evaluando el área en un sistema de referencia proyectado):

from qgis.core import *

filepath = 'C:/Users/path_to_the_shapefile/shapefile.shp'
layer = QgsVectorLayer(filepath, 'layer' , 'ogr')

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

print area # total area in square meters

print area/10000 # total area in hectares
mgri
fuente