1. XenForo 1.5.14 中文版——支持中文搜索!现已发布!查看详情
  2. Xenforo 爱好者讨论群:215909318 XenForo专区

简单粗暴、步步为营,这样的地图才能让你一眼找到想要的

Discussion in '知乎日报' started by 漂亮的石头, 2015-12-13.

  1. 漂亮的石头

    漂亮的石头 版主 Staff Member

    Joined:
    2012-02-10
    Messages:
    487,766
    Likes Received:
    47
    地图的细节是怎样被简化掉的?

    [​IMG] Shan Ye,守望之夏-既能挖化石也能挖数据

    首先回答“除了美观还有什么作用”。

    地图既是一种工具也是一种艺术。地图轮廓以及填充、标注的简化(cartographic generalization,感谢 任畅同学的纠正,官方中文翻译叫制图综合)的主要目的,其实已经被题主说到了:准确、简洁、美观。其实还有一个目的,那就是通过减少细节来突出重点

    当画幅(比例尺)变化的时候,很多的细节不可能都一一地表现在图上。例如下图(来自加拿大的拉瓦尔大学):

    [​IMG]

    比例尺是 1 : 1000 的时候,地图上可以保留很多细节,比如所有的路径,以及各个建筑的轮廓。但是到了 1 : 27176 的时候,如果再保留所有路径或建筑的轮廓,那就一团乱麻,什么也看不清了。

    有时候,少也是多(Less is more)。只有削去了不重要的枝枝叶叶,主干的信息才能更好地被突出展现出来,地图才能达到它应有的效果。

    而且,比例尺并不是地图简化的唯一原因。每一幅地图都有自己的目的。目的不一样,对于各种细节的要求也就不一样。比如网上这张反映一带一路的地图:

    [​IMG]

    经常看地图册的人一眼就能看出很多“错误”,比如北京的位置貌似偏了些,琼州海峡没了,马尔代夫和琉球也没了,日本那几个岛也连在一起了,等等。但是,这张图的目的是展现一带一路,并不是为了告诉人们马尔代夫在哪里,北京在哪里。弱化了一些细枝末节的东西,则更能强调出一带一路的这个主题。试想一下,如果这张地图把陆地轮廓画得特别详细,还加上中国的省界,甚至长江黄河,那它的主题会不会反而被冲淡了?

    接下来就具体回答题主最主要的一个问题:地图的细节是怎样被简化掉的?

    从种类上说,地图的简化(map generalization)可以分为:

    • 轮廓简化(Simplified)。就是通过去掉一些比较次要的转折,把复杂的轮廓变得平滑一些。比如题主在描述里说的,中国东南沿海的地图,在比例尺不够的情况下可以把很多曲折的海岸线进行模糊化处理。
    • 融合(Fused)。把靠得很近且性质相同、相关性大的几个地理事物合并为一个。比如在小比例尺地图上,美国洛杉矶附近的一些城市的建成区,例如长滩、帕萨迪纳、马里布等,都合并到了洛杉矶。再比如上面那张一带一路的地图,日本还有菲律宾的几个岛被合并了,也是个例子。
    • 筛选(Omitted)。把不重要的东西扔掉,保留重要的。比如地图上原本有北京、天津、石家庄和廊坊,但实在画不下的时候,就选择性地把廊坊扔了。
    • 错位(Displaced)。在对地理精度不那么高的地图上(一般是示意图),如果某一个区域的信息太过密集而周围区域空白较多,可以适当(注意是适当)地让地理位置错位。或者为了地图的整体效果,小幅度的位移也是允许的。比如上面一带一路地图中的北京。

    [​IMG]

    题主在题目补充里谈的是海岸线的简化,也就是地图的线性轮廓(海岸线、国界线、河流、等高线……)的简化,即上面谈到的方式里的 Simplified。

    绘制轮廓一般用的是矢量数据。所以,这里讨论的地图轮廓简化方法,实际上也是矢量数据的压缩方法。

    介绍具体方法以前,先要说一下总体的前提条件。不管多复杂的曲线,我们也认为它是由一个个的线段组成的,而线段的两端都是一个个的数据点。越“圆滑”的轮廓,数据点就越多。

    常见的简化方法有这几种:

    1. 简单粗暴 - 隔点法

    隔点法就是在矢量曲线的一系列点中,每隔 n 个点选取一个来保留,其余没选中的点都删除。比如说下面这张图的曲线:

    [​IMG]

    现在我每隔 2 个点选择一个留下,剩下的点删除,就把这条曲线简化成了紫色的这种样子:

    [​IMG]

    如果我每隔 3 个点选择一个留下,则简化后的曲线是这个样子的:

    [​IMG]

    这种做法的优点是算法简单,操作简单,但是缺点是比较重要、有特色的点很可能会被漏掉。在原本的曲线就不那么平滑的情况下,这么做很可能造成比较大的形变。比如地图上的半岛或者海湾,在 n 选择不当的时候,很可能就直接被切掉了。

    2. 步步为营 - 垂距法

    这种垂距法是一种比较常用的办法。它是按照某个指定的方向,一步一步地简化曲线。比如下面这张图:

    [​IMG]

    首先我们要指定一个参数长度,比如图中的红色线段。

    然后,我决定从左到右地简化这条曲线,因此我首先要选择 1、2、3 这三个点。

    连接 1 和 3,然后通过 2 作垂线和 1、3 的连线相交。测量垂 2 的长度。图中,垂 2 的长度大于参数,因此要保留点 2.

    然后挪位到 2、3、4 这三个点,连接 2 和 4,再画出垂 3。比较垂 3 和参数。这里的垂 3 还是大于参数,因此点 3 也保留。

    然后挪位到 3、4、5 这三个点。连接 3 和 5,再作垂 4.这里,垂 4 的长度是小于参数的,因此点 4 就要被删除掉。

    然后继续向右,挪位到 3、5、6(4 被删除了)等等一直进行下去。

    3. 宏观调控 - 分裂法

    这种方法还有一种高大上的名字叫做道格拉斯·皮尤克算法,也是一种用得比较多的方法。它和垂距法有相似之处,都是需要设定一个参量来进行比较。但是它们也有很大的不同。比如,垂距法是从左到右(或者从右打左)一步一步地进行曲线简化。而道格拉斯·皮尤克算法则是把整个曲线看做一个整体,来进行“宏观调控”。它的具体操作如下。

    比如,现在有这么条曲线:

    [​IMG]

    用这种方法,我们就要从整体入手:

    [​IMG]

    首先要做的就是选参数“红色线段”。然后连接整条曲线的首位两点。连接之后,找出离这条连线距离最远的那个点,比较这个点到连线的距离和所选参数的大小。图中现在的最远点是明显大于参数的,因此这个点被保留。

    然后进行下一步:

    [​IMG]

    连接起始点和保留点,以及终点和保留点。再分别找出两条连线区间范围内的最远点,并将它们的距离和参数比较。这里,最远点 1 的距离是小于参数的,因此在这个区间内的所有点都要被删除掉。而最远点 2 的距离刚好大于参数,因此最远点 2 也成为了被选取的保留点。

    接下来:

    [​IMG]

    连接上一个保留点和新的保留点,以及新的保留点和终点,同样的道理,分别找出两个区间内的最远点以及距离。这里的最远点 1 的距离小于参数,因此这一区间的所有点都删除。最远点 2 的距离大于参数,则成为新的选取点被保留。

    同理继续进行筛选:

    [​IMG]

    最远点 1 所在区间的点被删除,最远点 2 成为新的选取点被保留。

    再来一次:

    [​IMG]

    这次最远点 1 保留,最远点 2 所在区间的点删除。

    再来一次:

    [​IMG]

    同样的作法。

    最后,这条蓝色的曲线就是通过道格拉斯·皮尤克算法简化后的曲线:

    [​IMG]

    不论是垂距法还是道格拉斯·皮尤克算法,重要的一点都是要选择一个合适的参数。参数越大,地图被简化的程度就越大。

    查看知乎原文
     
Loading...