ওজিআর / জিডিএল ব্যবহার করে পাইথনে শেফফাইল এবং রাস্টার ওভারল্যাপ হয় কিনা তা নির্ধারণ করা হচ্ছে? [বন্ধ]


9

আমি ওজিআর / জিডিএল ব্যবহার করে পাইথনে স্ক্রিপ্ট তৈরি করছি।

আমার কাছে শেফফিলের একটি সেট এবং জিওটিফ রাস্টার ফাইলগুলির একটি সেট রয়েছে।

আমি চাই আমার স্ক্রিপ্টটি শেফফায়ালগুলি এড়িয়ে চলা যদি তারা রাস্টার অঞ্চলটির সাথে ছেদ না করে।

শেফফাইলটি একটি আয়তক্ষেত্র নয়, সুতরাং আমি কেবল xmin / xmax, ymin / ymax মান স্তর দ্বারা ফিরে আসা তুলনা করতে পারবেন না etGetExtent ()। আমার এটির সামগ্রিক আকারের প্রতিনিধিত্বকারী প্রকৃত বহুভুজ দরকার এবং তারপরে কোনও বহুভুজ রাস্টার স্কোয়ারের সাথে ছেদ করে কিনা তা নির্ধারণের কিছু উপায়।

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

  1. শেফফাইল থেকে সীমান্ত বহুভুজের তথ্য কীভাবে আহরণ করবেন?
  2. সেই বহুভুজ প্রদত্ত বর্গক্ষেত্রটি ছেদ করে কিনা তা কীভাবে নির্ধারণ করবেন?

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

উত্তর:


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
ধন্যবাদ, আমি ঠিক এটিই খুঁজছিলাম। এই উত্তরটি পরিষ্কারভাবে দেখায় যে কীভাবে জ্যামিতি অবজেক্টগুলির মধ্যে ফাংশন তৈরি করা, নিষ্কাশন করা এবং চালানো যায়, যা আমি ঠিক খুঁজছিলাম।
জেফের্গ

এই সমাধানটি FID = 0 বহুভুজ রাস্টার সাথে ছেদ করে কিনা তা পরীক্ষা করে। যখন কোনও বহুভুজ এটি উপস্থাপন না করে আপনি কীভাবে শেফফাইলের জ্যামিতি পাবেন?
জেফের্গ

1
সম্পাদনা: গণনার সময় বৃদ্ধি অসঙ্গতিযুক্ত তাই আমি পরীক্ষা করে দেখি যে শেফফিলের প্রতিটি বহুভুজ এখন ছেদ করে কিনা।
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)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.