Интерполяция углов при варпинге

Ответить
wowka1319
Участник
Сообщения: 93
Зарегистрирован: 04 дек 2013, 02:14
Репутация: 1

Интерполяция углов при варпинге

Сообщение wowka1319 » 14 апр 2015, 08:33

Нужно спроецировать растр в некоторую проекцию. Как это сделать я знаю.
Проблема в том, что каждый пиксель растра содержит значение угла [0, 360), и при интерполяции возникнут неверные значения в целевом геотифе.

Например, допустим значение пикселя целевого растра интерполируется исходя из значений двух пикселей исходного растра. Если их значения 359 и 1, то целевой пиксель будет равен ~180 (если веса равные), хотя должен быть равен 0, ибо это градусы.

Как решить эту проблему?

gamm
Гуру
Сообщения: 2981
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 694
Ваше звание: программист
Откуда: Казань

Re: Интерполяция углов при варпинге

Сообщение gamm » 14 апр 2015, 11:50

wowka1319 писал(а):Как решить эту проблему?
как обычно:
1) берем синус, интерполируем -> dy
2) берем косинус, интерполируем ->dx
3) восстанавливаем угол как atan2(dy,dx)
4) если хочется поизвращаться с гладкостью, берем кватернионы (если умеем с ними работать).

wowka1319
Участник
Сообщения: 93
Зарегистрирован: 04 дек 2013, 02:14
Репутация: 1

Re: Интерполяция углов при варпинге

Сообщение wowka1319 » 15 апр 2015, 01:05

Вроде бы понял, но почему-то не выходит:

например у нас два угла для целевого пикселя:
187гр с весом 0.3 и 53гр с весом 0.7.
Итоговый пиксель будет равен 53 + (187-53)*0.3 = 93.2 градусов
Но по вашему алгоритму получается 76.7 градусов:

dy_1 = sin(187) = -0,12186934340514748111289391923153
dx_1 = cos(187) = -0,99254615164132203498006158933058
dy_2 = sin(53) = 0,79863551004729284628400080406894
dy_2 = cos(53) = 0,60181502315204827991797700044149

target_dy = dy_1 * 0.3 + dy_2 * 0.7 = 0,5224840540115607480649323870788
target_dx = dx_1 * 0.3 + dx_2 * 0.7 = 0,12350667071403718544856542350987

atan2(target_dy, target_dx) = 1.33867356501 радиан = 76.7 градусов

что не так?

gamm
Гуру
Сообщения: 2981
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 694
Ваше звание: программист
Откуда: Казань

Re: Интерполяция углов при варпинге

Сообщение gamm » 15 апр 2015, 07:42

wowka1319 писал(а):что не так?
все так - при больших перепадах углов будет большая ошибка. Но обычно такие перепады (на 130 градусов, как у вас) в реальных данных отсутствуют, если не интерполировать что-то типа ориентации склонов.

P.S. а если у вас всего 2 значения, так и интерполируйте на круге, по малой дуге. Описанный метод используют, если данных много, и строится общий сплайн или подобное.

wowka1319
Участник
Сообщения: 93
Зарегистрирован: 04 дек 2013, 02:14
Репутация: 1

Re: Интерполяция углов при варпинге

Сообщение wowka1319 » 15 апр 2015, 08:46

Я просто использую gdalwarp, а он не умеет интерполировать по дуге - там просто нет такого функционала, чтобы указать, что данные это градусы.
Поэтому нужно сначала преобразовать растр углов в растр(ы) таких величин, чтобы после интерполяции gdalwarp-ом можно было получить углы обратно.
Ваш вариант с двумя растрами с sin и cos не плох и должен подойти для моей задачи (я интерполирую направления ветра).
Однако, хотелось бы использовать более точное решение. Буду рад если подскажите. А вообще, спасибо за ответ.

Ответить

Вернуться в «GDAL/OGR»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость