ArcGIS Desktop ile Python'da raster görüntüsünü dizi olarak mı alıyorsunuz?


10

Python ve ArcGIS 9.3 ile çalışmaya başladığımda, bir raster görüntüsünü Python dizisine almanın basit bir yolu olacağını varsaydım, böylece başka bir raster görüntüsü olarak saklamadan önce onu manipüle edebilirim. Ancak, bunu nasıl yapacağımı bulamıyorum.

Mümkünse, nasıl?

Yanıtlar:


6

Bunun ArcGIS <= 9.3.1 ile mümkün olduğunu düşünmüyorum

Bunun gibi görevler için açık kaynak GDAL API'sini kullanıyorum .


Harika! Geçmişte GDAL yardımcı programlarını kullandım, ancak bunları yapmak için kullanmayı hiç düşünmedim.
robintw

3
Kabul ediyorum, gdal Python modülü bir raster okumayı ve verileri bir Numpy dizisine dökmenizi sağlar. Chris Garrard'ın CBS'de OpenSource Python kullanma kursu var, bu konuyu kapsıyor. Bunu şu adreste bulabilirsiniz: gis.usu.edu/~chrisg/python/2008
DavidF


6

fmark zaten soruyu yanıtladı, ancak burada bir NumPy dizisine bir raster (tif) okumak, verileri yeniden sınıflandırmak ve daha sonra yeni bir tif dosyasına yazmak için yazdığım bazı örnek OSGEO Python kodu. Gdal destekli herhangi bir formatı okuyabilir ve yazabilirsiniz.

"""
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


1

Rasterinizi bir ESRI ascii ızgarası olarak kaydedebilir ve bu dosyayı numpy ile okuyabilir / değiştirebilirsiniz.

Bu, bazı başlangıç ​​noktaları sağlar: http://sites.google.com/site/davidpfinlayson2/esriasciigridformat

Ama dikkat edin - ascii ızgara formatı her zaman spesifikasyona uymuyor gibi görünüyor, bu yüzden her seferinde doğru okumak zor olabilir.


1

Raster pikseli piksel olarak işleyebileceğinizden emin değilim, ancak geoprocessing nesnelerini python API ile birlikte kullanabilirsiniz.

Bu tür bir manipülasyon için herhangi bir araç kutusunu kullanabilirsiniz. Örnek bir komut dosyası şöyle olur:

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

İşte sorunuzun takibi . Hala mümkün değil. Sürüm 10.0'dan emin değilim.


Teşekkürler - bu çok yardımcı oldu. Ancak, ideal olarak çeşitli şeyler yaparak raster dizisi boyunca yineleme yapabilmek istiyorum. ArcGIS'te bunu yapmanın bir yolu olacağını düşünürdüm, ama belki de değil!
robintw

robintw, ne referansta baktım, bir raster belirli bir piksel elde etmek için hiçbir yolu yoktur. ArcPy'de (v10'dan edinilebilir) bu tek tek hücreleri getirip getiremeyeceğinizden emin değilim, çünkü bunlar birçok yeni işlevle python API'sini genişletti.
George Silva

0

En kolay yol, rasterini netCDF'ye dönüştürmek ve sonra açmak ve ızgarada yürümek olacaktır. Raster hücrelere atanan verilere dayanarak rasterleri özellik verilerine dönüştürmeyi içeren bir proje için de aynı şeyi yaptım. Yaşları boyunca buna baktım ve netCDF'den ızgara verilerinin yürümesinin daha kolay olacağı sonucuna vardım.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.