Сглаживание / интерполяция растра в Python с использованием GDAL?

20

Я занимаюсь разработкой на Python и использую GDAL из OSGEO для работы с растрами и шейп-файлами и взаимодействия с ними.

Я хочу взять шейп-файл с точечными объектами и интерполировать его в поверхностный растр. Прямо сейчас я использую метод 'RasterizeLayer', который записывает значение из точечного объекта в растр (который устанавливается со всеми значениями узлов), но оставляет все нетронутые пиксели в качестве значения узлов. Поэтому у меня остался растр типа шахматной доски.

Что у меня после использования RasterizeLayer:

[Растр с использованием gdal.rasterizelayer]

Что я хочу для конечного продукта:

введите описание изображения здесь

Я считаю, что функция, которую я ищу, известна как 'Spline_sa ()' из импорта arcgisscripting.

GDAL имеет аналогичную функцию, или есть другой метод для получения желаемого результата?

Doug
источник

Ответы:

18

Я бы посмотрел на NumPy и Scipy - есть хороший пример интерполяции точечных данных в SciPy Cookbook с использованием функции scipy.interpolate.griddata . Очевидно, это требует, чтобы у вас были данные в массиве NumPy;

  • Используя привязки Python GDAL, вы можете считывать свои данные в Python, используя gdal.Dataset.ReadAsArray()растр.
  • С OGR вы бы проходили через векторный слой и извлекали точечные данные из шейп- файла (или, что еще лучше, записывали шейп- файл в CSV, используя GEOMETRY=AS_XYZ[см. Формат файла OGR CSV] и читали csv в Python).

Получив вывод в сетке, вы можете использовать GDAL для записи полученного массива в растр.

Наконец, если вам не повезло с библиотекой интерполяции Scipy, вы всегда можете также попробовать scipy.ndimage .

om_henners
источник
Спасибо за помощь! Я даю водолазу подход Scipy.interpolate.griddata. Я опубликую свои результаты.
Даг
1
Я прошу прощения за то, что так долго возвращался к этому посту. Ответ выше в основном то, что я сделал, чтобы решить мою проблему. Я использовал библиотеку интерполяции Scipy, чтобы заполнить эти пространства нодаты, а затем записал ее обратно в растровую полосу. Спасибо за помощь, ребята!
Даг
@ Дауг Не беспокойся - рад помочь!
om_henners
1
Как быстро это решение? Можно ли его использовать для сетки 10k x 10k, где только каждое 100x100 является известным значением? Я попробовал gdal_fillnodata, который невероятно быстр по сравнению с любой интерполяцией, но он не работает хорошо для слишком редких точек. В данный момент я использую триангуляцию от Saga, но она очень медленная для средних массивов и терпит неудачу с большими.
Миро
12

Взгляните на GDAL Gridal API . Я не знаю, присутствует ли это в привязках Python, но если нет, вы вызываете вызов утилиты gdal_grid через модуль подпроцесса .

GDAL grid API использует только взвешивание обратных расстояний, скользящее среднее и ближайший сосед, он не реализует сплайны. Другой вариант - использовать Scipy .

user2856
источник
1

Немного устаревший для этой темы, но я написал простой модуль, который использует алгоритм KNN из sklearn, называемый skspatial.

https://github.com/rosskush/skspatial

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

rosskush
источник