Задача: учитывая кучу зданий из файла geopandas и список линий, подсчитать количество линий, которые не пересекают ни одного здания / общее количество линий. В настоящее время я изучаю возможность использования для этого rasterio rasterize().
На изображениях показаны две промышленные зоны, выделенные красным и зеленым, а здания, потенциально блокирующие обзор, показаны синим цветом. Мы проводим линии от каждого метра по периметру красной зоны до каждого метра по зеленой зоне и проверяем, находится ли каждая линия в зоне прямой видимости (т. е. линия не пересекает здание). В каждом исследуемом городе имеется более 100 000 «отраслевых пар».
Вопрос: Существует ли метод (например, rasterio.transform.rowcol()), который при наличии списка xs и списка ys (или строк, столбцов) вернет значения всех пикселей, составляющих строку из растра?
Я выбрал объекты (здания) из файла geopandas и создал растр с помощью rasterio.features.rasterize().
Мне нужно будет сделать это для миллионов строк, поэтому я ищу быстрый способ сделать это.
Примечание. Я видел подобные вопросы.
Извлеките значения пикселей, чтобы сформировать мультиспектральное (B1-B6) растровое изображение, используя маску файла формы Похоже, что каждый вызов возвращает массив ndarray размером с исходный растр. Я пробовал что-то подобное, но использование np.any() для этих больших массивов (3 ГБ или больше) работало медленно. (Мне нужны только значения пикселей вдоль линий.)
Как извлечь профиль значения из растра по заданной линии? Судя по этому ответу, кажется, что не существует ни одного (быстрого) метода rasterio, который получал бы значения пикселей вдоль линии за один вызов вместо необходимости делать 1 вызов функции для чтения каждого значения пикселя. Это верно?
Обновлять:
Возможно, поможет конкретный пример. Когда я использую rastio.rasterize(), он возвращает ndarray. Скажем, это выглядит так
>>> a
array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19],
[20, 21, 22, 23, 24, 25, 26, 27, 28, 29],
[30, 31, 32, 33, 34, 35, 36, 37, 38, 39],
[40, 41, 42, 43, 44, 45, 46, 47, 48, 49],
[50, 51, 52, 53, 54, 55, 56, 57, 58, 59],
[60, 61, 62, 63, 64, 65, 66, 67, 68, 69],
[70, 71, 72, 73, 74, 75, 76, 77, 78, 79],
[80, 81, 82, 83, 84, 85, 86, 87, 88, 89],
[90, 91, 92, 93, 94, 95, 96, 97, 98, 99]])
Затем, если я используюraterio rowcol() для преобразования точек xy в местоположения rolcol, я получу что-то вроде этого
>>> rows
array([7, 8])
>>> cols
array([1, 2])
Примечание. строки и столбцы могут содержать тысячи значений.
Я надеюсь, что существует причудливый метод нарезки/индексирования numpy, который позволит мне не писать такой цикл
v = numpy.empty([len(rows)], dtype='uint8')
>>> for i, r in enumerate(rows) :
... v[i] = a[rows[i], cols[i]]
>>> v
array([71, 82], dtype=uint8)
@Pieter Мне трудно найти изображение с подходящим уровнем беспорядка. Существует две промышленные зоны (красный и зеленый многоугольники со зданиями, высота которых превышает высоту антенн Tx и Rx. Для каждой пары антенн, расположенных на расстоянии 1 метра друг от друга вокруг каждой промышленной зоны, мы хотим знать вероятность прямой видимости. (линия прямой видимости) видимость также ограничена расстоянием). Итак, на этом изображении все потенциальные линии заблокированы, поэтому вероятность существования прямой видимости 0% (игнорируя многолучевое распространение).
@Pieter Я уже пробовал красивое пересечение всех линий между всеми возможными местами вокруг многоугольников. (насчитывается несколько сотен тысяч отраслевых пар.). Кто-то использовал и поэтому предложил использовать растр и поиск линий, пересекающих здания, мог бы быть быстрее.
У меня нет никакого опыта в этом, но я предпочитаю думать, что человек, предлагающий растровый подход, имел в виду что-то вроде использования зон просмотра. Полагаю, вы использовали пространственный индекс, когда тестировали векторный подход?
Я надеюсь, что существует причудливый метод нарезки/индексирования numpy, который позволит мне не писать такой цикл
Вы можете индексировать массив, используя массив координат:
>>> a[rows, cols]
array([71, 82])
Обычно это в 100 раз быстрее, чем цикл на уровне Python при большом количестве итераций.
Можете ли вы добавить рисунок, чтобы уточнить, чего вы хотите достичь? Мне кажется, что все входные данные доступны в виде векторных данных... так почему же вы хотите преобразовать все в растр?