我一直最喜欢的基于地图的数据可视化创建于1944年。哈罗德·菲斯克(Harold Fisk)与美国陆军工程公司合作,绘制了密西西比河的长度地图。他的视觉形象与其他人不同的是,他通过时间绘制了河流的地图,并设法以一种既美丽又令人惊讶的有效的方式做到了这一点。我想通过创建我自己的系统来程序地生成蜿蜒河流的地图来向他的系列地图致敬。
密西西比河下游冲积河谷(pl。22,嘘。6,细节),哈罗德·菲斯克,1944年。
这个地图生成器系统是用胡迪尼创建的。该系统所需要的只是一条输入指南。这条线变成了河流,河流随着时间的推移而移动和演变,留下了它成长的视觉历史。这张地图是关于一个地方的,尽管是一个虚构的地方,所以需要有河流流经的地形。我生成了一个看似合理的随机地形,并用这条指引线切割出一个山谷,因为山谷控制着河流的流量:平坦平原上的慢河蜿蜒曲折,陡峭地形上的快速河流则不会。
当河流流经地貌时,它不断侵蚀河床上的物质,并将其沉积在下游。这一过程不断重塑河流的流向,造成蜿蜒的弯道。浏览地球的卫星图像,很容易找到河流蜿蜒的例子。下面是几个示例,它们将告诉我们使用自定义代码重新创建地质过程的尝试。
这个系统的基本动态很容易理解:河流吸收物质并将其沉积在下游,河流侵蚀曲线的外岸,在那里水流速度较快,并沉积在水流速度较慢的内岸,河流可以切断弯道,以利于形成一条更直的路径,形成被称为牛弓湖的孤立部分。
要用代码模拟这个过程,我们可以忽略侵蚀和沉积,只考虑平面上的一条曲线。曲线上的每个点都有一个由三个向量表示的坐标框:法线、切线和双切线。由于我们处理的是平面现象(现在忽略高程的变化),我们可以忽略法向量(在我们的例子中,法线只是垂直指向),而只利用切线和双切向量。直线和双切线方向上的切点与切线成直角。
需要注意的一件事是,双切向量不足以使我们的曲线弯曲。派生的双切线通常指向直线的同一侧,而我们需要我们的双切线才能知道这条线是朝哪个方向弯曲的。它应该始终指向曲线的外部,其长度应该与该点的线曲率成比例。
使用切线和修改后的双切线,我们创建了一个混合了两者的新矢量。此新矢量将添加到曲线上每个点的位置。有了这个基本逻辑,河流中的弯道就有机地形成了。可以通过分别调整这两个向量的总体影响来影响折弯的样式,并可以通过增加最终混合向量的比例来调整折弯的强度。
切线(蓝色)和修改的双切线(红色)在左侧重叠,新的混合方向矢量(紫色)在右侧重叠。
如果您正在阅读这篇文章,那是因为您的浏览器不支持HTML5视频元素。
当河流弯回自身时,曲折就会被切断,取而代之的是一条更短的路径。这一过程形成了牛弓湖,这些湖通常是位于主要河流两侧的新月形水体。为了在我们的河流中发现潜在的牛弓,我们会做距离检查,看看这条河是否有重叠的危险。如果发现接近碰撞,则会隔离两个碰撞点之间的曲线部分,并将其转换为自己的曲线段。这些新生成的湖泊表现出的唯一行为是,它们会随着时间的推移变得越来越小,直到它们从系统中被删除。(目前的系统不允许河流与牛弓湖重新相交,因此增加了一个额外的步骤,以确保湖泊删除自身有可能与河流重叠的部分。)。
背景网格化绘图是通过在主河样条线上散布一些点和在背景平面上散布一些附加点来创建的。Voronoi断裂用于将背景平面转换为具有不规则边缘的较小多边形。然后,每个多边形被分解成不均匀的栅格。这些新多边形中的每一个都被迭代细分循环进一步拆分,该循环创建伪随机大小的曲线图。最后,从河流几何图形创建的有机形状用于沿海岸创建边界地块。计算最终多边形集的中心点,该中心点成为Plot ID Number文本图层的位置。
公路网并不是从公路网开始的。最初的算法是试图创造一种有机的增长模式。系统从一些随机放置的点开始。每个点都有一个方向生长矢量。该点沿此增长矢量移动,并在移动时绘制一条线。如果该点遇到另一条线,它将停止。随着点的移动,方向矢量会缓慢旋转。我发现如果我把弯曲的向量和非弯曲的向量混合起来,结果就像相交的道路。我通过使线条的粗细与其长度成正比来强调这一结果。
我创建的第一张地图图像缺乏地方感。没有任何一个地方的名字,这似乎是一个错失了做一些引人注目的事情的机会。我考虑过随机生成的无意义字符串或手动命名地点,但这两种选择似乎都不是一个很好的可伸缩解决方案。
我和安德鲁·贝尔讨论了这个问题,他发现了一个美国地质勘探局的地理地名数据库(GNIS数据)。然后,他编写了一个python脚本来解析内容并去掉后缀(比如";Lake";或";Summit&34;),以生成用于我的特写的适当名称列表。我不想用已经存在的地方来命名地物,所以剪掉后缀有助于降低重现哈德逊河的可能性。取而代之的是,随机添加了新的后缀,以产生像哈德逊峰会(Hudson Summit)或哈德逊沼泽(Hudson Swamp)这样的特色名称。此外,他删除了重复的条目以及过长的名称(小西叉西支羽河出现在其中一张生成的地图上)。
被隔离命名的地物包括主要河流、湖泊、岛屿、山峰、盆地和沼泽地。河流、湖泊和岛屿足够容易,因为这些特征是从河流系统本身的创造中出现的。通过对地形坡度的分析,将山峰和盆地分离出来。发现了平坦的部分,如果这些单位接近水位,就被认为是一个盆地。如果公寓位于高海拔,就被指定为山峰。沼泽地稍微更具挑战性。低坡度的区域被隔离并转变为轴对齐的边界框,其中心成为标签的位置。这个项目的未来迭代将找到以更像地图的方式布置文本的方法,文本沿着像山脊和细小的湖泊这样的特征流动。
我想实现一些功能,这需要修改曲折的逻辑本身。目前的系统并不像我希望的那样健壮。我正在考虑从基于样条线的方法转向基于粒子的方法,这可能会使分支河成为可能,也可能使自然湖泊的形成成为可能。这种基于粒子的方法还可以使河流三角洲成为可能,并允许河流与现有的牛弯重新相交。
我还想致力于使道路系统成为一种迭代的方法。第一个通道将铺设主要的高速公路,第二个通道将在第一个通道外建造次要道路,等等。我还需要研究道路应该如何避免沿着陡峭的斜坡生长的逻辑。