GDALを使用してシェープファイル内のポリゴンの総面積を計算しますか?


11

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)

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_GEOM_AREAと呼ばれるOGR SQLには、フィーチャのジオメトリの領域を返す特別なフィールドがあります。

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

ありがとう!私はちょうどドキュメントを見つけました:gdal.org/classOGRSurface.html#a3b2c3125ec8c0b3a986e43cd1056f9e4 使用中の空間参照系の平方単位でフィーチャの面積を返します。まったくの初心者で申し訳ありませんが、別のSRSでシェープファイルを使用している場合に備えて、特定のSRSの平方単位をどのように知ることができますか?
リチャード

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))
リチャード

1
やるogrinfo -so -alしかし@dmciは、私はあなたの答えの1ビットを理解していない:GDALのシェープファイルは常に一つの層があり、その名前はシェープファイルのベース名です。「myshapefile」の代わりに「mytable」という名前を取得するにはどうすればよいですか?
user30184

ありがとう!そのコマンドからの出力は元の質問にあります。
リチャード

@ user30184-完全に同意します-しかし、私はOPが彼らの質問で使用していた命名規則を複製していました。一貫性のために、私は自分の答えを更新しました
-dmci

2
わかりました、それはドライバー特有のようです。一部のドライバーGeometry Column = GEOMETRYはogrinfo -so -alで報告しますが、シェープファイルドライバーでは報告しません。シェープファイルでは、名前はOGR SQLダイアレクトの場合は「OGR_GEOMETRY」(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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.