使用GDAL计算shapefile中多边形的总面积?


11

我在英国国家网格投影中有一个shapefile:

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来获取shapefile中所有多边形的总面积(以公顷为单位)吗?

我想知道是否可以使用-sql,例如:

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

但是,尝试让我得到ERROR 1: Undefined function 'ST_Area' used.

我想我可以将Shapefile导入QGIS,为每个多边形添加一个area属性,然后对其求和,但是如果可能的话,我宁愿使用命令行工具。

Answers:


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。这是公顷还是其他单位?我的源shapefile位于哪个投影中,这有关系吗?
理查德(Richard)

1
度量单位取决于几何的投影方式,因此它们是平方米。
Antonio Falciano

1
最有可能以m ^ 2为单位,除以10000以转换为公顷
dmci

谢谢!我刚刚找到了以下文档:gdal.org/classOGRSurface.html#a3b2c3125ec8c0b3a986e43cd1056f9e4 以使用的空间参考系统的平方单位返回要素的面积。抱歉,我是一个初学者,但万一我在其他SRS中使用shapefile时,如何确定特定SRS的平方单位是什么?
理查德(Richard)

1
查看SRS WKT图层(即投影文件),您会发现UNIT [“ Meter”,1]]
Antonio Falciano

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 1OGRFeature(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
难道ogrinfo -so -al但@dmci,我不明白你的答案一个比特:用于GDAL shape文件始终一层,它的名字是shape文件的基本名称。如何获得名称“ mytable”而不是“ myshapefile”?
user30184 '17

谢谢!该命令的输出位于原始问题中。
理查德(Richard)

@ user30184-完全同意-但我复制了OP在他们的问题中使用的命名约定。为了保持一致,我更新了自己的答案
dmci

2
好的,这似乎是特定于驱动程序的。一些驱动程序像Geometry Column = GEOMETRY使用ogrinfo -so -al进行报告一样,但是shapefile驱动程序却没有。对于shapefile,我假设OGR SQL方言的名称为“ OGR_GEOMETRY”(请参见gdal.org/ogr_sql.html中的特殊字段),SQLite方言的名称为“ geometry”。
user30184 '17

4

使用QGIS,您可以运行以下简单代码来打印shapefile的总面积(我假设您正在评估投影参考系统中的面积):

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.