查看原文
其他

制作Unknown Pleasures效果图的3种方法

张云金 GISer学习团 2021-09-21

之前@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学习团

 扫码关注我们 



扩展阅读

手把手教你不用任何GIS软件,轻松制作城市地图明信片

用乐高搭建一幅地图吧


: . Video Mini Program Like ,轻点两下取消赞 Wow ,轻点两下取消在看

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存