我正在为一些地形图绘制改进的山体阴影。 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..)
:
该方法创建一个纯色的灰色底层山体阴影,其中半透明地绘制其他数据层(例如高程阴影)。这种方法的问题是(a)平坦地形的中性色(RBG(202,202,202),'#CAPACA')严重遮蔽整个模型,这(b)防止多个阴影分层,例如{{3方法。
我可以设想一种将栅格转换为矩阵并将山体阴影应用为其他图层亮度的数值乘数的解决方法,但这看起来并不优雅(尽管我可能错了)。我想知道是否有人在这方面有任何想法或(最好)经验?提前谢谢。
答案 0 :(得分:8)
没有经验,但为什么不给灰色底图一个取决于斜率的alpha值?这是我的尝试:
# 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)
正如你所说,非常黑暗。
# 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)
我将灰色alphas设置为抛物线形状,灰度值为.5时最小值,灰度值为0或1时最大值为99.如果你选择这样的东西,你需要修改水平等,但它很容易实现。另外,你需要比我更多的努力投入到alpha中,因为我的是严格的数字而不是十六进制。
[编辑]我在Sacha Epskamp的回答中找到了添加alphas addTrans()
here的漂亮功能。这保留了抛物线,但它的范围从中间的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)