জিডিএল এবং পাইথন: সুনির্দিষ্ট মান সম্পন্ন সমস্ত কক্ষের স্থানাঙ্ক কিভাবে পাবেন?


12

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

আমি এইচডিআরএডিএফ খুলতে এবং এই ফলাফলটি পেতে QGIS ব্যবহার করতে পারি, কর্মপ্রবাহটি হ'ল:

  • কিউজিআইএস> রাস্টার মেনু> রাস্টার ক্যালকুলেটর (লক্ষ্য মান সহ সমস্ত পয়েন্ট চিহ্নিত করুন)
  • কিউজিআইএস> রাস্টার মেনু> বহুভুক্ত
  • কিউজিআইএস> ভেক্টর মেনু> জ্যামিতি সাবমেনু> বহুভুজ সেন্ট্রয়েড
  • অযাচিত পলি সেন্ট্রয়েডগুলি মুছতে সেন্ট্রয়েডগুলি সম্পাদনা করুন (সেগুলি = 0)

এই পদ্ধতির "কাজটি করে", তবে এটি আমার কাছে আবেদন করে না কারণ এটি আমাকে মুছতে হবে এমন দুটি ফাইল তৈরি করে, তারপরে আমাকে সেন্ট্রয়েডের শেফফাইল থেকে অযাচিত রেকর্ড (গুলি) মুছে ফেলতে হবে (অর্থাত্ = 0)।

একটি বিদ্যমান প্রশ্ন এই বিষয়ে পৌঁছেছে, তবে এটি আর্কজিআইএস / আর্কপাইয়ের জন্য উপযুক্ত, এবং আমি FOSS স্পেসে থাকতে চাই।

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

আমি ক্রিস গারার্ডের উপস্থাপনাগুলোর মধ্যে একটির বিরুদ্ধে কাজ করে এটাকে গুলি করেছিলাম , তবে রাস্টার কাজটি আমার হুইলহাউসে নেই এবং আমি আমার দুর্বল কোড দিয়ে প্রশ্নটি বিশৃঙ্খলা করতে চাই না।

যে কারও সাথে সঠিক ডেটাসেটটি খেলতে চাইলে আমি এটি একটি জিপ হিসাবে এখানে রেখেছি


[নোট সম্পাদনা করুন] উত্তরপুরুষের জন্য এটিকে পিছনে রেখে দেওয়া। ওম_হেনারদের সাথে মন্তব্য বিনিময় দেখুন। মূলত x / y (সারি / কলাম) মানগুলি উল্টানো হয়েছিল। মূল উত্তরের এই লাইনটি ছিল:

(y_index, x_index) = np.nonzero(a == 1000)

উল্টানো, এই মত:

(x_index, y_index) = np.nonzero(a == 1000)

আমি যখন প্রথমবারের স্ক্রিনশটে চিত্রিত ইস্যুটির মুখোমুখি হয়েছিলাম তখন আমি ভাবছিলাম যে আমি জ্যামিতিটি ভুলভাবে প্রয়োগ করেছি কিনা, এবং আমি এই লাইনে এক্স / ওয়াই সমন্বিত মানগুলি উল্টিয়ে পরীক্ষা-নিরীক্ষা করেছি:

point.SetPoint(0, x, y)

..as ..

point.SetPoint(0, y, x)

তবে এটি কার্যকর হয়নি। এবং আমি ওম_হেনারদের নম্পি এক্সপ্রেশনতে মানগুলি উল্টানোর চেষ্টা করার কথা ভাবি নি, ভুলভাবে বিশ্বাস করে যে তাদের উভয় লাইনে উল্টানো সমান ছিল। আমি মনে করি আসল বিষয়টি যথাক্রমে মান x_sizeএবং y_sizeমানগুলির সাথে সম্পর্কিত 30এবং -30যা প্রয়োগ করা হয় যখন সারি এবং কলাম সূচকগুলি ঘরের জন্য বিন্দু স্থানাঙ্ক গণনা করতে ব্যবহৃত হয়।

[মূল সম্পাদনা]

@om_henners, আমি (ogr ব্যবহার বিন্দু shapefiles তৈরীর জন্য একটি দম্পতি recipies সঙ্গে আপনার সমাধান চেষ্টা করছি, কনসার্টের মধ্যে invisibleroads.com , ক্রিস Garrard ), কিন্তু আমি একটি বিষয় যেখানে পয়েন্ট হিসাবে যদি একটি লাইন পাসিং জুড়ে প্রতিফলিত দেখা যাচ্ছে হচ্ছে 315/135-ডিগ্রি মাধ্যমে।

