制作Unknown Pleasures效果图的3种方法
之前@Simon_阿文和@有乐老师在介绍@亚赛大人 的神器【脉冲波生成器】时,我曾转发留言说会分享下如何基于高程数据制作这种效果。
还没等我把教程放出来,阿文自己就已经找到了其中一个方法。
虽然这种方法,我之前在知识星球中做过分享。
但一直没有公开分享,主要是因为我在等。
在等下面这篇文章的【在看】数超过100。
周末看时,已经超过100了,所以按照许诺就把之前的教程放出来吧。
3种方法,总有一个适合你
下面会介绍3种方法,前2种方法是基于QGIS来进行操作的,需要对GIS有一定的了解,如果之前没接触过GIS,可以直接跳过去看第3种方法。
方法1、在线底图修改
这种方法,我19年4月15日已经分享到了知识星球中。
操作很简单,只要通过在QGIS中加载底图服务,就可以直接展示出全球任意区域的效果来。
我们放大下效果来看看我们伟大的祖国,西高东低的地形十分明显,高程起伏越小,线条越平缓,起伏越大,线条越陡峭。
当然你还可以对线条显示的样式设置不同的颜色,比如这样。
如果你不想要这么大范围的,只想要某个区域,比如日本境内,应该怎么办呢?
首先需要找到一个日本的面状行政区划数据,将其加载到QGIS中,例如这个样子的。
然后将这个面数据填充为黑色。
接下来将面数据移动地图服务的底部,地图服务在图层样式面板中的【混合模式】参数中选择【变亮】就得到了日本区域的效果。
那么最为关键的是这种服务应该如何加载到QGIS中。
其实操作也非常简单,只需要在xyz节点创建一个新的链接,将下面这个服务地址填进去就可以啦。https://c.tiles.mapbox.com/v3/dnomadb.hgp0dahj/{z}/{x}/{y}.png
使用这种方法可以加载网络上众多好看的精美底图,底图如何查找、如何添加,可以阅读这篇文章《如何在QGIS中添加这些免费的精美底图?》
特别说明
这种方法有一个问题,适合展现较大的区域,如何想展示某个省市,因为范围过小,而这个底图又没有提供精细的数据,放大后就是一片空白。所以如果要制作某个很小的区域,需要使用第二种方法。
方法2、QGIS中DIY
这种方法是基于19年8月19日分享的一篇教程的改进,当时那哥们的方法需要在QGIS和R中进行切换才行,对于代码小白来说,在R中进行运算处理太复杂了。
使用改进后的方法,所有的操作可以直接在QGIS中完成。
介绍的这种方法,你可以使用自己的数据来生成,比如高程数据、人口网格数都可以作为数据基础。操作方法是一样的,下面以DEM高程数据为例进行介绍。
1)将DEM高程数据添加到QGIS中
区域最好不要太大,否则容易在数据处理时,把程序搞崩。当然也主要是因为我的小本本性能太渣。不过建议你初次尝试最好将数据裁剪一下,使用一小块区域就行啦。
裁剪的方法呢,就使用下面这个功能就行啦,不会的可以去GISer学习团公众号搜索相关的QGIS教程。
经过裁剪操作后,我们就得到了这个一个小区域的高程数据。
2)依据DEM范围创建网格
如果你的数据范围较大的话,网格间距就要设置大一点。
如果设置太小,程序就会死给你看。
这里呢,我根据数据的情况,设置了一个300米的网格间距。
生成的网格点是这个样子的,可以看到相当的密了。
3)为网格点赋值
刚生成的这些网格点,只有上下左右的位置信息,咱们需要将高程值赋予对应的点(如果你使用的是人口数据的话,就是将对应的人口数据赋给对应的点)。
如何操作呢?使用QGIS中的Sample raster values功能就行了。
运行完毕后,可以看到在数据的属性表中,新增量一列value值。
4)Y轴平移
这一步是最为关键的,因为这种图的关键就在于根据该点对应的数值,在Y轴上做了偏移。所以使用下面这个转换功能来实现这一步的操作。注意箭头指的位置,根据刚才生成的属性字段来做Y方法的偏移。
处理完成后,可以得到下面的效果图,是不是在这些散乱的点数据中已经隐约地看到的点位的变化趋势了。
5)由点变线
接下来,我们使用点转线功能,将这些点数据连起来。
于是就得到了最终的这个效果。
这样一步一步的处理分析是不是感觉有点麻烦?
这时候,一位QGIS极客玩家出现了,使用代码可以将前面的运算过程全部略过。具体如何操作呢?我给大家简单介绍下,详细说明可以去其博客上看看。
1)把高程数据添加到QGIS中
2)创建一个面状的shp数据
3)在面状数据中设置代码,搞定。
将样式设置为【反转多边形】
将符号图层类型设置为【几何图形生成器】
将几何图形类型设置为【线/线集合】
把作者的代码粘贴进来,将图层名字改成自己的图层名字
with_variable(
'raster_layer',
'dem', -- RASTER LAYER to sample from
-- this collects all the linestrings generated below into one multilinestring
collect_geometries(
-- a loop for each y value of the grid
array_foreach(
-- array_foreach loops over all elements of the series generated below
-- which is a range of numbers from the bottom to the top of y values
-- of the map canvas extent coordinates.
-- the result will be an array of linestrings
generate_series(
y(@map_extent_center)-(@map_extent_height/1), -- bottom y
y(@map_extent_center)+(@map_extent_height/1), -- top y
@map_extent_height/200 -- stepsize -> HOW MANY LINES
),
-- we want to enter another loop so we assign the name 'y' to
-- the current element of the array_foreach loop
with_variable(
'y',
@element,
-- now we are ready to generate the line for this y value
make_line(
-- another loop, this time for the x values. same logic as before
-- the result will be an array of points
array_foreach(
generate_series(
x(@map_extent_center)-(@map_extent_width/2), -- left x
x(@map_extent_center)+(@map_extent_width/2), -- right x
@map_extent_width/50 -- stepsize -> HOW MANY POINTS PER LINE
),
-- and here we create each point of the line
make_point(
@element, -- the current value from the loop over the x value range
@y -- the y value from the outer loop
+ -- will get an additional offset to generate the effect
-- we look for values at _this point_ in the raster, and since
-- the raster might not have any value here, we must use coalesce
-- to use a replacement value in those cases
coalesce( -- coalesce to catch raster null values
raster_value(
@raster_layer,
1, -- band 1, *snore*
-- to look up the raster value we need to look in the right position
-- so we make a sampling point in the same CRS as the raster layer
transform(
make_point(@element, @y),
@map_crs,
layer_property(@raster_layer,'crs')
)
),
0 -- coalesce 0 if raster_value gave null
-- here is where we set the scaling factor for the raster -> y values
-- if things are weird, set it to 0 and try small multiplications or divisions
-- to see what happens.
-- for metric systems you will want to multiply
-- for geographic coordinates you will want to divide
)*10 -- user-defined factor for VERTICAL EXAGGERATION
)
)
)
)
)
)
)
如果觉得线的效果不够明显,可以修改下代码中的最后一个数据,默认是10,可以调整30、40等。
作者的博客地址为
https://hannes.enjoys.it/blog/2019/09/dynamic-elevation-profile-lines-as-qgis-geometry-generator/
方法3、在线神器中随便点
这种是目前我见到的最为简单的方法,直接在浏览器中随便点击,程序就会自动给你生成各种精细的效果出来。
在去年我编制的一本Kepler.gl的可视化小册子,当时封面的主要素材就是使用这个神器生成的。
而且效果可以另存为svg格式,所以各位PPTer们,就可以在PPT中来开脑洞,打卡PPT365啦。
神器地址为:
https://codepen.io/ge1doot/pen/ZPpWaR
如果有朋友访问不了的话,我将这个工具做成了一个离线文件,直接双击就可以本地使用。
下载链接:
https://pan.baidu.com/s/1RoJyV8vzDK79wqcqT5aNEg
提取码:y1w0
好久没有写这么长的教程了,欢迎关注、转发、点【在看】
GISer学习团
扫码关注我们
扩展阅读