คำนวณพื้นที่ทั้งหมดของรูปหลายเหลี่ยมใน shapefile โดยใช้ 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 เพื่อให้ได้พื้นที่รวมของรูปหลายเหลี่ยมทั้งหมดใน shapefile เป็นเฮกตาร์หรือไม่

ฉันสงสัยว่ามันเป็นไปได้ด้วย-sqlหรือเปล่า:

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

ERROR 1: Undefined function 'ST_Area' used.แต่พยายามที่ฉันได้รับ

ฉันเดาว่าฉันสามารถนำเข้า Shapefile ลงใน 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นี้จะช่วยให้ฉัน มันอยู่ในเฮกตาร์หรือหน่วยอื่น ๆ ไหม? และมันสำคัญว่าการฉายซอร์สโค้ดของฉันคืออะไร?
Richard

1
หน่วยวัดมาจากรูปทรงเรขาคณิตที่คุณคาดการณ์ดังนั้นจึงมีหน่วยเป็นตารางเมตร
Antonio Falciano

1
มีแนวโน้มมากที่สุดใน m ^ 2 หารด้วย 10,000 เพื่อเปลี่ยนเป็นเฮกตาร์
dmci

ขอบคุณ! ฉันเพิ่งพบเอกสาร: gdal.org/classOGRSurface.html#a3b2c3125ec8c0b3a986e43cd1056f9e4 ส่งคืนพื้นที่ของคุณลักษณะเป็นหน่วยสี่เหลี่ยมของระบบอ้างอิงเชิงพื้นที่ที่ใช้งานอยู่ ขออภัยที่เป็นผู้เริ่มต้นทั้งหมด แต่ในกรณีที่ฉันใช้ Shapefile ใน SRS อื่นฉันจะทราบได้อย่างไรว่าหน่วยสี่เหลี่ยมของ 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 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
ทำogrinfo -so -alแต่ @dmci ฉันไม่เข้าใจคำตอบของคุณหนึ่งบิต: สำหรับรูปร่างของ GDAL มีหนึ่งชั้นเสมอและชื่อของมันคือ basename ของ Shapefile คุณจะได้รับชื่อ "mytable" แทนที่จะเป็น "myshapefile" ได้อย่างไร
user30184

ขอบคุณ! ผลลัพธ์จากคำสั่งนั้นอยู่ในคำถามเดิม
Richard

@ user30184 - เห็นด้วยอย่างยิ่ง - แต่ฉันจำลองการตั้งชื่อที่ OP ใช้ในคำถามของพวกเขา เพื่อความสอดคล้องฉันได้อัปเดตคำตอบของตัวเองแล้ว
dmci

2
ตกลงดูเหมือนว่าเฉพาะไดรเวอร์ ไดรเวอร์บางตัวรายงานว่าคล้ายGeometry Column = GEOMETRYกับ ogrinfo -so -al แต่ไดรเวอร์ shapefile ไม่ได้ ด้วย shapefiles ฉันคิดว่าชื่อคือ "OGR_GEOMETRY" สำหรับภาษา OGR SQL (ดูฟิลด์พิเศษในgdal.org/ogr_sql.html ) และ "เรขาคณิต" สำหรับภาษา SQLite
30184

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.