ArcGIS Desktopを使用してPythonでラスターイメージを配列として取得しますか?


10

PythonとArcGIS 9.3を使い始めたとき、ラスターイメージをPython配列に取り込む簡単な方法があり、それを別のラスターイメージとして保存する前に操作できると想定しました。しかし、私はこれを行う方法を見つけることができないようです。

可能であれば、どうやって?

回答:


6

これはArcGIS <= 9.3.1では不可能だと思います

このようなタスクには、オープンソースのGDAL APIを使用しています。


すごい!私は過去にGDALユーティリティプログラムを使用しましたが、これを行うためにそれらを使用することを考えたことはありません。
robintw

3
同意しますが、gdal Pythonモジュールを使用すると、ラスターを簡単に読み取り、Numpy配列にデータをダンプできます。Chris Garrardは、GISでOpenSource Pythonを使用するコースを持っています。このトピックをカバーしています。あなたはそれを見つけることができます: gis.usu.edu/~chrisg/python/2008
DavidF


6

fmarkは既に質問に答えていますが、ラスター(tif)をNumPy配列に読み取り、データを再分類して新しいtifファイルに書き込むために書いたOSGEO Pythonコードの例を次に示します。gdalでサポートされている任意のフォーマットを読み書きできます。

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

ラスタをESRI asciiグリッドとして保存し、numpyでそのファイルを読み取り/操作できます。

これはいくつかの出発点を提供します:http : //sites.google.com/site/davidpfinlayson2/esriasciigridformat

ただし、注意してください。ASCIIグリッド形式は常に仕様に準拠しているとは限らないため、毎回正しく読み取るのは難しい場合があります。


1

ラスターをピクセル単位で操作できるかどうかはわかりませんが、Python APIと組み合わせてジオプロセシングオブジェクトを使用できます。

この種の操作には、任意のツールボックスを使用できます。サンプルスクリプトは次のようになります。

#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ではわかりません。


ありがとう-それはとても役に立ちます。ただし、理想的には、さまざまな処理を行うラスターアレイ全体を反復処理できるようにしたいと考えています。ArcGISでこれを行う方法があったと思いましたが、そうでないかもしれません。
robintw

robintw、私がリファレンスで調べたもののために、ラスターの特定のピクセルを取得する方法はありません。ArcPy(v10から利用可能)でこれらの個別のセルをフェッチできるかどうかはわかりません。これらのセルは、Python APIを数多くの新しい機能で拡張したためです。
George Silva、

0

最も簡単な方法は、ラスターをnetCDFに変換し、それを開いてグリッドをウォークスルーすることです。ラスタセルに割り当てられたデータに基づいて、ラスタをフィーチャデータに変換することを含むプロジェクトでも、ほぼ同じことを行いました。私はこれを古くから見てきましたが、グリッドデータを歩くのはnetCDFの方が簡単だという結論に達しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.