Tính tổng diện tích đa giác trong shapefile bằng GDAL?


11

Tôi có một shapefile trong phép chiếu lưới quốc gia Anh:

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)

Tôi có thể sử dụng GDAL / OGR để có được tổng diện tích của tất cả các đa giác trong shapefile, tính bằng ha không?

Tôi đang tự hỏi nếu điều này là có thể với -sql, một cái gì đó như:

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

Nhưng cố gắng mà tôi nhận được ERROR 1: Undefined function 'ST_Area' used..

Tôi đoán rằng tôi có thể nhập Shapefile vào QGIS, thêm thuộc tính area cho mỗi đa giác, sau đó tổng hợp nó, nhưng tôi sẽ sử dụng một công cụ dòng lệnh nếu có thể.

Câu trả lời:


15

Có một trường đặc biệt trong OGR SQL được gọi là OGR_GEOM_AREA trả về diện tích hình học của đối tượng địa lý:

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

trong đó TOTAL_AREAđơn vị đo phụ thuộc bởi lớp SRS (đọc các bình luận bên dưới).


Kinh ngạc! Điều này mang lại cho tôi SUM_OGR_GEOM_AREA (Real) = 4459037129.50955. Đây là trong ha hoặc một số đơn vị khác? Và có vấn đề gì khi chiếu shapefile nguồn của tôi không?
Richard

1
Đơn vị đo xuất phát từ cách hình học của bạn được chiếu, vì vậy chúng là mét vuông.
Antonio Falciano

1
rất có thể trong m ^ 2, chia cho 10000 để chuyển đổi sang ha
dmci

Cảm ơn! Tôi vừa tìm thấy các tài liệu: gdal.org/ classOGRSurface.html#a3b2c3125ec8c0b3a986e43cd1056f9e4 Trả về diện tích của tính năng theo đơn vị vuông của hệ thống tham chiếu không gian đang sử dụng . Xin lỗi để trở thành người mới bắt đầu, nhưng chỉ trong trường hợp tôi đang sử dụng một shapefile trong một SRS khác, làm thế nào để tôi tìm ra các đơn vị vuông của một SRS cụ thể là gì?
Richard

1
Nhìn vào lớp SRS WKT của bạn (tức là tệp chiếu), bạn sẽ tìm thấy ĐƠN VỊ ["Máy đo", 1]]
Antonio Falciano

6

Có, có thể, nhưng bạn cần sử dụng phương ngữ OGR SQLite như sau:

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

Ngoài ra, đảm bảo rằng đó myshapefilelà tên lớp trong myshapefile.shp. Bạn có thể làm điều này như sau:

ogrinfo myshapefile.shp

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

Cảm ơn! Thật ra tôi thấy no such column: geometry. Làm thế nào để tôi tìm ra cột hình học được gọi là gì? Đây là đầu ra của 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
Làm ogrinfo -so -alnhưng @dmci, tôi không hiểu một chút nào trong câu trả lời của bạn: đối với các shapefile GDAL luôn có một lớp và tên của nó là tên cơ sở của shapefile. Làm thế nào bạn có thể nhận được tên "mytable" thay vì "myshapefile"?
dùng49584

Cảm ơn! Đầu ra từ lệnh đó là trong câu hỏi ban đầu.
Richard

@ user30184 - hoàn toàn đồng ý - nhưng tôi đã sao chép các quy ước đặt tên mà OP đã sử dụng trong câu hỏi của họ. Để thống nhất, tôi đã cập nhật câu trả lời của riêng mình
dmci

2
Ok, nó có vẻ là trình điều khiển cụ thể. Một số trình điều khiển báo cáo nó giống như Geometry Column = GEOMETRYvới ogrinfo -so -al nhưng trình điều khiển shapefile thì không. Với shapefiles, tôi cho rằng tên đó là "OGR_GEOMETRY" cho phương ngữ SQL OGR (xem các trường đặc biệt trong gdal.org/ogr_sql.html ) và "hình học" cho phương ngữ SQLite.
dùng49584

4

Sử dụng QGIS, bạn có thể chạy mã đơn giản này để in tổng diện tích của shapefile (Tôi giả sử bạn đang đánh giá khu vực trong một hệ thống tham chiếu dự kiến):

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.