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

래스터를 픽셀 단위로 조작 할 수 있는지 확실하지 않지만 파이썬 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에서 사용 가능) 에서이 개별 셀을 가져올 수 있는지 확실하지 않습니다. 많은 새로운 기능으로 파이썬 API를 확장했기 때문입니다.
George Silva

0

가장 쉬운 방법은 래스터를 netCDF로 변환 한 다음 열어서 그리드를 걷는 것입니다. 래스터 셀에 할당 된 데이터를 기반으로 래스터를 피처 데이터로 변환하는 프로젝트와 매우 비슷한 작업을 수행했습니다. 나는 이것을 오랫동안 보았고 netCDF에서 그리드 데이터를 걷는 것이 더 쉽다는 결론에 도달했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.