GDAL का उपयोग करके वेक्टर परत के साथ कतरन रेखापुंज


26

मैंने ओस्जियो इंस्टॉलर का उपयोग करके GDAL स्थापित किया है। मैं एक वेक्टर परत के साथ प्रोग्रामर रूप से एक रेखापुंज परत कैसे क्लिप कर सकता हूं? क्या कोई GDAL API उपलब्ध है जो मुझे इसमें मदद कर सकता है? मैं पायथन का उपयोग कर रहा हूं।

जवाबों:


13

मैं नहीं यकीन है कि GDAL API के बारे में, वहाँ है कर रहा हूँ void* GDALWarpOptions::hCutlineमें वार्प विकल्प से संदर्भित वार्प एपीआई ट्यूटोरियल है, लेकिन कोई स्पष्ट उदाहरण हैं। क्या आप सुनिश्चित हैं कि आपको प्रोग्रामेटिक उत्तर की आवश्यकता है? कमांड लाइन उपयोगिताओं बॉक्स से बाहर कर सकते हैं:

  1. एक शेपफाइल बनाएं जिसमें सिर्फ ब्याज की कतरन बहुभुज का क्षेत्र हो
  2. ogrinfoक्लिपिंग शेपफाइल की सीमा निर्धारित करने के लिए उपयोग
  3. gdal_translateआकार विस्तार करने के लिए क्लिप का उपयोग करें
  4. पैरामीटर के gdalwarpसाथ उपयोग करें-cutline

चरण 2 और 3 अनुकूलन के लिए हैं, आप बस के साथ प्राप्त कर सकते हैं gdalwarp -cutline ...

देखें GDAL बहुभुज का उपयोग कर के साथ कतरन rasters linux आधारित समाधान सब एक स्क्रिप्ट में ऊपर लपेट के लिए Linfinity से। माइकल कोरी के ट्यूटोरियल में मैपनिक के लिए पहाड़ियों का निर्माण करते हुए एक और कटलाइन उदाहरण देखा जा सकता है ।


मैट, आपको याद हो सकता है trac.osgeo.org/gdal/ticket/1599 कटलाइन की तरह दिखता है इसे पूरा करता है
माइक टी

10

जियोस्पैटियल पाइथन के जोएल लावहेड ने शेपफाइल , एक अच्छी तरह से ट्यूटोरियल का उपयोग करके क्लिप रैस्टर में अजगर उदाहरण को पूरा किया है । आपको Python Image Library (PIL) को स्थापित करने की आवश्यकता होगी जो Osgeo4W में शामिल नहीं है (जिसके लिए आपको इंस्टॉल प्रोग्राम को काम करने के लिए विंडोज़ रजिस्ट्री में o4w अजगर को जोड़ना होगा )।


10

ऐसा लगता है कि यह विषय हमेशा वापस आ रहा है। मैं खुद नहीं जानता था कि GDAL> 1.8 इतना उन्नत है कि यह पहले से ही आपको उस कार्य को करने के लिए उचित कमांड लाइन से निपटने देता है।

माइक टोज़ की टिप्पणी बहुत उपयोगी है लेकिन आप उदाहरण के लिए बस कर सकते हैं:

gdalwarp -of GTiff -cutline DATA/area_of_interest.shp -cl area_of_interest  -crop_to_cutline DATA/PCE_in_gw.asc  data_masked7.tiff 

आप उत्कृष्ट के साथ एक अजगर स्क्रिप्ट के अंदर इस आदेश लपेट सकता है उपप्रक्रिया मॉड्यूल।

एक चीज जो मेरे लिए वास्तव में समस्याग्रस्त थी, वह यह है कि मुझे उस समस्या के न्यूनतम समाधान की आवश्यकता थी, जिसका अर्थ है जितना संभव हो उतना सरल और कई बाहरी आश्रितों को इसकी आवश्यकता नहीं है। जोएल लॉहेड द्वारा ट्यूटोरियल के रूप में पायथन इमेजिंग लाइब्रेरी का उपयोग साफ है, लेकिन मैं निम्नलिखित समाधान के साथ आया हूं: नम्पी नकाबपोश सरणियों का उपयोग करना।
मुझे नहीं पता कि यह बेहतर है, लेकिन यही वह था जो मैं (3 साल पहले की तुलना में ...) जानता था।
मूल रूप से मैंने मूल रेखापुंज के अंदर एक वैध डेटा क्षेत्र बनाया (उदाहरण के लिए उत्पादन रेखापुंज की सीमा वही है), लेकिन मुझे रास्टर को छोटा बनाने का विचार पसंद आया (उदाहरण -crop_to_cutline), इसलिए मैंने world2Pixelजोस लॉहेड से अपनाया । यहाँ मेरा अपना समाधान है:

def RasterClipper():
    craster = MaskRaster()
    contraster2 = 'PCE_in_gw.aux'
    craster.reader("DATA/"+contraster2.replace('aux','asc'))
    xres, yres = craster.extent[1], craster.extent[1]
    craster.fillrasterpoints(xres, yres)
    craster.getareaofinterest("DATA/area_of_interest.shp")
    minX, maxX=craster.new_extent [0]-5,craster.new_extent[1]+5
    minY, maxY= craster.new_extent [2]-5,craster.new_extent[3]+5
    ulX, ulY=world2Pixel(craster.extent, minX, maxY)
    lrX, lrY=world2Pixel(craster.extent, maxX, minY)
    craster.getmask(craster.corners)
    craster.mask=np.logical_not(craster.mask)
    craster.mask.resize(craster.Yrange.size,craster.Xrange.size)
    # choose all data points inside the square boundaries of the AOI,
    # replace all other points with NULL
    craster.cdata= np.choose(np.flipud(craster.mask), (craster.data, -9999))
    # resise the data set to be the size of the squared polygon
    craster.ccdata=craster.cdata[ulY:lrY, ulX:lrX]
    craster.writer("ccdata2m.asc",craster.ccdata, (minX+xres*.5, maxY+yres*.5), 10,10,Flip=False)
    # in second step we rechoose all the data points which are inside the
    # bounding vertices of AOI
    # need to re-define our raster points
    craster.xllcorner, craster.yllcorner = minX, minY
    craster.xurcorner, craster.yurcorner = maxX, maxY
    craster.fillrasterpoints(10,10)
    craster.getmask(craster.boundingvertices) # just a wrapper around matplotlib.nxutils.points_in_poly
    craster.data=craster.ccdata
    craster.clip2(new_extent_polygon=craster.boundingvertices)
    craster.data = np.ma.MaskedArray(craster.data, mask=craster.mask)
    craster.data = np.ma.filled(craster.data, fill_value=-9999)
    # write the raster to disk
    craster.writer("ccdata2m_clipped.asc",craster.data, (minX+xres*.5, maxY+yres*.5), 10,10,Flip=False)

के पूर्ण विवरण के लिए class MaskRasterऔर यह विधियां हैं, मेरे प्रोजेक्ट का गीथब देखें

इस कोड का उपयोग करके आपको अभी भी GDAL का उपयोग करना होगा। हालांकि, योजना भविष्य के शुद्ध पायथन में उपयोग करने के लिए है जहां मैं कर सकता हूं, क्योंकि मेरे सॉफ़्टवेयर के इच्छित दर्शकों को बहुत अधिक निर्भरता के साथ कठिनाइयाँ हैं (मैं सॉफ्टवेयर को विकसित करने के लिए डेबियन का उपयोग करता हूं, और क्लाइंट विंडोज 7 का उपयोग करते हैं ...)।


मुझे आपके द्वारा दी गई कमांड-लाइन उदाहरण पसंद है, लेकिन क्या आप बता सकते हैं कि -crop_to_cutline तर्क क्या करता है? मुझे यकीन नहीं है कि इसका उद्देश्य क्या है जिसे क्लिपिंग शेपफाइल दिया गया है -कूटलाइन द्वारा निर्दिष्ट किया गया है।
२१:

1
-cutline विकल्प बहुभुज परत के आंतरिक बाउंडिंग बॉक्स के लिए रेखापुंज को क्लिप करता है। उदाहरण के लिए, अगर यह extents में छोटा है तो आउटपुट रैस्टर भी छोटा होगा। इसके बिना आउटपुट रेखापुंज मूल के समान आकार का होगा, लेकिन आपकी रुचि के क्षेत्र के बाहर सभी बिंदुओं में NULL के साथ।
Oz123
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.