হালকা নীল পয়েন্ট : উপরে, আমার কিউজিআইএস পদ্ধতির দ্বারা তৈরি

বেগুনি পয়েন্ট : নীচে GDAL / OGR পাই কোড দ্বারা নির্মিত created

এখানে চিত্র বর্ণনা লিখুন


[মীমাংসিত]

এই পাইথন কোডটি @ ওমেনহেনার্স দ্বারা প্রস্তাবিত সম্পূর্ণ সমাধানটি কার্যকর করে। আমি এটি পরীক্ষা করেছি এবং এটি কাজ করে। ধন্যবাদ মানুষ!


from osgeo import gdal
import numpy as np
import osgeo.ogr
import osgeo.osr

path = "D:/GIS/greeneCty/Greene_DEM/GreeneDEM30m/flowacc_gree/hdr.adf"
print "\nOpening: " + path + "\n"

r = gdal.Open(path)
band = r.GetRasterBand(1)

(upper_left_x, x_size, x_rotation, upper_left_y, y_rotation, y_size) = r.GetGeoTransform()

a = band.ReadAsArray().astype(np.float)

# This evaluation makes x/y arrays for all cell values in a range.
# I knew how many points I should get for ==1000 and wanted to test it.
(y_index, x_index) = np.nonzero((a > 999) & (a < 1001))

# This evaluation makes x/y arrays for all cells having the fixed value, 1000.
#(y_index, x_index) = np.nonzero(a == 1000)

# DEBUG: take a look at the arrays..
#print repr((y_index, x_index))

# Init the shapefile stuff..
srs = osgeo.osr.SpatialReference()
#srs.ImportFromProj4('+proj=utm +zone=15 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs')
srs.ImportFromWkt(r.GetProjection())

driver = osgeo.ogr.GetDriverByName('ESRI Shapefile')
shapeData = driver.CreateDataSource('D:/GIS/01_tutorials/flow_acc/ogr_pts.shp')

layer = shapeData.CreateLayer('ogr_pts', srs, osgeo.ogr.wkbPoint)
layerDefinition = layer.GetLayerDefn()

# Iterate over the Numpy points..
i = 0
for x_coord in x_index:
    x = x_index[i] * x_size + upper_left_x + (x_size / 2) #add half the cell size
    y = y_index[i] * y_size + upper_left_y + (y_size / 2) #to centre the point

    # DEBUG: take a look at the coords..
    #print "Coords: " + str(x) + ", " + str(y)

    point = osgeo.ogr.Geometry(osgeo.ogr.wkbPoint)
    point.SetPoint(0, x, y)

    feature = osgeo.ogr.Feature(layerDefinition)
    feature.SetGeometry(point)
    feature.SetFID(i)

    layer.CreateFeature(feature)

    i += 1

shapeData.Destroy()

print "done! " + str(i) + " points found!"

1
আপনার কোডের জন্য দ্রুত পরামর্শ: আপনি রাস্টার প্রজেকশনটি আপনার শেপফিল প্রজেকশন হিসাবে ব্যবহার করতে পারেন srs.ImportFromWkt(r.GetProjection())(কোনও পরিচিত প্রজ স্ট্রিং থেকে প্রজেকশন তৈরি করার পরিবর্তে)।
ওমেনার্স

আপনার কোডে আমি যা খুঁজছি তার সব কিছুই করে তবে এটি রাস্টার সেল মান অন্তর্ভুক্ত করে না কারণ আপনি নিজের নাম্বার ফিল্টারটি কেবলমাত্র মান = 1000 অন্তর্ভুক্ত করার জন্য লিখেছেন ster আউটপুট? ধন্যবাদ!
ব্রেন্ট এডওয়ার্ডস

উত্তর:


19

জিডিএল-তে আপনি রাস্টারকে একটি নমপি অ্যারে হিসাবে আমদানি করতে পারেন।

from osgeo import gdal
import numpy as np

r = gdal.Open("path/to/raster")
band = r.GetRasterBand(1) #bands start at one
a = band.ReadAsArray().astype(np.float)

তারপরে ন্যাপি ব্যবহার করে কোনও অ্যুলের বুলান এক্সপ্রেশনটির সাথে সূচকগুলি সূচিপত্র পাওয়া সহজ বিষয়:

