Эффективная работа с растровыми данными в GDAL/Python: различия между версиями

Материал из GIS-Lab
Перейти к навигации Перейти к поиску
(Новая страница: «Чтение растровых данных Блочное чтение Самый быстрый и правильный способ читать растр…»)
 
Нет описания правки
 
Строка 1: Строка 1:
Чтение растровых данных
==Чтение растровых данных==


Блочное чтение
Блочное чтение


Самый быстрый и правильный способ читать растровые данные - читать их по блокам.
Самый быстрый и правильный способ читать растровые данные - читать их по внутренним блокам.
 
Узнать размер нативного блока можно выполнив:
 
<pre>gdalinfo raster.tif</pre>
 
Результат может выглядеть например так:
 
<pre>Band 2 Block=43200x1 Type=Float32, ColorInterp=Undefined</pre>
Как видно из примера, блоки могут быть разными для разных каналов. Для GeoTIFF блок всегда равен строке.
 
Получить размеры блока в программе на Python можно так:
<syntaxhighlight lang="python">
nBlockXSize = band.GetBlockSize()[0]
nBlockYSize = band.GetBlockSize()[1]
</syntaxhighlight>
 
==Обработка==
Растровые данные представляют собой матрицы, в Python эффективнее всего работать с матрицами используя массивы (array) numpy.
 
При этом стоит помнить, что операции с массивами стоит выполнять вдоль большой оси, это быстрее.
 
==Запись растровых данных==
Если чтение происходит поблочно, то и запись обычно тоже (в примере запись в первый канал):
 
<syntaxhighlight lang="python">
dataset.GetRasterBand(1).WriteArray(newarray,0,x)
</syntaxhighlight>
 
где x - номер строки.

Текущая версия от 22:03, 26 августа 2015

Чтение растровых данных

Блочное чтение

Самый быстрый и правильный способ читать растровые данные - читать их по внутренним блокам.

Узнать размер нативного блока можно выполнив:

gdalinfo raster.tif

Результат может выглядеть например так:

Band 2 Block=43200x1 Type=Float32, ColorInterp=Undefined

Как видно из примера, блоки могут быть разными для разных каналов. Для GeoTIFF блок всегда равен строке.

Получить размеры блока в программе на Python можно так:

nBlockXSize = band.GetBlockSize()[0]
nBlockYSize = band.GetBlockSize()[1]

Обработка

Растровые данные представляют собой матрицы, в Python эффективнее всего работать с матрицами используя массивы (array) numpy.

При этом стоит помнить, что операции с массивами стоит выполнять вдоль большой оси, это быстрее.

Запись растровых данных

Если чтение происходит поблочно, то и запись обычно тоже (в примере запись в первый канал):

dataset.GetRasterBand(1).WriteArray(newarray,0,x)

где x - номер строки.