python
  • arrays
  • save
  • mask
  • gdal
  • 2015-08-04 2 views 0 likes 
    0

    Я пытаюсь сохранить 3D masked_array данных в файл, используя следующий код:Сохранение 3D замаскированный массив

    print "Writing results to a file..." 
    format = "GTiff" 
    driver = gdal.GetDriverByName(format) 
    
    fileName = 'path_to_folder/FLENAME.tif' 
    NumberOfBands = 46 
    
    new_dataset = driver.Create(fileName, 2400, 2400, NumberOfBands,gdal.GDT_Float32) 
    new_dataset = None 
    
    for band in range(NumberOfBands): 
        new_dataset.GetRasterBand(band + 1).WriteArray(DATA[band,:,:]) 
    

    С этим я получаю ошибку: 'NoneType' object has no attribute 'GetRasterBand'

    Я попытался его без GetRasterband и получил 'NoneType' object is not attainable

    Первоначально в качестве альтернативы был испробован np.save, но он не был реализован и рекомендовал попробовать этот метод вместо этого.

    Любая помощь будет оценена по достоинству.

    Спасибо.

    Обновление: Оригинальная ошибка была решена благодаря предложению Кевина. Однако после сохранения файла проверка его содержала требуемые данные, показавшие, что все значения равны 0.0.

    -Эта проблема была решена с помощью предложения Майка Т. Однако, похоже, он сохраняет исходный незамасленный массив, а не необходимый masked_array.

    DATA в вопросе маскируется (masked_array) MODIS файл поверхностного отражения. Если пиксели, которые не требуются, являются значениями, которые маскируются.

    +0

    С [исправленной проблемой исправлено] (http://stackoverflow.com/a/31812161/838992) - вам нужно создать [минимальный, полный и проверенный пример] (http://stackoverflow.com/help/ mcve) - в частности, здесь нам нужно знать, что находится в переменной DATA, действительно ли есть ненулевые значения, по крайней мере, в некоторых диапазонах? –

    +0

    Спасибо, я обновил сообщение. Надеюсь, это то, что вы имели в виду. –

    ответ

    0

    Успели решить эту проблему, изменив маску данных для:

    mask = np.where(quality == 0, 1, 0)

    , а затем умножая маску с исходными данными при сохранении его, как показано ниже:

    for band in range(NumberOfBands): 
        out_band=new_dataset.GetRasterBand(band + 1) 
        out_band.WriteArray(databand[band,:,:] * mask[band]) 
    
    new_dataset = band = None 
    

    Я полагаю, что проблема заключалась в том, что применение маски к исходному массиву данных привело к созданию маскированного массива, содержащего все исходные значения данных и ма sk истинных ложных значений. При сохранении и чтении в файле игнорируется часть маски сохраненного массива, а затем отображаются все исходные значения. Это было исправлено, как указано выше, путем умножения маски на данные, сохраняя при этом только значения, разрешенные маской, и решение проблемы.

    Спасибо за помощь.

    1
    new_dataset = None 
    

    Попробуйте удалить эту строку. В противном случае все попытки получить доступ к атрибуту new_dataset после этого не удастся.

    +1

    Это, похоже, решило ошибку 'NoneType', спасибо. Но, похоже, он написал пустой файл, так как во всех значениях 0.0? –

    +0

    Извините, не могу сказать, что у меня есть опыт работы с 'gdal' ... Я надеялся, что никаких других проблем не будет скрываться за первым. – Kevin

    2

    Рекомендую прочитать Gotchas in the GDAL and OGR Python Bindings. В общем, вы можете отлаживать немного лучше, позволяя исключения, в верхней части:

    gdal.UseExceptions() 
    

    И почему вы видите все 0.0 значения, что вы, вероятно, нужно написать набор данных, разыменовывая band и new_dataset. Это может быть сделано на дне с:

    new_dataset = band = None # save, close 
    

    Чтобы написать замаскированных массивы, вам нужно установить NoDataValue. Например, если вы хотите -9999,0 не представлять никаких данных, то:

    NODATA = -9999 
    for bdx in range(new_dataset.RasterCount): 
        band = new_dataset.GetRasterBand(bdx + 1) 
        band.SetNoDataValue(NODATA) 
        band.WriteArray(DATA[bdx].filled(NODATA)) 
    new_dataset = band = None # save, close 
    

    Вы также можете рассмотреть возможность использования нечто большее Pythonic см rasterio. Например.:

    import rasterio 
    with rasterio.open(fileName, 'w', 'GTiff', 2400, 2400, NumberOfBands, dtype='f', 
            masked=True, nodata=NODATA) as r: 
        r.write(DATA.astype('f')) 
    
    +0

    Добавление этой строки в конец действительно решило проблему с значением 0.0 спасибо. Я забыл упомянуть ранее (и отредактировать мой пост), что данные, которые я пытаюсь сохранить, - это «masked_array». Теперь он сохраняет файл, но это оригинал без масок на месте. –

    +0

    Я также пробовал ваше предложение rasterio, однако модуль не реализован и, к сожалению, у меня нет необходимых привилегий для его установки там, где я работаю. –

    +0

    @MatthewStanding обновлен для маскированных массивов –

     Смежные вопросы

    • Нет связанных вопросов^_^