NumPyArrayToRaster
Краткая информация
Конвертирует массив NumPy в растр.
Обсуждение
Размер и тип данных полученного набора растровых данных зависит от входного массива.
NumpyArrayToRaster Поддерживает прямое преобразование массива 2D NumPy в одноканальный растр или массива 3D NumPy в многоканальный растр.
NumpyArrayToRaster поддерживает прямое преобразование массива 3D NumPy в многомерный набор растровых данных или массива 4D NumPy в многомерный многоканальный набор растровых данных путем указания многомерной информации.
Если входной растр имеет два измерения, то он возвращает одноканальный растр, где размер растра определяется измерениями (строки, столбцы).
Если входной массив имеет три измерения, то он возвращает многоканальный растр, где число каналов равно длине первого измерения, и размер растра определяется вторыми и третьими измерениями (каналы, строки, столбцы).
- Если входной массив имеет три измерения, и первое с размером 1, то он возвращает одноканальный растр.
Присутствие аргументов x_cell_size и y_cell_size позволяет поддерживать прямоугольные ячейки.
Примечание:
Размеры прямоугольных ячеек не поддерживаются для формата Esri Grid.
Эта функция учитывает следующие настройки среды геообработки:
Выходная система координат, Экстент, Растр привязки, Текущая рабочая область, Временная рабочая область
Синтаксис
NumPyArrayToRaster(in_array, {lower_left_corner}, {x_cell_size}, {y_cell_size}, {value_to_nodata}, {mdinfo})
| Параметр | Объяснение | Тип данных |
|---|---|---|
|
in_array |
Массив NumPy, конвертируемый в растр. Требуется двух- или трехмерный массив NumPy. |
NumPyArray |
|
lower_left_corner |
Объект По умолчанию, нижний левый угол устанавливается с координатами (0.0, 0.0). (Значение по умолчанию — None) |
Point |
|
x_cell_size |
Размер ячейки в направлении x, заданный в единицах карты. Входными данными могут быть заданное значение размера ячейки (тип: с двойной точностью) или входной растр. Когда набор данных задан, размер ячейки этого набора данных по оси x используется в качестве размера ячейки по оси x выходного растра. Если задано только значение Если ни значение (Значение по умолчанию — 1.0) |
Double |
|
y_cell_size |
Размер ячейки в направлении y, заданный в единицах карты. Входными данными могут быть заданное значение размера ячейки (тип: с двойной точностью) или входной растр. Когда набор данных задан, размер ячейки этого набора данных по оси x используется в качестве размера ячейки по оси y выходного растра. Если задано только значение Если ни значение (Значение по умолчанию — 1.0) |
Double |
|
value_to_nodata |
Значение в массиве NumPy, которому в выходном растре будет присвоено значение NoData. Если для (Значение по умолчанию — None) |
Double |
|
mdinfo |
Строка или JSON, задающие переменные и измерения в многомерном наборе растровых данных, использующиеся для построения многомерной информации. Строка должна быть в следующем формате:
(Значение по умолчанию — None) |
String |
Возвращаемое значение
| Тип данных | Объяснение |
|---|---|
|
Raster |
Выходной растр. |
Пример кода
Новый растр создается по случайно сгенерированному массиву NumPy.
import arcpy
import numpy
# Create a simple array from scratch using random values
myArray = numpy.random.random_integers(0,100,2500)
myArray.shape = (50,50)
# Convert array to a geodatabase raster
myRaster = arcpy.NumPyArrayToRaster(myArray,x_cell_size=1)
myRaster.save("C:/output/fgdb.gdb/myRandomRaster")
Поблочная обработка входного многоканального растра и расчет статистики для ячеек по каналам. Этот скрипт преобразует многоканальный растр в трехмерный массив NumPy и обрабатывает массив, разделяя его на блоки данных. Затем он вычисляет среднее значений по строкам блока, преобразует разбитый на блоки массив NumPy в растр и объединяет каналы посредством мозаики. Создан новый многоканальный растр.
# Note that, if the input raster is multiband, the data blocks will also be
# multiband, having dimensions (bands, rows, columns). Otherwise, they will
# have dimensions (rows, columns).
import arcpy
import numpy
import os
# Input raster
filein = os.path.join(os.getcwd(),r"input\input.tif")
# Output raster (after processing)
fileout = os.path.join(os.getcwd(),r"output\blockprocessingrdb22.tif")
# Size of processing data block
# where memorysize = datatypeinbytes*nobands*blocksize^2
blocksize = 512
# ----------------------------------------------------------------------------
# Create raster object from file
myRaster = arcpy.Raster(filein)
# Set environmental variables for output
arcpy.env.overwriteOutput = True
arcpy.env.outputCoordinateSystem = filein
arcpy.env.cellSize = filein
# Loop over data blocks
filelist = []
blockno = 0
for x in range(0, myRaster.width, blocksize):
for y in range(0, myRaster.height, blocksize):
# Lower left coordinate of block (in map units)
mx = myRaster.extent.XMin + x * myRaster.meanCellWidth
my = myRaster.extent.YMin + y * myRaster.meanCellHeight
# Upper right coordinate of block (in cells)
lx = min([x + blocksize, myRaster.width])
ly = min([y + blocksize, myRaster.height])
# noting that (x, y) is the lower left coordinate (in cells)
# Extract data block
myData = arcpy.RasterToNumPyArray(myRaster, arcpy.Point(mx, my),
lx-x, ly-y)
# PROCESS DATA BLOCK -----------------------------
# e.g. Calculate mean of each cell of all bands.
myData -= numpy.mean(myData, axis=0, keepdims=True)
# ------------------------------------------------
# Convert data block back to raster
myRasterBlock = arcpy.NumPyArrayToRaster(myData, arcpy.Point(mx, my),
myRaster.meanCellWidth,
myRaster.meanCellHeight)
# Save on disk temporarily as 'filename_#.ext'
filetemp = ('_%i.' % blockno).join(fileout.rsplit('.',1))
myRasterBlock.save(filetemp)
# Maintain a list of saved temporary files
filelist.append(filetemp)
blockno += 1
# Mosaic temporary files
arcpy.management.Mosaic(';'.join(filelist[1:]), filelist[0])
if arcpy.Exists(fileout):
arcpy.management.Delete(fileout)
arcpy.management.Rename(filelist[0], fileout)
# Remove temporary files
for fileitem in filelist:
if arcpy.Exists(fileitem):
arcpy.management.Delete(fileitem)
# Release raster objects from memory
del myRasterBlock
del myRaster
# ----------------------------------------------------------------------------
Конвертирует NumPyArray в многомерный растр.
import arcpy
import numpy
# Create multidimensional raster object from the NetCDF file
in_raster = Raster("myData.nc", True)
lowerLeft = arcpy.Point(in_raster.extent.XMin, in_raster.extent.YMin)
blockSize = 256
# Convert Raster to Array
myRasterBlock = arcpy.NumPyArrayToRaster(in_raster, lowerLeft, blockSize, blockSize)