(y_index, x_index) = np.nonzero(a > threshold)
#To demonstate this compare a.shape to band.XSize and band.YSize

রাস্টার জিওট্রান্সফর্ম থেকে আমরা উপরের বাম এক্স এবং ওয়াই স্থানাঙ্ক এবং কক্ষের আকারের মতো তথ্য পেতে পারি।

(upper_left_x, x_size, x_rotation, upper_left_y, y_rotation, y_size) = r.GetGeoTransform()

উপরের বাম কোষের সাথে মিল রয়েছে a[0, 0]। Y মাপ সর্বদা নেতিবাচক থাকবে, সুতরাং x এবং y সূচকগুলি ব্যবহার করে আপনি সূচির উপর ভিত্তি করে প্রতিটি ঘরের স্থানাঙ্কগুলি গণনা করতে পারেন।

x_coords = x_index * x_size + upper_left_x + (x_size / 2) #add half the cell size
y_coords = y_index * y_size + upper_left_y + (y_size / 2) #to centre the point

এখান থেকে ওজিআর ব্যবহার করে শেফফাইল তৈরি করা যথেষ্ট সহজ বিষয়। কিছু নমুনা কোডের জন্য এই প্রশ্নটি কীভাবে পয়েন্ট তথ্য সহ একটি নতুন ডেটাसेट তৈরি করতে হয় তা দেখুন।


আরে ফেল্লা, আমি এটি প্রয়োগ করে একটি ছোট সমস্যা করছি। আমি যে কোডটি ব্যবহার করছি তা এবং আমি কী পাচ্ছি তার স্ক্রিনশট অন্তর্ভুক্ত করার জন্য আমি প্রশ্নটি আপডেট করেছি। মূলত .পি কোডটি কিউজিআইএস পদ্ধতির কী তৈরি করছে তার একটি আয়না-চিত্র (পয়েন্ট প্লেসমেন্ট) তৈরি করছে। আমার প্রয়োগের পয়েন্টগুলি রাস্টার সীমার বাইরে পড়ে, তাই সমস্যাটি আমার কোডের সাথেই থাকতে হবে। : = আমি আশা করছি আপনি কিছুটা আলো ফেলতে পারেন। ধন্যবাদ!
elrobis

এর জন্য দুঃখিত - সম্পূর্ণ আমার খারাপ। আপনি যখন জিডিএল-তে কোনও রাস্টার আমদানি করেন সারিগুলি হ'ল y দিক এবং কলামগুলি x দিক। আমি উপরের কোডটি আপডেট করেছি, তবে কৌশলটি হ'ল(y_index, x_index) = np.nonzero(a > threshold)
ওম_হেনার্স

1
এছাড়াও, কেবলমাত্র ক্ষেত্রে, ঘরের বিন্দুটি কেন্দ্র করতে উভয় দিকের স্থানাঙ্কগুলিতে অর্ধেক ঘরের আকারের যোগ করার বিষয়টি নোট করুন।
ওমেনার্স

হ্যাঁ যে বিষয়টি ছিল। আমি যখন প্রথম সেই বাগটি পেলাম (যেমন স্ক্রিন দখল হিসাবে দেখানো হয়েছে), আমি ভাবছিলাম যে আমি বিন্দু জ্যামিতিকে ভুলভাবে প্রয়োগ করেছি কিনা, তাই আমি যখন x / y কে y / x হিসাবে উল্টানোর চেষ্টা করেছি .shp--- কেবল এটিই হয়নি কাজ, না এটি কোথাও কাছাকাছি ছিল। এক্স মানটি যেহেতু শত-সহস্রের মধ্যে রয়েছে আমি অবাক হইনি, এবং y লক্ষ লক্ষের মধ্যে রয়েছে, তাই এটি আমাকে বেশ বিভ্রান্ত করেছিল। আমি নম্পি এক্সপ্রেশনটিতে এগুলি ফিরিয়ে দেওয়ার চেষ্টা করার কথা ভাবিনি। আপনার সাহায্যের জন্য অনেক ধন্যবাদ, এটি দুর্দান্ত। ঠিক আমি যা চেয়েছিলাম :)
elrobis

4

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


1

পোস্টগ্রিসে (রাস্টার সহায়তার সাথে) ডেটা আমদানি করতে এবং সেখানে ফাংশনগুলি ব্যবহার করতে এটি সহায়ক হতে পারে। এই টিউটোরিয়ালে আপনার প্রয়োজনীয় উপাদান থাকতে পারে।

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