Згладжування / інтерполяція растра в Python за допомогою GDAL?


20

Я розвиваюся в Python і використовую GDAL від OSGEO для маніпулювання та взаємодії з растрами та формами файлів.

Я хочу взяти файл форми, який має точкові особливості та інтерполювати його в поверхневий растр. Зараз я використовую метод "RasterizeLayer", який записує значення з функції точки в растр (який встановлюється з усіма значеннями нодату), але залишає всі не торкані пікселі як значення "ноданих". Тому в мене залишився растр типу шахівниці.

Що я маю після використання RasterizeLayer:

[Растр від використання gdal.rasterizelayer]

Що я хочу для кінцевого продукту:

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

Я вважаю, що функція, яку я шукаю, відома як "Spline_sa ()" від імпорту arcgisscripting.

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

Відповіді:


18

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

  • Використовуючи прив'язки python GDAL, ви можете прочитати свої дані в Python, використовуючи gdal.Dataset.ReadAsArray()для растру.
  • За допомогою OGR ви переймете прошарок функції та витягніть дані точок із файлу форми (а ще краще, запишіть файл форми у CSV, використовуючи GEOMETRY=AS_XYZ[див. Формат файлу CSR OGR] та прочитайте csv у Python).

Після того, як ви отримаєте сітку з виведенням, ви можете використовувати GDAL, щоб записати отриманий масивний масив у растр.

Нарешті, якщо у вас немає щастя з інтерполяційною бібліотекою Scipy, ви завжди можете також спробувати scipy.ndimage .


Дякую за допомогу! Я даю Scipy.interpolate.griddata наблизитися до вихору. Я опублікую свої результати.
Дуг

1
Прошу вибачення за те, що зайняв стільки часу, щоб повернутися до цієї посади. Відповідь вище - в основному те, що я зробив, щоб вирішити свою проблему. Я використав інтерполяційну бібліотеку Scipy, щоб заповнити ці проміжки з нодазами, а потім записав її назад у растровий діапазон. Дякую за допомогу, хлопці!
Даг

@Doug Не хвилюйся - радий зцілити!
om_henners

1
Наскільки швидко це рішення? Чи можна його використовувати для сітки 10k x 10k, де відома лише кожна 100x100? Я спробував gdal_fillnodata, який неймовірно швидкий порівняно з будь-якою інтерполяцією, але він не працює добре для надто рідких точок. На даний момент я використовую тріангуляцію від Saga, але це дуже повільно для середніх масивів і не вдається з великими.
Миро

12

Подивіться на GDAL грідінга API . Я не знаю, чи виявляється це в прив'язках Python, але якщо ні, ви викликаєте виклик утиліти gdal_grid через модуль підпроцесу .

API сітки GDAL використовує лише зворотне зважування, середній і найближчий сусід, він не реалізує сплайни. Ще один варіант - використовувати Scipy .


1

Трохи старий для цього потоку, але я написав простий модуль, який використовує алгоритм KNN від sklearn, який називається skspatial.

https://github.com/rosskush/skspatial

Ви можете імпортувати файл форми за допомогою геопанд і вибрати стовпчик, і він буде інтерполювати поверхню, яку можна експортувати в растр. Це дуже просто і, мабуть, не найкращий спосіб це зробити, але він зберігає як мінімум чистий пітон.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.