আরকিপি ব্যবহার করে স্থানিক রেফারেন্স রাখছেন?


13

আমি আরকিজিআইএস 10.1 ব্যবহার করছি, এবং দুটি প্রিফিক্সিং রাস্টারের উপর ভিত্তি করে একটি নতুন রাস্টার তৈরি করতে চাই। 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")

সমস্যাটি এটি স্থানিক রেফারেন্স এবং কোষের আকারও বাদ দেয় stri আমি বুঝতে পেরেছিলাম এটি arcpy.env করতে হবে, তবে আমি কীভাবে ইনপুট রাস্টারটির উপর ভিত্তি করে সেগুলি সেট করব? আমি এটা বুঝতে পারি না।


লুকের উত্তর গ্রহণ করা, এটি আমার অভ্যাসগত সমাধান।

লুকের উভয় সমাধানই স্থানিক উল্লেখ, ব্যাপ্তি এবং ঘরের আকার সঠিকভাবে সেট করে। তবে প্রথম পদ্ধতিটি অ্যারেতে সঠিকভাবে ডেটা বহন করে না এবং আউটপুট রাস্টার সর্বত্র নোডাটা দিয়ে পূর্ণ হয়। তার দ্বিতীয় পদ্ধতিটি বেশিরভাগ ক্ষেত্রেই কাজ করে তবে আমার যেখানে নোডাটার বড় অঞ্চল রয়েছে এটি ব্লক শূন্য এবং 255s দিয়ে পূর্ণ। আমি কীভাবে নোডাটা কক্ষগুলি পরিচালনা করেছি তার সাথে এটি করার দরকার হতে পারে এবং আমি কীভাবে এটি করছিলাম তা সম্পর্কে পুরোপুরি নিশ্চিত নই (যদিও অন্য কিউ হওয়া উচিত)। আমি যা বলছি তার চিত্রগুলি আমি অন্তর্ভুক্ত করেছি।

#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)

সম্পাদনা: আরকিপি.নামপাইআরাইটোরাস্টার পদ্ধতিতে একটি মান_না_নোডাটা প্যারামিটার লাগে। এটি এর মতো ব্যবহার করুন:

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)

লুক, উত্তরের জন্য আপনাকে ধন্যবাদ। আমার কাছে মনে হচ্ছে আপনার দুটি পদ্ধতির হাইব্রিড কিছু করা দরকার? উভয় পদ্ধতিই পরিমাণ নির্ধারণ করে, স্প্রেফ ইত্যাদি সঠিক, তবে ডেটা সঠিকভাবে অ্যারে করতে ব্যর্থ হয় ... প্রথম পদ্ধতিটি সমস্ত সেলকে নোডাটা করে তোলে। দ্বিতীয় পদ্ধতিটি আরও ভাল কাজ করে, তবে তারা আমার অ্যারিতে নোডাটা কোষগুলি সঠিকভাবে পরিচালনা করবে বলে মনে হয় না (দুঃখিত যে আমি আমার সেলটিতে কিছুটা নোডাটা নেই বলেছি এবং আমি সেগুলি অক্ষত রাখতে চাই)। কিছু পরীক্ষা এবং ত্রুটি আমাকে ভাবতে বাধ্য করেছিল যে আমাকে দ্বিতীয় পন্থা গ্রহণ করতে হবে তবে আরকিপি.এনভি.আউটকর্ডিনেট সিস্টেম আউটপুটকে যুক্তিসঙ্গত দেখায়। যদিও এতটা বুঝতে পারছি না।
yosukesabai

1
আপনি নোডাটা সম্পর্কে জিজ্ঞাসা করেননি, আপনি স্থানিক রেফারেন্স এবং কক্ষের আকার সম্পর্কে জিজ্ঞাসা করেছিলেন। Arcpy.NumPyArrayToRaster পদ্ধতি value_to_nodata পরামিতি গ্রহণ করে।
user2856

লুক, সম্পাদনার জন্য আপনাকে ধন্যবাদ। আমি আপনার 5 তম আর্গুমেন্ট সরবরাহের পদ্ধতিটি (মান_টো_নোডাটা) চেষ্টা করেছি, তবে আমি এখনও শীর্ষে চিত্রটি পেয়েছি (0 বা 255 দিয়ে নোডাটা সেল পূরণ করা হয়েছে, এবং নোডাটা_মূল্য আউটপুট রাস্টারকে সেট করা হয়নি)। আমি খুঁজে পাওয়া একমাত্র কার্যপ্রণালীটি ছিল DefineProication_management এর পরিবর্তে NumPyArrayToRaster এর আগে এনভ.আউটপুটকর্ডিনেট সিস্টেম সেট করা। এটি কেন কাজ করে তা বোঝা যায় না, তবে আমি কেবল আমার সমাধান নিয়ে চলেছি। সমস্ত সাহায্যের জন্য আপনাকে ধন্যবাদ।
ইউসুকসাইভাই

1

এখানে প্রদর্শিত উদাহরণগুলির সাথে নোডাটা মানগুলি সঠিকভাবে পরিচালনা করতে আর্কজিআইএস পেতে আমার কিছু সমস্যা হয়েছিল। নোডাটা আরও ভালভাবে পরিচালনা করার জন্য আমি পুনরায়তত্ত্ব.ও ব্লগের উদাহরণটি বাড়িয়েছি (যা এখানে দেখানো সমাধানগুলির সাথে কমবেশি মিল রয়েছে) similar

স্পষ্টত অর্কিজিআইএস (10.1) নোডাটা হিসাবে -3.40282347e + 38 মান পছন্দ করে। সুতরাং আমি নপি ন্যান এবং -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)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.