यह निर्धारित करते हुए कि OGR / GDAL का उपयोग करके पाइथन में शेपफाइल और रैस्टर ओवरलैप होता है? [बन्द है]


9

मैं OGR / GDAL का उपयोग करके अजगर में एक स्क्रिप्ट का निर्माण कर रहा हूं।

मेरे पास शेपफाइल्स का एक सेट है और जियोफाई रिफस्टर फाइलों का एक सेट है।

मुझे लगता है कि अगर वे रेखापुंज क्षेत्र के साथ प्रतिच्छेद नहीं करते हैं तो मैं अपनी स्क्रिप्ट को आकार की अनदेखी करना चाहूंगा।

शेपफाइल एक आयत नहीं है, इसलिए मैं केवल xmin / xmax, ymin / ymax मानों की तुलना परत द्वारा नहीं कर सकता। GetExtent ()। मुझे वास्तविक बहुभुज की आवश्यकता है, जो समग्र आकार का प्रतिनिधित्व करता है, और फिर यह निर्धारित करने का कोई तरीका है कि यदि बहुभुज रेखापुंज वर्ग के साथ प्रतिच्छेद करता है।

मैं सोच रहा था कि मैं किसी भी आकृति में सभी बहुभुजों को एक विशेषता में विलय कर सकता हूं, और फिर उस सुविधा पर ज्यामिति पढ़ सकता हूं, और फिर उस जानकारी की तुलना रास्टर सीमा तक कर सकता हूं। हालांकि, मैं विशेष रूप से अनिश्चित हूं कि इसे कैसे निष्पादित किया जाए।

  1. शेपफाइल से बॉर्डर पॉलीगॉन की जानकारी कैसे निकालें?
  2. यह कैसे निर्धारित किया जाए कि बहुभुज किसी दिए गए वर्ग क्षेत्र को काटता है या नहीं?

मैं ओसेगो से परिचित नहीं हूं, लेकिन आर्कपी समतुल्य (हो सकता है) इसमें शामिल हैं: रेखापुंज सीमा को पढ़ें, मेमोरी में बहुभुज को कवर करना, आकृति के माध्यम से चक्र बनाना, प्रत्येक को एक हद तक आयताकार करना, कुछ भी परिणाम होने पर परीक्षण करना।
फ्लोएम

जवाबों:


17

निम्नलिखित स्क्रिप्ट एक रेखापुंज के बाउंडिंग बॉक्स को निर्धारित करती है और बाउंडिंग बॉक्स को एक ज्यामिति के आधार पर बनाती है।

import ogr, gdal

raster = gdal.Open('sample.tif')
vector = ogr.Open('sample.shp')

# Get raster geometry
transform = raster.GetGeoTransform()
pixelWidth = transform[1]
pixelHeight = transform[5]
cols = raster.RasterXSize
rows = raster.RasterYSize

xLeft = transform[0]
yTop = transform[3]
xRight = xLeft+cols*pixelWidth
yBottom = yTop-rows*pixelHeight

ring = ogr.Geometry(ogr.wkbLinearRing)
ring.AddPoint(xLeft, yTop)
ring.AddPoint(xLeft, yBottom)
ring.AddPoint(xRight, yTop)
ring.AddPoint(xRight, yBottom)
ring.AddPoint(xLeft, yTop)
rasterGeometry = ogr.Geometry(ogr.wkbPolygon)
rasterGeometry.AddGeometry(ring)

अगला, वेक्टर बहुभुज की ज्यामिति निर्धारित की जाती है। यह आपके पहले प्रश्न का उत्तर देता है।

# Get vector geometry
layer = vector.GetLayer()
feature = layer.GetFeature(0)
vectorGeometry = feature.GetGeometryRef()

अंतिम, वेक्टर और रेखापुंज की ज्यामिति को चौराहे (रिटर्न Trueया False) के लिए परीक्षण किया जाता है । यह आपके दूसरे प्रश्न का उत्तर देता है।

print rasterGeometry.Intersect(vectorGeometry)

2
धन्यवाद, यह वही था जिसकी मुझे तलाश थी। यह उत्तर स्पष्ट रूप से दिखाता है कि ज्यामिति वस्तुओं के बीच फ़ंक्शंस कैसे बनाएं, निकालें, और चलाएं, जो कि वास्तव में मैं देख रहा था।
JFerg

यह समाधान परीक्षण करता है कि क्या एफआईडी = 0 बहुभुज रेखापुंज के साथ प्रतिच्छेद करता है। जब कोई बहुभुज इसका प्रतिनिधित्व नहीं करता है, तो आपको शेपफाइल कुल की ज्यामिति कैसे मिलती है?
19 फरवरी को JFerg

1
EDIT: अभिकलन समय में वृद्धि असंगत है इसलिए मैं जाँच करता हूं कि क्या प्रत्येक बहुभुज अब आकृति आकृति चौराहों में है।
JFerg

4

मुझे @ustroetz समाधान बहुत उपयोगी लगता है, लेकिन इसे दो स्थानों पर सही करने की आवश्यकता है। सबसे पहले, पिक्सेलहाइट = ट्रांसफ़ॉर्म [5] पहले से ही नकारात्मक मूल्य है, इसलिए समीकरण होना चाहिए

yBottom = yTop+rows*pixelHeight

दूसरे, रिंग में बिंदुओं का क्रम दक्षिणावर्त होना चाहिए। मुझे इससे समस्या हो रही थी। सही क्रम है:

ring = ogr.Geometry(ogr.wkbLinearRing)
ring.AddPoint(xLeft, yTop)
ring.AddPoint(xLeft, yBottom)
ring.AddPoint(xRight, yBottom)
ring.AddPoint(xRight, yTop)
ring.AddPoint(xLeft, yTop)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.