Calcola l'area totale dei poligoni nello shapefile usando GDAL?


11

Ho uno shapefile nella proiezione della 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)

Posso usare GDAL / OGR per ottenere l'area totale di tutti i poligoni nel file di forma, in ettari?

Mi chiedo se questo è possibile con -sqlqualcosa del tipo:

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

Ma provando che ottengo ERROR 1: Undefined function 'ST_Area' used..

Immagino di poter importare lo Shapefile in QGIS, aggiungere un attributo area a ciascun poligono e quindi sommarlo, ma preferirei utilizzare uno strumento da riga di comando, se possibile.

Risposte:


15

C'è un campo speciale in OGR SQL chiamato OGR_GEOM_AREA che restituisce l'area della geometria della funzione:

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

dove l' TOTAL_AREAunità di misura dipende dallo strato SRS (leggi i commenti sotto).


Sorprendente! Questo mi dà SUM_OGR_GEOM_AREA (Real) = 4459037129.50955. È in ettari o in qualche altra unità? E importa in quale proiezione è il mio shapefile sorgente?
Richard,

1
L'unità di misura deriva da come sono proiettate le tue geometrie, quindi sono metri quadrati.
Antonio Falciano,

1
molto probabilmente in m ^ 2, dividi per 10000 per convertire in ettari
dmci

Grazie! Ho appena trovato i documenti: gdal.org/classOGRSurface.html#a3b2c3125ec8c0b3a986e43cd1056f9e4 Restituisce l'area della funzione in unità quadrate del sistema di riferimento spaziale in uso . Mi dispiace essere un principiante assoluto, ma nel caso in cui sto usando uno shapefile in un SRS diverso, come faccio a sapere quali sono le unità quadrate di un particolare SRS?
Richard,

1
Guardando nel tuo layer SRS WKT (ovvero il file di proiezione), troverai UNIT ["Meter", 1]]
Antonio Falciano

6

Sì, è possibile, ma è necessario utilizzare il dialetto OGR SQLite come segue:

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

Inoltre, assicurati che myshapefilesia il nome del livello in myshapefile.shp. Puoi farlo come segue:

ogrinfo myshapefile.shp

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

Grazie! In realtà vedo no such column: geometry. Come faccio a sapere come viene chiamata la colonna geometrica? Questa è l'uscita di 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
Do ogrinfo -so -al@dmci, non capisco un po 'nella tua risposta: per i shapefile GDAL hanno sempre un layer e il suo nome è il basename del shapefile. Come puoi ottenere il nome "mytable" anziché "myshapefile"?
user30184

Grazie! L'output di quel comando è nella domanda originale.
Richard,

@ user30184 - sono assolutamente d'accordo - ma stavo replicando le convenzioni di denominazione utilizzate dall'OP nella loro domanda. Per coerenza, ho aggiornato la mia risposta
dmci

2
Ok, sembra essere specifico del driver. Alcuni driver lo segnalano come Geometry Column = GEOMETRYcon ogrinfo -so -al ma il driver shapefile no. Con gli shapefile suppongo che il nome sia "OGR_GEOMETRY" per il dialetto SQL OGR (vedi campi speciali in gdal.org/ogr_sql.html ) e "geometria" per il dialetto SQLite.
user30184

4

Utilizzando QGIS, è possibile eseguire questo semplice codice per stampare l'area totale del file di forma (suppongo che si stia valutando l'area in un sistema di riferimento proiettato):

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.