Ошибка перекрытия с использованием маски Rasterio в Python

У меня есть растровый файл спутникового изображения и шейп-файл, состоящий из нескольких дискретных полигонов. Я хотел бы индивидуально извлечь (или замаскировать) массив изображений Numpy для каждого из этих многоугольников из растрового файла.

В настоящее время я импортирую шейп-файл с помощью Fiona и создаю список полигонов. У меня нет проблем с маскированием растрового файла с использованием всех полигонов сразу. Однако, когда я пытаюсь использовать отдельный многоугольник из списка, я получаю сообщение об ошибке: «ValueError: входные формы не перекрывают растр». Это несмотря на то, что ранее был получен успешный результат, и оба файла использовали одну и ту же CRS.

import rasterio
import shapefile
import fiona
import numpy as np

with fiona.open("test.shp", "r") as shapefile:

    features = [feature["geometry"] for feature in shapefile]

features = [x for x in features if x is not None]

Это работает:

with rasterio.open('sat_img_B01.jp2') as src:

    out_image, out_transform = rasterio.mask.mask(src, features,
                                                        crop=True)

Это не работает (WindowError: окна не пересекаются и ValueError: входные фигуры не перекрывают растр):

index = 0

with rasterio.open('sat_img_B01.jp2') as src:

    out_image, out_transform = rasterio.mask.mask(src, [features[index]], crop=True)

Полагаю, я упускаю что-то фундаментальное! Есть ли элегантный способ извлечения каждого многоугольника в списке «объектов» в виде отдельного файла изображения / массива numpy из растрового изображения?

Спасибо!!


person Will000    schedule 19.04.2019    source источник


Ответы (1)


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

person Firas Omrane    schedule 02.09.2019
comment
Вы можете уточнить этот момент? У меня такая же проблема - person Claus; 08.01.2020
comment
@Claus Я помню, что моя проблема заключалась в том, что шейп-файл и растровое изображение не загружаются с одним и тем же crs (система координат). Я думаю, что вы уже загрузили их оба (шейп-файл с помощью fiona) и (растровое изображение с помощью resterio). Чтобы шейп-файл печатал crs с использованием свойства .crs, а для рестерио попробуйте загрузить растровое изображение с помощью src = rasterio.open('image'), и они распечатают его crs src.crs. Если два crs не совпадают, маска работать не будет. Решение состоит в том, чтобы заменить crs одного из них на другой. Я знаю, что это поздно. - person Firas Omrane; 31.05.2020