Лучшее затенение для участков карты в R

Я работаю над улучшенным затенением для некоторых топографических карт. Основной рабочий процесс hillshade, задокументированный в image() - это:

require(raster)
alt = getData('alt', country='CHE')
slope = terrain(alt, opt='slope')
aspect = terrain(alt, opt='aspect')
hill = hillShade(slope, aspect, 40, 270)
plot(hill, col=grey(0:100/100), legend=FALSE, main='Switzerland')
plot(alt, col=rainbow(25, alpha=0.35), add=TRUE)

Это изображение показывает plot(hill..) до plot(alt..) применяется:

enter image description here

метод создает сплошной серый подслой холмов, на котором другие слои данных (например, затенение высот) отображаются полупрозрачно. Проблема с этим подходом заключается в том, что (a) нейтральный цвет для плоской местности (RBG (202,202,202), "#CACACA") сильно затеняет всю модель, которая (b) предотвращает множественный наслоение тени, как использовано 'Swiss hillshade' подход.

Я могу представить обходной путь, который преобразует растры в Матрицы и применяет hillshading в качестве численного множителя к яркости других слоев, но это не кажется очень элегантным (хотя я могу ошибаться). Интересно, есть ли у кого-нибудь идеи или (желательно) опыт в этой области? Спасибо заранее.

1 ответов


нет опыта в этом, но почему бы не дать серому undermap Альфа-значение, которое зависит от склонов? Вот моя попытка:

# before
require(raster)
alt = getData('alt', country='CHE')
slope = terrain(alt, opt='slope')
aspect = terrain(alt, opt='aspect')
hill = hillShade(slope, aspect, 40, 270)
plot(hill, col=grey(0:100/100), legend=FALSE, main='Switzerland')
plot(alt, col=rainbow(25, alpha=0.35), add=TRUE)

enter image description here

как вы говорите, очень темно.

# after
grayalphas <- seq(-1,1,by=.01)^2*100
grayalphas[grayalphas==100] <- 99
plot(hill, col=paste0(grey(0:100/100),sprintf("%.2d",grayalphas)), legend=FALSE, main='Switzerland')

plot(alt, col=rainbow(25, alpha=0.35), add=TRUE)

enter image description here

Я установил, что серые Альфы имеют параболическую форму с минимальным значением серого .5 и МАКС 99 на серых значениях 0 или 1. Если вы выберете что-то подобное, вам захочется поработать с уровнями и т. д., Но это легко реализовать. Плюс вы хочу приложить больше усилий, чем я сделал в Альфах, так как мои строго числовые, а не шестнадцатеричные.

[Edit] я нашел отличную функцию для добавления Альф,addTrans() здесь в ответе Саши Эпскампа. Это сохраняет параболу, но она колеблется от 0 в середине до 255 на крайностях.

grayalphas <- seq(-1,1,length=101)^2*255
plot(hill, col=addTrans(grey(0:100/100),grayalphas), legend=FALSE, main='Switzerland')
plot(alt, col=rainbow(25, alpha=0.35), add=TRUE)

enter image description here