PixelBlockCollection

Эта документация ArcGIS 3.1 была перемещена в архив и более не обновляется. Ресурсы и ссылки могут быть устаревшими. См. самую последнюю документацию.

Краткая информация

Задает доступ только для чтения для всех блоков пикселов из одного растра или списка растров.

Обсуждение

Объект PixelBlockCollection является итератором для всех объектов PixelBlock в растре или списке растров. Его можно использовать для выполнения пользовательской растровой обработки поблочно, когда в противном случае обработанные растры будут слишком большими для загрузки в память.

Класс PixelBlockCollection поддерживает одиночный растр или список растров в качестве входных данных. Если на вход подается одиночный растр, то в результате будет только два измерения (количество блоков пикселов по y, количество блоков пикселов по x). Например, для доступа к первому блоку пикселов во входном растре, используйте следующее:

pixelblockcoll = PixelBlockCollection(in_raster)
numpy_array = pixelblockcoll[0][0].getData()

Если на вход подается список растров, то в результате будет три измерения (количество блоков пикселов по y, количество блоков пикселов по x, количество входных растров). Например, для доступа к первому блоку пикселов из второго растра в списке, используйте следующее:

pixelblockcoll = PixelBlockCollection(in_raster1, in_raster2) numpy_array = pixelblockcoll[0][0][1].getData()

Аргумент stride класса PixelBlockCollection определяет число битов от одной строки пикселов в памяти до другой строки пикселов в памяти. Это также называется приращением, размером шага или интервалом. На рисунке ниже показано, как объект PixelBlockCollection итерационно проходит через пикселы, когда задан шаг по умолчанию, который соответствует размеру блока пикселов:

Набор группы пикселов с шагом по умолчанию

На рисунке ниже показано, как объект PixelBlockCollection итерационно проходит через пикселы, если задан шаг (2, 1):

Набор группы пикселов с шагом (2,1)

Синтаксис

PixelBlockCollection
 (in_rasters, pixel_block_size, stride, overlay_type, nodata_to_values)
ПараметрОписаниеТип данных
in_rasters
[in_rasters,...]

Входной растровых объект или список растровых объектов. Если вы используете список растровых объектов, все растры должны иметь одинаковые размер ячейки и пространственную привязку.

Raster
pixel_block_size

Кортеж с двумя значениями, описывающими размер блока (число строк, число столбцов).

(Значение по умолчанию — (512, 512))

tuple
stride

Кортеж с двумя целыми числами, задающими шаг или приращение по строкам и столбцам для обработки.

Если значение не указано, будет использоваться размер блока пикселов, и смежные блоки пикселов не будут перекрываться.

(Значение по умолчанию — None)

tuple
overlay_type

Определяет тип перекрытия, если у входных растров разные экстенты.

  • INTERSECTIONБлоки пикселов будут покрывать только область пересечения растров.
  • UNIONБлоки пикселов будут покрывать экстент всех растров.

(Значение по умолчанию — INTERSECTION)

String
nodata_to_values
[nodata_to_values,...]

Значение для присвоения значений NoData входных растров в полученный массив NumPy. Это может быть одно значение или список значений - одно для каждого растра.

Integer

Свойства

СвойствоОписаниеТип данных
size
(только чтение)

Число блоков пикселов по направлениям y и x в наборе блоков пикселов. Число блоков пикселов по направлению y идет первым.

tuple

Обзор метода

МетодОписание
reset ()

Сбрасывает итератор коллекции блоков пикселов в начало коллекции.

shuffle ()

Перемешивает блоки пикселов в коллекции блоков пикселов. Это полезно при передаче образцов изображений в модель глубокого обучения.

Методы

reset ()
Возвращаемое значение
Тип данныхОписание
PixelBlockCollection

Объект PixelBlockCollection, который был сброшен.

shuffle ()
Возвращаемое значение
Тип данныхОписание
PixelBlockCollection

Объект PixelBlockCollection с перемешанными блоками пикселов.

Пример кода

Пример PixelBlockCollection 1 (окно Python)

Итерационно проходит через блоки пикселов для вычисления общей площади застройки в растре ландшафта.

import arcpy 

# Specify the input raster
in_raster1 = arcpy.Raster("landcover.tif")  
 
# Create a PixelBlockCollection 
blockCollection = arcpy.ia.PixelBlockCollection(
	in_raster1, pixel_block_size = (512, 512), nodata_to_values = -1) 

# Check the number of pixelblocks along x and y direction 
number_blocks_y, number_blocks_x= blockCollection.size 

urban_cell_count=0 

# Iterate through each PixelBlock 
for i in range(number_blocks_y):
    for j in range(number_blocks_x):
        pixelblock = blockCollection[i,j] 
	np_array = pixelblock.getData()
	urban_cell_count+= np.count_nonzero(np_array == 3) 
	# value = 3 is urban class 

urban_area = urban_cell_count * in_raster1.meanCellWidth*in_raster1.meanCellHeight 
print("Total urban area : " + str(urban_area))
Пример PixelBlockCollection 2 (автономный скрипт)

Итерационно проходит через блоки пикселов для вычисления общей площади уменьшения лесов в пользу застройки с 2006 по 2016 годы.

import arcpy 
from arcpy.ia import *

# Specify the input rasters
in_raster1 = arcpy.Raster("C:/iapyexamples/data/landcover_2006.tif")  
in_raster2 = arcpy.Raster("C:/iapyexamples/data/landcover_2016.tif")  
 
# Create a PixelBlockCollection 
blockCollection = arcpy.ia.PixelBlockCollection(
	[in_raster1, in_raster2], pixel_block_size = (256, 256), nodata_to_values = -1) 

# Check the number of pixelblocks along x and y direction 
number_blocks_y, number_blocks_x= pixelblocks.size 

forest_to_urban_cell_count = 0 

# Iterate through each PixelBlock

for i in range(number_blocks_y): 
    for j in range(number_blocks_x): 
        pixelblocklist = blockCollection[i][j]
        # get the array from pixelblock in the 1st raster
        array_in_raster1 = pixelblocklist[0].getData()  
        # get the array from pixelblock in the 2nd raster
        array_ in_raster2 = pixelblocklist[1].getData()  

        forest_in_raster1= array_in_raster1[array_in_raster1==1] # value = 1 is forest class 
        urban_in_raster2= array_in_raster2[array_in_raster2==3] # value = 3 is urban class 
        res= forest_in_raster1+ urban_in_raster2  
        forest_to_urban_cell_count+= np.count_nonzero(res == 4) # value = 4 is forest in in_raster1 and urban in in_raster2 

forest_to_urban_area= forest_to_urban_cell_count * in_raster1.meanCellWidth*in_raster1.meanCellHeight 
print("total area from forest in 2006 to urban in 2016 : " + str(forest_to_urban_area))