আমি একটি আর্ক / ইনফরমেশন বাইনারি গ্রিড পেয়েছি --- বিশেষত, একটি আর্কজিআইএস ফ্লো জমে থাকা রাস্টার --- এবং আমি নির্দিষ্ট মান (বা মানগুলির একটি পরিসীমা) সহ সমস্ত ঘর সনাক্ত করতে চাই। শেষ পর্যন্ত, আমি এই ঘরগুলির প্রতিনিধিত্বকারী পয়েন্টগুলির একটি শেফফিল চাই।
আমি এইচডিআরএডিএফ খুলতে এবং এই ফলাফলটি পেতে 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!"
srs.ImportFromWkt(r.GetProjection())(কোনও পরিচিত প্রজ স্ট্রিং থেকে প্রজেকশন তৈরি করার পরিবর্তে)।