मुझे एक आर्क / जानकारी बाइनरी ग्रिड --- विशेष रूप से, एक आर्किस प्रवाह संचय रेखापुंज --- मिला है और मैं सभी कोशिकाओं को एक विशिष्ट मूल्य (या मूल्यों की श्रेणी में) पहचानना चाहूंगा। अंत में, मैं इन कोशिकाओं का प्रतिनिधित्व करने वाले बिंदुओं का एक आकार-प्रकार चाहूंगा।
मैं hdr.adf खोलने के लिए QGIS का उपयोग कर सकता हूं और यह परिणाम प्राप्त कर सकता हूं, वर्कफ़्लो है:
- QGIS> रेखापुंज मेनू> रेखापुंज कैलकुलेटर (लक्ष्य मान के साथ सभी बिंदुओं को चिह्नित करें)
- QGIS> रेखापुंज मेनू> बहुभुज
- QGIS> वेक्टर मेनू> ज्यामिति सबमेनू> बहुभुज सेंट्रोइड्स
- अवांछित पॉली सेंट्रोइड्स को हटाने के लिए सेंट्रोइड्स को संपादित करें (उन = 0)
यह दृष्टिकोण "काम करता है", लेकिन यह मुझे अपील नहीं करता है क्योंकि यह 2 फाइलें बनाता है जिन्हें मुझे हटाना है, फिर मुझे अवांछित रिकॉर्ड (सेंट) को सेंट्रोफाइल के आकार के निशान से निकालना होगा (अर्थात उन = 0)।
एक मौजूदा प्रश्न इस विषय पर आता है, लेकिन यह ArcGIS / ArcPy के लिए सिलवाया गया है, और मैं FOSS स्पेस में रहना चाहूंगा।
क्या किसी के पास GDAL / Python रेसिपी / स्क्रिप्ट मौजूद है जो किसी रैस्टर के सेल वैल्यू से पूछताछ करती है, और जब टारगेट वैल्यू --- या टारगेट रेंज में एक वैल्यू --- पाया जाता है, तो एक रिकॉर्ड को एक शेपफाइल में जोड़ा जाता है? यह न केवल UI इंटरैक्शन से बचता है, बल्कि यह एक एकल पास में एक साफ परिणाम पैदा करेगा।
मैंने क्रिस गेरार्ड की प्रस्तुतियों में से एक के खिलाफ काम करके इस पर एक शॉट लिया , लेकिन रेखापुंज का काम मेरे व्हीलहाउस में नहीं है और मैं अपने कमजोर कोड के साथ सवाल को टटोलना नहीं चाहता।
किसी को भी सटीक डाटासेट के साथ खेलने के लिए चाहिए, मैं एक .zip के रूप में यहाँ डाल दिया ।
[संपादित करें नोट्स] पोस्टीरिटी के लिए इसे पीछे छोड़ते हुए। Om_henners के साथ टिप्पणी विनिमय देखें। मूल रूप से x / y (पंक्ति / स्तंभ) मान फ़्लिप किए गए थे। मूल उत्तर में यह पंक्ति थी:
(y_index, x_index) = np.nonzero(a == 1000)
उलटा, इस तरह:
(x_index, y_index) = np.nonzero(a == 1000)
जब मुझे पहली बार स्क्रीनशॉट में दर्शाए गए मुद्दे का सामना करना पड़ा, तो मुझे आश्चर्य हुआ कि क्या मैंने ज्यामिति को गलत तरीके से लागू किया है, और मैंने इस पंक्ति में x / y निर्देशांक मानों को फ़्लिप करके प्रयोग किया है:
point.SetPoint(0, x, y)
..जैसा..
point.SetPoint(0, y, x)
हालांकि वह काम नहीं किया। और मैंने om_henners के Numpy अभिव्यक्ति में मानों को फ़्लिप करने की कोशिश करने के बारे में नहीं सोचा था, यह गलत तरीके से विश्वास करते हुए कि उन्हें या तो रेखा पर फ़्लिप करना बराबर था। मैं असली मुद्दे से संबंधित है लगता है x_size
और y_size
मूल्यों में क्रमश: 30
और -30
, जो जब पंक्ति और स्तंभ सूचकांक कोशिकाओं के लिए calculate बिंदु निर्देशांक के लिए उपयोग किया जाता है लागू होते हैं।
[मूल संपादन]
@om_henners, मैं (OGR का उपयोग कर बिंदु शेपफ़ाइलें बनाने के लिए एक जोड़े को recipies के साथ अपने समाधान कोशिश कर रहा हूँ, संगीत कार्यक्रम में invisibleroads.com , क्रिस Garrard ), लेकिन मैं एक मुद्दा जहां अंक के रूप में अगर एक लाइन गुजर में दिखाई दिखाई दे रहे हैं हो रही है 315/135-डिग्री के माध्यम से।
हल्के नीले बिंदु : मेरे QGIS दृष्टिकोण द्वारा निर्मित , ऊपर
बैंगनी बिंदु : नीचे GDAL / OGR py कोड द्वारा बनाया गया है
[हल किया]
यह पायथन कोड @om_henners द्वारा प्रस्तावित पूर्ण समाधान को लागू करता है। मैंने इसका परीक्षण किया है और यह काम करता है। धन्यवाद दोस्त!
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())
(इसके बजाय एक ज्ञात प्रोज स्ट्रिंग से प्रक्षेपण बनाने के लिए)।