Обчисліть загальну площу багатокутників у формі файла за допомогою GDAL?


11

У мене є прогнозова форма в британській проекті 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)

Чи можу я використовувати GDAL / OGR, щоб отримати загальну площу всіх багатокутників у формі форми, в гектарах?

Мені цікаво, чи можливо це за допомогою -sql, щось на кшталт:

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

Але намагаюся, що я отримую ERROR 1: Undefined function 'ST_Area' used..

Я думаю, я міг би імпортувати Shapefile у QGIS, додати атрибут області до кожного багатокутника, а потім підсумувати його, але я б скоріше скористався інструментом командного рядка, якщо це можливо.

Відповіді:


15

У SGR SQL існує спеціальне поле під назвою OGR_GEOM_AREA, яке повертає область геометрії функції:

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

де TOTAL_AREAодиниця виміру залежить від шару SRS (читайте коментарі нижче).


Дивовижний! Це дає мені SUM_OGR_GEOM_AREA (Real) = 4459037129.50955. Це в гектарах чи якась інша одиниця? І чи не має значення, в якій проекції знаходиться мій форматний файл джерела?
Річард

1
Одиниця виміру походить від того, як проектуються ваші геометрії, тому вони квадратні метри.
Антоніо Фальчіано

1
швидше за все, в m ^ 2, поділіть на 10000, щоб перетворити на гектари
dmci

Дякую! Щойно я знайшов docs: gdal.org/classOGRSurface.html#a3b2c3125ec8c0b3a986e43cd1056f9e4 Повертає область функції у квадратних одиницях просторової системи відліку, що використовується . Вибачте, що я є початківцем, але про всяк випадок, коли я використовую файл форми в іншому SRS, як я дізнаюся, які квадратні одиниці конкретного SRS?
Річард

1
Заглянувши у свій шар SRS WKT (тобто файл проекції), ви знайдете UNIT ["Метр", 1]]
Антоніо Фальчіано

6

Так, це можливо, але вам потрібно використовувати діалект OGR SQLite таким чином:

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

Також переконайтеся, що myshapefileце ім'я шару в myshapefile.shp. Це можна зробити так:

ogrinfo myshapefile.shp

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

Дякую! Насправді я бачу no such column: geometry. Як дізнатись, як називається стовпець геометрії? Це вихід 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
Є ogrinfo -so -alАле @dmci, я не розумію , один біт в вашій відповіді: для GDAL шейпфайл завжди один шар і його ім'я базове ім'я шейп файлу. Як ви можете отримати ім'я "mytable" замість "myshapefile"?
користувач30184

Дякую! Вихід з цієї команди знаходиться в початковому питанні.
Річард

@ user30184 - цілком згідний - але я реплікував конвенції про іменування, які ОП використовувала у своєму питанні. Для послідовності я оновив власну відповідь
dmci

2
Гаразд, здається, що це водій. Деякі драйвери повідомляють про це як Geometry Column = GEOMETRYз ogrinfo -so -al, але драйвер shapefile цього не робить. За допомогою форм-файлів я вважаю, що назва "OGR_GEOMETRY" для діалекту OGR SQL (див. Спеціальні поля в gdal.org/ogr_sql.html ) та "геометрія" для діалекту SQLite.
користувач30184

4

Використовуючи QGIS, ви можете запустити цей простий код для друку загальної площі форм-файлу (я припускаю, що ви оцінюєте область в прогнозованій системі відліку):

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.