gdal WriteArray () аварийно завершает работу Python без трассировки стека - PullRequest
0 голосов
/ 01 марта 2019

Я пытаюсь записать массив в geotiff, используя gdal.Каждая строка массива идентична, и я использовал np.broadcast_to для создания массива.

Когда я пытаюсь написать его, я получаю всплывающее окно с сообщением «Python прекратил работать: проблема вызвана программойчтобы перестать работать правильно. Пожалуйста, закройте программу "

Это приблизительно соответствует шагам, которые я предпринимаю:

import gdal
import numpy as np

driver = gdal.GetDriverByName('GTiff')
outRaster = driver.Create("C:/raster.tif", 1000, 1000, 1, 6)
band = outRaster.GetRasterBand(1)

# Create  array 
a = np.arange(0,1000, dtype='float32')
a1 = np.broadcast_to(a, (1000,1000))

# try writing
band.WriteArray(a1) # crash

1 Ответ

0 голосов
/ 01 марта 2019

Проблема в том, что входной массив, созданный broadcast_to, не является непрерывным на диске.Как описано в пустой документации , более одного массива элементов могут указывать на один и тот же адрес памяти.Это вызывает проблемы в GDAL.

Вместо использования broadcast_to используйте что-то, что хранит каждый элемент как свое собственное место в памяти.В качестве иллюстративного примера см. Следующий код:

import gdal
import numpy as np
import sys

driver = gdal.GetDriverByName('GTiff')
outRaster = driver.Create("C:/raster.tif", 1000, 1000, 1, 6)
band = outRaster.GetRasterBand(1)

# Create 1000 x 1000 array two different ways
a = np.arange(0,1000, dtype='float32')
a1 = a[np.newaxis, :]
a1 = a1.repeat(1000, axis=0)

a2 = np.broadcast_to(a, (1000,1000))

# examine size of objects
sys.getsizeof(a1) # 4000112
sys.getsizeof(a2) # 112

# try writing
band.WriteArray(a1) # writes fine
band.WriteArray(a2) # crash
...