GDAL kullanarak şekil dosyasındaki çokgenlerin toplam alanını hesapla?


11

İngiliz Ulusal Izgara projeksiyonunda bir şekil dosyam var:

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)

Şekil dosyasındaki tüm çokgenlerin toplam alanını hektar olarak almak için GDAL / OGR kullanabilir miyim?

Bunun mümkün olup olmadığını merak ediyorum -sql:

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

Ama almaya çalışıyorum ERROR 1: Undefined function 'ST_Area' used..

Sanırım Shapefile QGIS içine almak, her çokgene bir alan özniteliği eklemek ve daha sonra toplamı, ama ben mümkünse bir komut satırı aracı kullanmak istiyorum.

Yanıtlar:


15

OGR SQL'de , özelliğin geometrisinin alanını döndüren OGR_GEOM_AREA adlı özel bir alan vardır :

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

burada TOTAL_AREAölçü birimi SRS katmanına bağlıdır (aşağıdaki yorumları okuyun).


İnanılmaz! Bu bana verir SUM_OGR_GEOM_AREA (Real) = 4459037129.50955. Bu hektar mı yoksa başka bir birimde mi? Kaynak şekil dosyamın hangi projeksiyonda olduğu önemli mi?
Richard

1
Ölçü birimi, geometrilerinizin nasıl yansıtıldığından kaynaklanır, bu yüzden metrekaredir.
Antonio Falciano

1
büyük olasılıkla m ^ 2, bölmek 10000 ile hektar
dmci

Teşekkürler! Dokümanları yeni buldum: gdal.org/classOGRSurface.html#a3b2c3125ec8c0b3a986e43cd1056f9e4 Kullanımdaki uzamsal referans sisteminin kare birimlerindeki özelliğin alanını döndürür . Toplam bir acemi olduğum için üzgünüm, ancak farklı bir SRS'de bir şekil dosyası kullanıyorsam, belirli bir SRS'nin kare birimlerinin ne olduğunu nasıl bulabilirim?
Richard

1
SRS WKT katmanınıza (yani projeksiyon dosyasına) baktığınızda, UNIT ["Meter", 1]]
Antonio Falciano

6

Evet, mümkündür, ancak OGR SQLite lehçesini aşağıdaki gibi kullanmanız gerekir :

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

Ayrıca, myshapefilekatman adının da olduğundan emin olun myshapefile.shp. Bunu aşağıdaki gibi yapabilirsiniz:

ogrinfo myshapefile.shp

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

Teşekkürler! Aslında görüyorum no such column: geometry. Geometri sütununa ne dendiğini nasıl öğrenebilirim? Bu çıktısıdır 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 -alBut @dmci, cevabınızda bir bit anlamıyorum: GDAL şekil dosyalarının her zaman bir katmanı vardır ve adı şekil dosyasının temel adıdır. "Myshapefile" yerine "mytable" adını nasıl alabilirsiniz?
user30184

Teşekkürler! Bu komutun çıktısı orijinal sorudur.
Richard

@ user30184 - tamamen katılıyorum - ama OP'nin sorularında kullandığı adlandırma kurallarını taklit ediyordum. Tutarlılık için kendi
yanıtımı

2
Tamam, sürücüye özgü gibi görünüyor. Bazı sürücüler Geometry Column = GEOMETRYogrinfo -so -al ile bildirir ancak shapefile sürücüsü bildirmez . Shapefiles ile adın OGR SQL lehçesi için "OGR_GEOMETRY" olduğunu ( gdal.org/ogr_sql.html'deki özel alanlara bakın ) ve SQLite lehçesi için "geometri" olduğunu varsayalım .
user30184

4

QGIS kullanarak, şekil dosyasının toplam alanını yazdırmak için bu basit kodu çalıştırabilirsiniz (öngörülen referans sistemindeki alanı değerlendirdiğinizi varsayıyorum):

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.