Arcpy.RasterToNumPyArray का उपयोग करके स्थानिक संदर्भ रखते हुए?


13

मैं आर्कगिस 10.1 का उपयोग कर रहा हूं, और दो preexisting चूहों के आधार पर एक नया रेखापुंज बनाना चाहता हूं। RasterToNumPyArray एक अच्छा उदाहरण है जो मुझे अनुकूल करने के लिए चाहते हैं।

import arcpy
import numpy 
myArray = arcpy.RasterToNumPyArray('C:/data/inRaster')
myArraySum = myArray.sum(1)
myArraySum.shape = (myArray.shape[0],1)
myArrayPerc = (myArray * 1.0)/ myArraySum
newRaster = arcpy.NumPyArrayToRaster(myArrayPerc)
newRaster.save("C:/output/fgdb.gdb/PercentRaster")

समस्या यह है कि यह स्थानिक संदर्भ और सेल आकार को भी स्ट्रिप्स करता है। मुझे लगा कि इसे आर्कपी.नव करना है, लेकिन मैं उन्हें इनपुट रेखापुंज के आधार पर कैसे सेट करूं? मेरे द्वारा इसका निर्धारण नहीं किया जा सकता।


ल्यूक का जवाब लेते हुए, यह मेरा अस्थायी समाधान है।

ल्यूक के समाधान के दोनों ने स्थानिक संदर्भ, सीमा और कोशिका के आकार को सही ढंग से निर्धारित किया है। लेकिन पहली विधि ने सरणी में डेटा को सही ढंग से नहीं लिया और आउटपुट रैस्टर को हर जगह नोडटा से भर दिया गया। उनका दूसरा तरीका ज्यादातर काम करता है, लेकिन जहां मेरे पास नोडाटा का बड़ा क्षेत्र है, यह ब्लॉक जीरो और 255s से भरता है। यह कैसे मैं nodata कोशिकाओं को संभाला है के साथ क्या करना है, और मुझे यकीन नहीं है कि मैं यह कैसे कर रहा था (हालांकि एक और होना चाहिए)। मैं किस बारे में बात कर रहा हूं, के चित्र शामिल थे।

#Setting the raster properties directly 
import arcpy 
import numpy 

inRaster0='C:/workspace/test0.tif' 
inRaster1='C:/workspace/test1.tif' 
outRaster='C:/workspace/test2.tif' 

dsc=arcpy.Describe(inRaster0) 
sr=dsc.SpatialReference 
ext=dsc.Extent 
ll=arcpy.Point(ext.XMin,ext.YMin) 

# sorry that i modify calculation from my original Q.  
# This is what I really wanted to do, taking two uint8 rasters, calculate 
# the ratio, express the results as percentage and then save it as uint8 raster.
tmp = [ np.ma.masked_greater(arcpy.RasterToNumPyArray(_), 100) for _ in inRaster0, inRaster1]
tmp = [ np.ma.masked_array(_, dtype=np.float32) for _ in tmp]
tmp = ((tmp[1] ) / tmp[0] ) * 100
tmp = np.ma.array(tmp, dtype=np.uint8)
# i actually am not sure how to properly carry the nodata back to raster...  
# but that's another Q
tmp = np.ma.filled(tmp, 255)

# without this, nodata cell may be filled with zero or 255?
arcpy.env.outCoordinateSystem = sr

newRaster = arcpy.NumPyArrayToRaster(myArrayPerc,ll,dsc.meanCellWidth,dsc.meanCellHeight) 

newRaster.save(outRaster) 

परिणाम दिखाने वाली छवि। मैं दोनों मामले नोडोडा कोशिकाओं को पीला दिखाया गया है।

ल्यूक की दूसरी विधि ल्यूक की दूसरी विधि

मेरी अस्थायी विधि मेरी अस्थायी विधि

जवाबों:


15

वर्णन विधि की जाँच करें ।

निम्नलिखित की तरह कुछ काम करना चाहिए।

#Using arcpy.env
import arcpy
import numpy

inRaster='C:/workspace/test1.tif'
outRaster='C:/workspace/test2.tif'

dsc=arcpy.Describe(inRaster)
arcpy.env.extent=dsc.Extent
arcpy.env.outputCoordinateSystem=dsc.SpatialReference
arcpy.env.cellSize=dsc.meanCellWidth

myArray = arcpy.RasterToNumPyArray(r)
myArraySum = myArray.sum(1)
myArraySum.shape = (myArray.shape[0],1)
myArrayPerc = (myArray * 1.0)/ myArraySum

newRaster = arcpy.NumPyArrayToRaster(myArrayPerc)
newRaster.save(outRaster)

या

#Setting the raster properties directly
import arcpy
import numpy

inRaster='C:/workspace/test1.tif'
outRaster='C:/workspace/test2.tif'

dsc=arcpy.Describe(inRaster)
sr=dsc.SpatialReference
ext=dsc.Extent
ll=arcpy.Point(ext.XMin,ext.YMin)

