Нужно спроецировать растр в некоторую проекцию. Как это сделать я знаю.
Проблема в том, что каждый пиксель растра содержит значение угла [0, 360), и при интерполяции возникнут неверные значения в целевом геотифе.
Например, допустим значение пикселя целевого растра интерполируется исходя из значений двух пикселей исходного растра. Если их значения 359 и 1, то целевой пиксель будет равен ~180 (если веса равные), хотя должен быть равен 0, ибо это градусы.
Как решить эту проблему?
Интерполяция углов при варпинге
-
- Участник
- Сообщения: 93
- Зарегистрирован: 04 дек 2013, 02:14
- Репутация: 1
-
- Гуру
- Сообщения: 4056
- Зарегистрирован: 15 окт 2010, 08:33
- Репутация: 1054
- Ваше звание: программист
- Откуда: Казань
Re: Интерполяция углов при варпинге
как обычно:wowka1319 писал(а):Как решить эту проблему?
1) берем синус, интерполируем -> dy
2) берем косинус, интерполируем ->dx
3) восстанавливаем угол как atan2(dy,dx)
4) если хочется поизвращаться с гладкостью, берем кватернионы (если умеем с ними работать).
-
- Участник
- Сообщения: 93
- Зарегистрирован: 04 дек 2013, 02:14
- Репутация: 1
Re: Интерполяция углов при варпинге
Вроде бы понял, но почему-то не выходит:
например у нас два угла для целевого пикселя:
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 градусов
что не так?
например у нас два угла для целевого пикселя:
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 градусов
что не так?
-
- Гуру
- Сообщения: 4056
- Зарегистрирован: 15 окт 2010, 08:33
- Репутация: 1054
- Ваше звание: программист
- Откуда: Казань
Re: Интерполяция углов при варпинге
все так - при больших перепадах углов будет большая ошибка. Но обычно такие перепады (на 130 градусов, как у вас) в реальных данных отсутствуют, если не интерполировать что-то типа ориентации склонов.wowka1319 писал(а):что не так?
P.S. а если у вас всего 2 значения, так и интерполируйте на круге, по малой дуге. Описанный метод используют, если данных много, и строится общий сплайн или подобное.
-
- Участник
- Сообщения: 93
- Зарегистрирован: 04 дек 2013, 02:14
- Репутация: 1
Re: Интерполяция углов при варпинге
Я просто использую gdalwarp, а он не умеет интерполировать по дуге - там просто нет такого функционала, чтобы указать, что данные это градусы.
Поэтому нужно сначала преобразовать растр углов в растр(ы) таких величин, чтобы после интерполяции gdalwarp-ом можно было получить углы обратно.
Ваш вариант с двумя растрами с sin и cos не плох и должен подойти для моей задачи (я интерполирую направления ветра).
Однако, хотелось бы использовать более точное решение. Буду рад если подскажите. А вообще, спасибо за ответ.
Поэтому нужно сначала преобразовать растр углов в растр(ы) таких величин, чтобы после интерполяции gdalwarp-ом можно было получить углы обратно.
Ваш вариант с двумя растрами с sin и cos не плох и должен подойти для моей задачи (я интерполирую направления ветра).
Однако, хотелось бы использовать более точное решение. Буду рад если подскажите. А вообще, спасибо за ответ.
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 17 гостей