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.

मुझे लगता है कि मैं क्यूजीआईएस में शेपफाइल को आयात कर सकता हूं, प्रत्येक बहुभुज के लिए एक क्षेत्र विशेषता जोड़ सकता हूं, और फिर इसे योग कर सकता हूं, लेकिन यदि संभव हो तो मैं कमांड लाइन टूल का उपयोग करूंगा।

जवाबों:


15

वहाँ OGR एसक्यूएल में एक विशेष क्षेत्र कहा जाता है 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 उपयोग में स्थानिक संदर्भ प्रणाली की वर्ग इकाइयों में सुविधा का क्षेत्र देता है । कुल शुरुआत करने के लिए क्षमा करें, लेकिन सिर्फ एक मामले में मैं एक अलग एसआरएस में एक आकृति का उपयोग कर रहा हूं, मुझे कैसे पता चलेगा कि किसी विशेष एसआरएस की वर्ग इकाइयां क्या हैं?
रिचर्ड

1
आपकी परत SRS WKT (अर्थात प्रोजेक्शन फाइल) को देखते हुए, आपको UNIT ["मीटर", 1]] मिलेगा
एंटोनियो फाल्कियानो

6

हां, यह संभव है, लेकिन आपको निम्नानुसार ओजीआर 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
Do ogrinfo -so -alBut @dmci, मुझे आपके उत्तर में एक बिट समझ में नहीं आती है: GDAL के लिए आकृति के आकार में हमेशा एक परत होती है और इसका नाम आकृति का आधार है। आप "myshapefile" के बजाय "mytable" नाम कैसे प्राप्त कर सकते हैं?
user30184

धन्यवाद! उस आदेश से आउटपुट मूल प्रश्न में है।
रिचर्ड

@ user30184 - पूरी तरह से सहमत हैं - लेकिन मैं उन नामकरण सम्मेलनों की नकल कर रहा था जो ओपी ने अपने प्रश्न में इस्तेमाल किए थे। स्थिरता के लिए, मैंने अपना जवाब
dmci

2
ठीक है, यह ड्राइवर विशिष्ट लगता है। कुछ ड्राइवर इसे Geometry Column = GEOMETRYओग्रीनो-एसो -लाल के साथ रिपोर्ट करते हैं, लेकिन शेपफाइल ड्राइवर नहीं करता है। आकृतिफाइल्स के साथ मुझे लगता है कि 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.