myArray = arcpy.RasterToNumPyArray(inRaster)
myArraySum = myArray.sum(1)
myArraySum.shape = (myArray.shape[0],1)
myArrayPerc = (myArray * 1.0)/ myArraySum

newRaster = arcpy.NumPyArrayToRaster(myArrayPerc,ll,dsc.meanCellWidth,dsc.meanCellHeight)
arcpy.DefineProjection_management(newRaster, sr)

newRaster.save(outRaster)

संपादित करें: आर्कपी.एनमपाय एरियरटॉस्टर विधि एक value_to_nodata पैरामीटर लेती है। इसका इस्तेमाल ऐसे करें:

try:
    noDataValue=dsc.noDataValue
    arcpy.NumPyArrayToRaster(myArrayPerc,ll,dsc.meanCellWidth,dsc.meanCellHeight,noDataValue)
except AttributeError: #no data is not defined
    arcpy.NumPyArrayToRaster(myArrayPerc,ll,dsc.meanCellWidth,dsc.meanCellHeight)

ल्यूक, उत्तर के लिए धन्यवाद। यह मुझे प्रतीत होता है कि मुझे आपके दो तरीकों में से कुछ हाइब्रिड करने की आवश्यकता है? दोनों विधि सीमा, spref आदि को सही करती है, लेकिन डेटा को सही ढंग से रखने में विफल रहती है ... पहली विधि सभी सेल को नोडाटा बनाती है। दूसरी विधि बेहतर तरीके से काम करती है, लेकिन वे मायरे में नोडटा कोशिकाओं को सही ढंग से संभालना नहीं चाहते हैं (क्षमा करें कि मैंने यह नहीं बताया कि मेरे सेल में कुछ नोडता है और मैं उन चीजों को बरकरार रखना चाहता हूं)। कुछ परीक्षण और त्रुटि ने मुझे लगता है कि मुझे दूसरा दृष्टिकोण लेना है लेकिन arcpy.env.outCoordinateSystem आउटपुट को उचित बनाता है। हालांकि ऐसा नहीं है की ज्यादा समझ।
yosukesabai

1
आपने NoData के बारे में नहीं पूछा, आपने स्थानिक संदर्भ और सेल आकार के बारे में पूछा। Arcpy.NumPyArrayToRaster विधि एक value_to_nodata पैरामीटर लेता है।
user2856

ल्यूक, संपादन के लिए धन्यवाद। मैंने 5 वें तर्क (value_to_nodata) प्रदान करने के आपके तरीके की कोशिश की, लेकिन मैंने अभी भी शीर्ष (नोडा सेल 0 या 255 से भरा है, और nodata_value आउटपुट रेखापुंज के लिए सेट नहीं है) पर आंकड़ा प्राप्त किया। इसके बाद मुझे जो एकमात्र समाधान मिला वह यह था कि NumPyArrayToRaster से पहले env.outputCoordinateSystem को सेट करना, इसके बजाय DefineProjection_management का उपयोग करना। यह समझ में नहीं आता कि यह क्यों काम करता है, लेकिन मैं सिर्फ अपने समाधान के साथ जाता हूं। सारी मदद के लिए धन्यवाद।
योसुकेसाबाई

1

मुझे यहां दिखाए गए उदाहरणों से NoData मानों को सही ढंग से संभालने के लिए ArcGIS की कुछ समस्याएं थीं। मैंने NoData को बेहतर ढंग से संभालने के लिए reomtesensing.io ब्लॉग (जो यहां दिखाए गए समाधानों के समान है या कम है) से उदाहरण का विस्तार किया ।

जाहिरा तौर पर आर्कगिस (10.1) को मूल्य -3.40282347e + 38 को NoData पसंद है। इसलिए मैं सुन्न NaN और -3.40282347e + 38 के बीच आगे और पीछे कन्वर्ट करता हूं। कोड यहाँ है:

import arcpy
import numpy as np

infile  = r'C:\data.gdb\test_in'
outfile = r'C:\data.gdb\test_out'

# read raster with No Data as numpy NaN
in_arr  = arcpy.RasterToNumPyArray(infile,nodata_to_value = np.nan)

# processing
out_arr = in_arr * 10

# convert numpy NaN to -3.40282347e+38
out_arr[np.isnan(out_arr)] = -3.40282347e+38

# information on input raster
spatialref = arcpy.Describe(infile).spatialReference
cellsize1  = arcpy.Describe(infile).meanCellHeight
cellsize2  = arcpy.Describe(infile).meanCellWidth
extent     = arcpy.Describe(infile).Extent
pnt        = arcpy.Point(extent.XMin,extent.YMin)

# save raster
out_ras = arcpy.NumPyArrayToRaster(out_arr,pnt,cellsize1,cellsize2, -3.40282347e+38)
out_ras.save(outfile)
arcpy.DefineProjection_management(outfile, spatialref)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.