ArcGIS डेस्कटॉप के साथ पायथन में सरणी के रूप में रेखापुंज छवि प्राप्त करना?


10

जब पायथन और आरकेजीआईएस 9.3 के साथ काम करना शुरू किया, तो मैंने माना कि पायथन सरणी में एक रेखापुंज छवि प्राप्त करने का एक सरल तरीका होगा ताकि मैं इसे एक और रेखापुंज छवि के रूप में वापस संग्रहीत करने से पहले हेरफेर कर सकूं। हालाँकि, मुझे यह पता नहीं लग सकता है कि यह कैसे करना है।

अगर यह संभव है, तो कैसे?

जवाबों:


6

मुझे नहीं लगता कि यह आर्कजीस <= 9.3.1 के साथ संभव है

मैं इस तरह के कार्यों के लिए खुले स्रोत GDAL API का उपयोग करता हूं ।


महान! मैंने अतीत में GDAL उपयोगिता कार्यक्रमों का उपयोग किया है, लेकिन ऐसा करने के लिए उनका उपयोग करने के बारे में कभी नहीं सोचा था।
रोबिन्ट

3
मैं सहमत हूं, गेल्ड पायथन मॉड्यूल आपको आसानी से एक रेखापुंज पढ़ने और डेटा को एक नेम्पी सरणी में डंप करने की अनुमति देता है। क्रिस गेरार्ड के पास जीआईएस में ओपनसोर्स पायथन का उपयोग करने का एक कोर्स है, यह इस विषय को कवर करता है। आप इसे यहां देख सकते हैं: gis.usu.edu/~chrisg/python/2008
DavidF

10

http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#/RasterToNumPyArray/000v0000012z000000/

आर्कजीआईएस 10 में संख्यात्मक सरणियों को लिखने और पढ़ने की क्षमता है।


धन्यवाद! अफसोस की बात है, मैं इस समय ArcGIS 9.3 पर हूं - क्या आप जानते हैं कि 9.3 में ऐसा करने का कोई तरीका है?
robintw

6

fmark ने पहले ही सवाल का जवाब दे दिया, लेकिन यहां कुछ उदाहरण OSGEO पायथन कोड है, जो मैंने एक रैस्टर (tif) को एक NumPy ऐरे में पढ़ने के लिए लिखा था, डेटा रिकॉल करता है और फिर इसे एक नई tif फाइल में लिखता है। आप किसी भी गदल समर्थित प्रारूप को पढ़ और लिख सकते हैं।

"""
Example of raster reclassification using OpenSource Geo Python

"""
import numpy, sys
from osgeo import gdal
from osgeo.gdalconst import *


# register all of the GDAL drivers
gdal.AllRegister()

# open the image
inDs = gdal.Open("c:/workshop/examples/raster_reclass/data/cropland_40.tif")
if inDs is None:
  print 'Could not open image file'
  sys.exit(1)

# read in the crop data and get info about it
band1 = inDs.GetRasterBand(1)
rows = inDs.RasterYSize
cols = inDs.RasterXSize

cropData = band1.ReadAsArray(0,0,cols,rows)

listAg = [1,5,6,22,23,24,41,42,28,37]
listNotAg = [111,195,141,181,121,122,190,62]

# create the output image
driver = inDs.GetDriver()
#print driver
outDs = driver.Create("c:/workshop/examples/raster_reclass/output/reclass_40.tif", cols, rows, 1, GDT_Int32)
if outDs is None:
  print 'Could not create reclass_40.tif'
  sys.exit(1)

outBand = outDs.GetRasterBand(1)
outData = numpy.zeros((rows,cols), numpy.int16)


for i in range(0, rows):
  for j in range(0, cols):

    if cropData[i,j] in listAg:
        outData[i,j] = 100
    elif cropData[i,j] in listNotAg:
        outData[i,j] = -100
    else:
        outData[i,j] = 0


# write the data
outBand.WriteArray(outData, 0, 0)

# flush data to disk, set the NoData value and calculate stats
outBand.FlushCache()
outBand.SetNoDataValue(-99)

# georeference the image and set the projection
outDs.SetGeoTransform(inDs.GetGeoTransform())
outDs.SetProjection(inDs.GetProjection())

