জিডিএল রাস্টারাইজ লেয়ার রাস্টারগুলিতে সমস্ত বহুভুজ পোড়ায় না?


12

আমি জিডিএল'র রাস্টারাইজলায়ার ব্যবহার করে একটি রাস্টারকে একটি শেফফাইল জ্বালানোর চেষ্টা করছি। আমি নির্দিষ্ট পিক্সেল আকার দিয়ে আলাদা শেফফাইল থেকে আগ্রহের রাস্টার ক্ষেত্রটি প্রাক-তৈরি করি। এই এওআইটি নীচের সমস্ত রাস্টেরাইজেশনগুলির জন্য ভিত্তি হিসাবে কাজ করে (একই সংখ্যক সংঘর্ষ এবং সারি, একই প্রক্ষেপণ এবং জিওট্রান্সফর্ম)।

সমস্যাটি তখনই ঘটে যখন আমি একই পিক্সেল আকার এবং অনুমানের ভিত্তিতে আকারগুলি তাদের নিজস্ব রাস্টারগুলিতে পোড়াতে যাই। নীচের লিঙ্কটিতে (ছবিটি পোস্ট করার মতো পর্যাপ্ত প্রতিনিধি নেই), টানটিতে মূল শেফফাইল এবং গাaster় গোলাপী যেখানে রাস্টারাইজ লেয়ার ডেটা জ্বালিয়ে দিয়েছে shows হালকা গোলাপী গা the় গোলাপী রাস্টার ডেটার জন্য নোডা মান। ধূসর হ'ল AOI যার ভিত্তিতে শেফফিল বার্নটি সম্পন্ন হয়েছিল।

শেফফাইল বহুভুজের এক্সটেন্টগুলি দেওয়া, আমি নীচের দুটি কোণে বার্ন মানগুলি এবং সেই সাথে দেখানো ডেটার নীচে দুটি পিক্সেল দেখতে আশা করব। স্পষ্টতই, যদিও, এটি ক্ষেত্রে নয়।

সমস্যার জন্য চিত্র- রাস্টার বার্নস সমাপ্ত

নীচে এই কোডগুলি আমি তৈরি করতে ব্যবহার করি is সমস্ত আকারগুলি কিউজিআইএস ব্যবহার করে তৈরি করা হয়েছিল এবং সমস্তগুলি একই প্রক্ষেপণে তৈরি করা হয়েছিল। (এটি লক্ষ করা উচিত যে প্রদর্শিত ছবিতে গ্রিডিংটি আমি যে পিক্সেল আকারটি ব্যবহার করছিলাম সে সম্পর্কে ধারণা দেওয়ার জন্য))

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])

এটি কি জিডিএল-তে একটি বাগ, বা নির্দিষ্ট পিক্সেল অঞ্চলের মধ্যে বহুভুজের উপস্থিতি বা অভাব ছাড়া অন্য কোনও কিছুর উপর ভিত্তি করে রাস্টারাইজ লাইয়ার জ্বলন্ত ডেটা?

আমি যে ফাইলগুলি ব্যবহার করছিলাম সেগুলি এখানে পাওয়া যাবে


আপনি কি 'गतिविधि_3.shp' এবং 'AOI_Raster.tif' এর লিঙ্ক সরবরাহ করতে পারেন? আমি আমার শেষ দিকে পুনরায় তৈরি করতে পারি কিনা তা দেখতে চাই।
ধনী

উত্তর:


10

আমি এই সপ্তাহে জিডিএলআরসিটারাইজ লেয়ারদের সাথে খেলছি এবং এটি কী করছে তা সম্পর্কে বেশ ভাল ধারণা আছে। ডিফল্টরূপে, পিক্সেল কেন্দ্রটি বহুভুজের মধ্যে থাকলে এটি একটি পিক্সেলকে উত্সাহিত করবে। যদি কেন্দ্রে কিছু না থাকে তবে পিক্সেল সীমাতে বহুভুজের কিছু অংশ থাকলেও তা জোর করে দেওয়া হবে না। রাস্টেরাইজিংকে আপনার ইচ্ছা মতো কাজ করার অনুমতি দেওয়ার জন্য, "ALL_TOUCHED" বিকল্পটি ব্যবহার করে দেখুন:

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

হ্যাঁ! ['ALL_TOUCHED=TRUE']দুর্ভাগ্যক্রমে যদিও এটি দৃশ্যত , কেবলমাত্র বহুভুজ স্তরগুলি স্থির করে। আমার পয়েন্ট শেফাইল ফাইলগুলি এখনও সুপার উইঙ্কি হয়ে আছে এবং যেখানে রয়েছে সেখান থেকে একটি পিক্সেল দেখায়।
লার্ক

মনে হচ্ছে খুঁজছেন শেষ পর্যন্ত এই । এটি অন্যদের মতো একই প্রক্ষেপণে রয়েছে এবং আমি আশা করছিলাম যে এটি একরকম জাদুকরীভাবে এটির সমাধানও করে দেবে, তবে এটি কেবল যেখানে অবস্থিত সেখানে এক পিক্সেলটি জেদ করে পোড়াবে বলে মনে হচ্ছে।
লার্ক

এটি অবশ্যই বাগ-যোগ্য বলে মনে হচ্ছে, যেখানে বার্ন পয়েন্টটি ডেক্স / 2 এবং ডাই / 2 দ্বারা অফসেট করা আছে। আমি যদি বিগটি সর্বশেষ ট্রাঙ্কের সাথে এখনও অবিরত থাকে তবে আমি অবাক হই।
মাইক টি

এটা না! এটি 1.9.0 এ কাজ করে। অনেক ধন্যবাদ!
দুষ্টুমি

1
এখানে বেশ ভাল একটি রেসিপিও রয়েছে
j08lue
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.