รับภาพแรสเตอร์เป็นอาร์เรย์ใน Python ด้วย ArcGIS Desktop หรือไม่


10

เมื่อเริ่มทำงานกับ Python และ ArcGIS 9.3 ฉันคิดว่าจะมีวิธีง่าย ๆ ในการนำภาพแรสเตอร์มาไว้ในอาร์เรย์ Python เพื่อที่ฉันจะสามารถจัดการมันได้ก่อนที่จะจัดเก็บไว้ในรูปแบบแรสเตอร์อื่น อย่างไรก็ตามฉันไม่สามารถหาวิธีทำสิ่งนี้ได้

ถ้าเป็นไปได้แล้วจะเป็นอย่างไร?

คำตอบ:


6

ฉันไม่คิดว่ามันเป็นไปได้ด้วย ArcGIS <= 9.3.1

ฉันใช้โอเพนซอร์สGDAL APIสำหรับงานเช่นนี้


ที่ดี! ฉันเคยใช้โปรแกรมอรรถประโยชน์ของ GDAL มาก่อน แต่ไม่เคยคิดที่จะใช้มันทำสิ่งนี้
robintw

3
ฉันยอมรับโมดูล gdal Python ช่วยให้คุณอ่านแรสเตอร์และถ่ายโอนข้อมูลไปยังอาร์เรย์ Numpy ได้อย่างง่ายดาย Chris Garrard มีหลักสูตรเกี่ยวกับการใช้ OpenSource Python ใน GIS ซึ่งครอบคลุมหัวข้อนี้ คุณสามารถค้นหาได้ที่: gis.usu.edu/~chrisg/python/2008
DavidF

10

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

ArcGIS 10 มีความสามารถในการเขียนและอ่านอาร์เรย์ numPy


ขอบคุณ! น่าเศร้าที่ฉันใช้ ArcGIS 9.3 ในตอนนี้ - คุณรู้ไหมว่ามีวิธีการทำเช่นนี้ใน 9.3?
robintw

6

fmark ตอบคำถามแล้ว แต่นี่คือตัวอย่างโค้ด OSGEO Python ที่ฉันเขียนเพื่ออ่านแรสเตอร์ (tif) ลงในอาร์เรย์ NumPy จัดเรียงข้อมูลใหม่แล้วเขียนลงในไฟล์ tif ใหม่ คุณสามารถอ่านและเขียนรูปแบบใดก็ได้ที่สนับสนุน 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

2

เข้าถึง ArcObjects จาก Python หรือไม่ กล่าวถึงการรวม arcobjects กับ python

บางทีรหัสในตัวอย่างนี้สามารถปรับเพื่อให้สามารถเรียกได้จากหลาม

ฉันไม่แน่ใจว่ามีวิธีการส่งผ่านอาร์เรย์กลับเป็นไพ ธ อนหรือไม่ หากมีแล้วIPixelBlock.PixelDatabyRefจะคุ้มค่าลอง


1

คุณสามารถบันทึกแรสเตอร์ของคุณเป็นตาราง ESRI ascii และอ่าน / จัดการไฟล์นั้นด้วยจำนวนมาก

นี่เป็นจุดเริ่มต้นบางส่วน: 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 ด้วย funcionality ใหม่ ๆ มากมาย
George Silva

0

วิธีที่ง่ายที่สุดคือการแปลงแรสเตอร์เป็น netCDF จากนั้นเปิดและเดินผ่านกริด ฉันทำสิ่งเดียวกันมากสำหรับโครงการที่เกี่ยวข้องกับการเปลี่ยนแรสเตอร์เป็นข้อมูลคุณลักษณะตามข้อมูลที่กำหนดให้กับเซลล์แรสเตอร์ ฉันดูสิ่งนี้มานานแล้วและสรุปว่าการเดินข้อมูลกริดนั้นง่ายกว่าจาก netCDF

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.