Рассчитать общую площадь полигонов в шейп-файле, используя GDAL?


11

У меня есть шейп-файл в британской национальной проекции сетки:

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..

Думаю, я мог бы импортировать шейп-файл в QGIS, добавить атрибут площади к каждому многоугольнику и затем суммировать его, но я бы предпочел использовать инструмент командной строки, если это возможно.

Ответы:


15

В OGR 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
скорее всего, в м ^ 2, разделите на 10000, чтобы перевести в гектары
dmci

Благодаря! Я только что нашел документы: gdal.org/classOGRSurface.html#a3b2c3125ec8c0b3a986e43cd1056f9e4 Возвращает площадь объекта в квадратных единицах используемой системы пространственной привязки . Извините, что я новичок, но на всякий случай я использую шейп-файл в другом SRS, как мне узнать, каковы квадратные единицы измерения определенного SRS?
Ричард

1
Посмотрев в свой слой SRS WKT (то есть файл проекции), вы найдете UNIT ["Meter", 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»?
user30184

Благодаря! Вывод этой команды находится в исходном вопросе.
Ричард

@ user30184 - полностью согласен - но я тиражировал соглашения об именах, которые ОП использовал в своем вопросе. Для согласованности я обновил свой собственный ответ
dmci

2
Хорошо, похоже, это зависит от драйвера. Некоторые драйверы сообщают об этом как Geometry Column = GEOMETRYс ogrinfo -so -al, но драйвер шейп-файла этого не делает. С шейп-файлами я предполагаю, что имя «OGR_GEOMETRY» для диалекта OGR SQL (см. Специальные поля в gdal.org/ogr_sql.html ) и «геометрия» для диалекта SQLite.
user30184

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.