del outData

2

पायथन से आर्कोबजेक्ट्स एक्सेस करना? अजगर के साथ आर्कोबिज के एकीकरण पर चर्चा करता है।

शायद इस नमूने के कोड को अनुकूलित किया जा सकता है ताकि इसे अजगर से बुलाया जा सके।

मुझे यकीन नहीं है कि एक तरीका है जब आप किसी सरणी को वापस करने के लिए अजगर को पास कर सकते हैं। अगर वहाँ है, तो IPixelBlock.PixelDatabyRef कोशिश करने लायक होगा।


1

आप एक ESRI ascii ग्रिड के रूप में अपने रेखापुंज को बचा सकते हैं और उस फ़ाइल को सुन्न के साथ जोड़ / पढ़ सकते हैं।

यह कुछ शुरुआती बिंदु प्रदान करता है: http://sites.google.com/site/davidpfinlayson2/esriasciidridatat

लेकिन ध्यान रखें - ऐसा लगता है कि एएससीआई ग्रिड प्रारूप हमेशा कल्पना का पालन नहीं करता है, इसलिए हर बार उन्हें ठीक से पढ़ना एक चुनौती हो सकती है।


1

मुझे यकीन नहीं है कि आप पिक्सेल द्वारा रेखापुंज पिक्सेल में हेरफेर कर सकते हैं, लेकिन आप अजगर एपीआई के साथ संयोजन में जियोप्रोसेसिंग ऑब्जेक्ट का उपयोग कर सकते हैं।

आप उस तरह के हेरफेर के लिए किसी भी टूलबॉक्स का उपयोग कर सकते हैं। एक नमूना स्क्रिप्ट होगी:

#import arcgisscripting

gp = arcgisscripting.create(9.3)

gp.AddToolbox("SA") # addint spatial analyst toolbox

rasterA = @"C:\rasterA.tif"
rasterB = @"C:\rasterB.tif"

rasterC = @"C:\rasterC.tif" # this raster does not yet exist
rasterD = @"C:\rasterD.tif" # this raster does not yet exist

gp.Minus_SA(rasterA,rasterB,rasterC)

gp.Times_SA(rasterA,rasterB,rasterD)

# lets try to use more complex functions

# lets build and expression first

expression1 = "slope( " + rasterC + ")"
expression2 = "(" + rasterC " + " rasterD + ") - " + rasterA 

gp.SingleOutputMapAlgebra_SA(expression1,@"C:\result_exp1.tif")
gp.SingleOutputMapAlgebra_SA(expression2,@"C:\result_exp2.tif")

यहां आपके प्रश्न का अनुसरण किया गया है । फिर भी संभव नहीं है। संस्करण 10.0 पर निश्चित नहीं है।


धन्यवाद - यह बहुत उपयोगी है। हालांकि, आदर्श रूप से मैं इसे विभिन्न चीजों को करने वाले रैस्टर सरणी में पुनरावृति करने में सक्षम होना चाहता हूं। मैंने सोचा होगा कि ऐसा करने के लिए आर्कगिस में एक तरीका होगा, लेकिन शायद नहीं!
रोबिन

रोबिंटव, जो मैंने संदर्भ में देखा है, के लिए एक रैस्टर का एक विशिष्ट पिक्सेल प्राप्त करने का कोई तरीका नहीं है। मुझे यकीन नहीं है कि अगर आर्कपी (वी 10 से उपलब्ध) आप इन व्यक्तिगत कोशिकाओं को प्राप्त कर सकते हैं, क्योंकि उन्होंने बहुत सी नई फंक्शनलिटी के साथ अजगर एपीआई का विस्तार किया।
जॉर्ज सिल्वा

0

सबसे आसान तरीका होगा रैस्टर को netCDF में बदलना और फिर उसे खोलकर ग्रिड से चलना। मैं एक बहुत ही परियोजना के लिए एक ही बात किया है जिसमें रेखापुंज कोशिकाओं को सौंपा डेटा के आधार पर फीचर डेटा में रेखापुंज शामिल है। मैंने इसे उम्र के लिए देखा, और निष्कर्ष पर आया कि ग्रिड डेटा चलना netCDF से आसान होगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.