gdal
和convert
可以获得优雅的透明山体阴影。与通常使用的基于灰色的山体阴影相比,此类透明的山体阴影非常酷,因为它们可以放置在地图背景与其他上层(道路,建筑物)之间,以提供3D感觉,无论背景的类型和颜色如何。 它的工作原理
诀窍:从
gdal hillshade
产生的灰度山体阴影开始,诀窍是获取灰度通道的值,反转每个值,并将结果传送到新的不透明度通道。黑色像素[0,0,0]变为[0,0,0,255](不透明度= 255),灰色像素[120,120,120]降低至[120,120,120,135](不透明度= 135,又称为255-120),白色像素[255,255,255]变为透明[255,255,255,0](不透明度= 0,又称为255-255),依此类推。丘陵的阴影是不透明的,并且黑色,平原逐渐变成(白色)透明。从概念上讲,像素的波段方程是这样的:)。
问题
以ETOPO或SRTM衍生的基于灰色的山体阴影(
gdaldem hillshade crop_xl.tmp.tif shadedrelief.tmp.tif -s 111120 -z 5 -az 315 -alt 60 -compute_edges
,可在此处下载文件)作为输入... > ...如何在此类.tif文件上通过gdal或其他非GIS破坏性方式来完成上面引用的技巧?请注意,我希望保留GIS属性(地理定位)。
#1 楼
果壳应阅读下面的每组3张图像,例如“灰色(带)+不透明(带)=透明结果”。您可以在几分钟内通过关联的github托管的makefile测试这些过程。我建议使用进程#3,其阈值应介于170(保留强阴影)和220(保留所有阴影)之间。程序3提供最强的阴影并避免变白的效果。根据需要调整结果层的整体不透明度。也可以使用
--calc="<equation>"
来根据需要改进gdal_calc
中的方程。 /> 背景
gdaldem hillshade
产生一个像素范围为[1-255]的单波段灰度文件,从最暗的阴影到最开明的像素。对于平坦区域,px = 221(#DDDDDD)。 NoDataValue
像素会获得默认的nodatavalue 0
,并且输入和输出中最暗的黑色应该是1
。未定义不透明度带时,不透明度为100%。 /> 目标
我们想要一个灰度带
-b 1
,它是阴暗的阴影。在gdal之外,它是一个具有连续范围的灰色带,例如px = [1-255]。我们可以裁剪不相关的区域(#2),或将其变黑为px = 1并依靠不透明带(#3)。我们想要一个不透明带
-b 2
,通常是山体阴影或相关功能。我们可以裁剪出不相关的区域(#2)。它必须是连续的混浊度范围,例如px = [1-255],否则就没有雅致之处。 ..并检查布尔值,例如gdal_calc
,该值返回1(true)或0(false)。这允许条件演算。如果条件为假,则方程式的相关部分无效。1.使灰色山体阴影变得透明
以下提供了很好的两波段结果,标准的
A<220
灰色和白色区域变得越来越透明:br />
2。当添加不透明度
gdal hillshade
时,通过伪裁剪(-b 1和-b 2)优化<43灰度像素上的2/3 -b 1
(灰度)变得肉眼看不见,但是这些像素保持不变各种白色-b 2
和低不透明度-b 1
值。它们可以制成全白色透明-b 2
像素,从而具有更好的压缩率:gdaldem hillshade input.tif hillshade.tmp.tif -s 111120 -z 5 -az 315 -alt 60 -compute_edges
3。进一步-b 1优化(裁剪+变黑)
由于我们有一个渐进的不透明度带
[255,1]
可以依靠,我们可以通过-b 2
使-b 1
像素为白色px = 255,或者通过255*(A>220)
使黑色px = 1 。# hillshade px=A, opacity is its invert: px=255-A
gdal_calc.py -A ./hillshade.tmp.tif --outfile=./opacity.tif --calc="255-A"
# assigns to relevant bands -b 1 and -b 2
gdalbuildvrt -separate ./final.vrt ./hillshade.tmp.tif ./opacity.tif
此结果显示更强的阴影。
结果
创建透明的山体阴影可以立即消除平原上以前的灰色区域以及相关的不希望但普遍存在的褪色效果。期望的副产品是对最终视觉产品的增强控制。所描述的过程将去除大多数灰色像素和所有白色像素。当彩色背景纯图像被透明至黑色的山影覆盖时,将保留其选择的颜色,只有阴影区域会变暗。比较下面的过程2(左)和过程3(右)。
概述:之前和之后):
进一步的优化
白色区域:不妨保留最开明的区域以增加3D感觉。从字面上看,这将是此当前方法的对称性,但阈值变化较小,然后通过gdal_calc将两个输出合并。平原将是100%透明的,最暗的阴影和最亮的启发区域是不透明的。 />
复合山体阴影(如何创建复合山体阴影?)。
颠簸的山体阴影也很有趣(描述)
注意事项
1*(A>220)
输出中的平坦区域阈值为px = 221(#DDDDDD = [221,221,221]),标记为平坦区域。同样,山影的px = 221将图像在阴影内斜率(A <221)和光照下斜率(A> 221)像素之间进行划分。在px = [170-220]时的处理阈值被证明是好的,它保留了接近100%的眼睛可察觉的阴影,这些阴影本身仅占救济区域的15-35%。 3是未压缩的〜1.3MB,然后压缩后的〜0.3-0.16MB,节省80%! 310kb,变黑(#3)达到160kb。对文件大小的裁切效果减少了5%至50%,阈值位于px = 220和我的输入。
评论
鼓励+1欢迎。
–Hugolpz
15年5月2日在20:24
尽管您确实必须回答自己,但该主题是一本很好的教程,涉及许多有关山体阴影的问题。做得好!
– Kersten
2015年5月6日,12:11
您的教程就可以了。做得好。您能否考虑在这里回答我的问题=>?是否可以为这种带有alpha波段的灰度GeoTIFF创建.ovr?
–沙棘
18年8月25日在16:56
您好,@ sandthorn,尽管我很爱我,但我已经不在这个领域了。对于我来说,找到答案的成本可能会比您2018年高。希望我的观点为您的问题指明正确的方向!
–Hugolpz
18年8月28日在13:12
如何在浏览器中创建hilshade observablehq.com/@sahilchinoy/hillshader
–Hugolpz
19年2月28日在19:58
#2 楼
获得更适合与其他图层组合的非灰色画布的相同结果的另一种方法是gdaldem中的“组合”选项。操作。坡度为0的区域为白色。 90度坡度的区域为黑色,作为坡度阴影,山阴影层增加了一些照明。标准/组合山体阴影
组合阴影与OSM基础层相乘(不透明度约50%)
评论
有没有办法将OSM层与带有gdal的hillshad层结合起来?
–史蒂文·卢兹(Steven Lutz)
20-8-29在2:42
#3 楼
基于gdal
+ convert
的工作流程有一个
gdal
+ convert
解决方案可提供良好的视觉效果。该解决方案的问题在于convert
破坏了您必须还原的地理信息。它增加了要运行的动作的数量。# Basic crop
gdal_translate -projwin 67 35.92 99 5 ../data/noaa/ETOPO1_Ice_g_geotiff.tif crop_xl.tmp.tif
# Grey-based hillshade
gdaldem hillshade crop_xl.tmp.tif shadedrelief.tmp.tif -s 111120 -z 5 -az 315 -alt 60 -compute_edges
# create a transparent hillshade:
convert shadedrelief.tmp.tif -fuzz 7% -fill "#FFFFFF" -opaque "#DDDDDD" whited.jpg # makes all grey values white to lighten the filesize
convert whited.jpg -alpha copy -channel alpha -negate +channel trans.png # <=== TRICK HERE.
# Restore georeferencing & reproject
gdal_translate -a_ullr 67 35.92 99 5 trans.png trans.tmp.gis.tif
gdalwarp -s_srs EPSG:4326 -t_srs ESPG:3857 ./trans.tmp.gis.tif ./trans_reproj.tmp.gis.tif
# Compress from 11MB to 2MB:
gdal_translate -co COMPRESS=LZW -co ALPHA=YES ./trans_reproj.tmp.gis.tif ./trans.gis.tif
有关命令4的说明,请参见:https://stackoverflow.com/a/23018544/1974961
评论
根据参考数据在tiff中的存储方式,就像重命名与tiff相关的world文件一样容易。@Steve:适用于从栅格(例如SRTM或ETOPO)生成的.tif文件(在gdaldem hillshade etopo_crop.tif shadedrelief.tmp.tif -s 111120 -z 5 -az 315 -alt 60 -compute_edges
之后)
我认为gdal_tranlate与-b band,-mask band,-expand gray | rgb | rgba以及公式opacity =-(px_grey_value)+255结合使用可能是可行的方法,但我从未接触过band还是很笨。
添加了基于灰色的山体阴影下载
您是否尝试过gdal_edit.py重写坐标,像元大小和参考系?