GDAL RasterizeLayer सभी Polygons को रेखापुंज में नहीं जलाती है?


12

मैं GDAL के RasterizeLayer का उपयोग कर एक रेखापुंज को एक आकृति को जलाने की कोशिश कर रहा हूं। मैं एक अलग आकार-प्रकार से ब्याज रेखापुंज का एक क्षेत्र पूर्व-निर्मित करता हूं, एक विशिष्ट पिक्सेल आकार दिया जाता है। यह एओआई तब सभी निम्नलिखित रेखापुंजों के लिए एक आधार के रूप में कार्य करता है (समान संख्या में कॉलम और पंक्तियाँ, एक ही प्रक्षेपण और भू-आकृतियाँ)।

हालाँकि, समस्या तब होती है, जब मैं समान पिक्सेल आकार और अनुमानों के आधार पर, अपने स्वयं के रेखापुंज को आकृतियाँ जलाने जाता हूँ। नीचे दिए गए लिंक (छवि को पोस्ट करने के लिए पर्याप्त प्रतिनिधि नहीं है), तन में मूल शेपफाइल दिखाता है, और गहरे गुलाबी जहां रैस्टरलाइलेयर ने डेटा जला दिया है। हल्का गुलाबी, गहरे गुलाबी रेखापुंज डेटा के लिए नोडटा मान है। ग्रे AOI है जिसके आधार पर शेपफाइल बर्न पूरा किया गया था।

शेपफाइल पॉलीगॉन के विस्तार को देखते हुए, मैं नीचे दो कोनों में जले हुए मूल्यों को देखने की उम्मीद करूंगा, साथ ही जो डेटा दिखाता है उसके नीचे दो पिक्सल हैं। जाहिर है, हालांकि, यह मामला नहीं है।

समस्या के लिए छवि- खत्म हो गया जलता हुआ जल

इस प्रकार कोड है कि मैं इन उत्पन्न करने के लिए इस्तेमाल किया है। सभी आकार QGIS का उपयोग करके बनाए गए थे, और सभी एक ही प्रक्षेपण में बनाए गए थे। (यह ध्यान दिया जाना चाहिए कि दिखाए गए चित्र में ग्रिडिंग सिर्फ पिक्सेल आकार का उपयोग करने का एक विचार देने के लिए था।)

from osgeo import ogr
from osgeo import gdal

aoi_uri = 'AOI_Raster.tif'
aoi_raster = gdal.Open(aoi_uri)

def new_raster_from_base(base, outputURI, format, nodata, datatype):

    cols = base.RasterXSize
    rows = base.RasterYSize
    projection = base.GetProjection()
    geotransform = base.GetGeoTransform()
    bands = base.RasterCount

    driver = gdal.GetDriverByName(format)

    new_raster = driver.Create(str(outputURI), cols, rows, bands, datatype)
    new_raster.SetProjection(projection)
    new_raster.SetGeoTransform(geotransform)

    for i in range(bands):
        new_raster.GetRasterBand(i + 1).SetNoDataValue(nodata)
        new_raster.GetRasterBand(i + 1).Fill(nodata)

    return new_raster

shape_uri = 'activity_3.shp'
shape_datasource = ogr.Open(shape_uri)
shape_layer = shape_datasource.GetLayer()

raster_out = 'new_raster.tif'

raster_dataset = new_raster_from_base(aoi_raster, raster_out, 'GTiff',
                                -1, gdal.GDT_Int32)
band = raster_dataset.GetRasterBand(1)
nodata = band.GetNoDataValue()

band.Fill(nodata)

gdal.RasterizeLayer(raster_dataset, [1], shape_layer, burn_values=[1])

क्या यह GDAL में एक बग है, या RasterizeLayer एक निर्दिष्ट पिक्सेल क्षेत्र के भीतर बहुभुज की उपस्थिति या कमी के अलावा किसी अन्य चीज़ पर आधारित डेटा जल रहा है?

जो फाइलें मैं इस्तेमाल कर रहा था, वे यहां मिल सकती हैं


क्या आप 'activity_3.shp' और 'AOI_Raster.tif' का लिंक प्रदान कर सकते हैं? मैं यह देखना चाहता हूं कि क्या मैं अपने अंत को फिर से बना सकता हूं।
रिच

जवाबों:


10

मैं इस सप्ताह GDALRasterizeLayers के साथ खेल रहा हूँ और यह क्या कर रहा है का एक बहुत अच्छा विचार है। यदि पिक्सेल केंद्र बहुभुज के भीतर है तो डिफ़ॉल्ट रूप से, यह एक पिक्सेल को तेज कर देगा। यदि केंद्र में कुछ भी नहीं है, तो इसे रेखापूर्ण नहीं किया जाएगा, भले ही पिक्सेल सीमा के भीतर बहुभुज के कुछ हिस्से हों। अपने इच्छित तरीके से काम करने के लिए रैस्टराइज़िंग को अनुमति देने के लिए, "ALL_TOUCHED" विकल्प आज़माएँ:

gdal.RasterizeLayer(raster_dataset, [1], shape_layer, None, None, [1], ['ALL_TOUCHED=TRUE'])

हाँ! यह ['ALL_TOUCHED=TRUE']दुर्भाग्य से, हालांकि दुर्भाग्य से, केवल तय बहुभुज परतें हैं। मेरी बिंदु आकार की परतें अभी भी सुपर विस्की हैं, और एक पिक्सेल ऊपर दिखाती हैं जहां से वे रखे गए हैं।
लार्क

यह इस तरह लग रहा है । यह दूसरों के समान ही प्रक्षेपण में है, और मैं उम्मीद कर रहा था कि यह किसी तरह जादुई रूप से इसे भी ठीक कर देगा, लेकिन ऐसा लगता है कि यह वास्तव में जहां स्थित है वहां से एक पिक्सेल को जला दिया जाता है।
लार्क

यह निश्चित रूप से बग-योग्य दिखता है, जहां डीएक्स / 2 और डाई / 2 द्वारा जला बिंदु ऑफसेट है। मुझे आश्चर्य है कि अगर वह बग अभी भी नवीनतम ट्रंक के साथ बनी हुई है।
माइक टी

ऐसा नहीं होता! यह 1.9.0 में काम करता है। बहुत बहुत धन्यवाद!
लार्क

1
यहाँ भी काफी अच्छी रेसिपी है: gis.stackexchange.com/a/16916/9942
j0coinue
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.