交通运输地理空间分析 - 第 4 节课:MapInfo 基础操作
这份文件是我上课的笔记。
严格来讲,因为笔记里面有一半是老师的课件里面的内容,我只是加上了自己的理解和解释在里面,所以这份笔记的内容创作有一半是我老师完成的。
在这里分享出来,希望能够帮助到一些人。
往期交通地理空间分析笔记回顾:
文章目录 线对象的绘制 开启嗅探 / 吸附工具 线对象的属性表
上一次的课上我们讲了一些 的基本操作和基本的使用方法,主要是围绕图层的增删和点对象的创建,以及点对象属性表的管理。这一节课我们继续介绍 的基础使用方法。
首先,关于地图上的点对象,上一课我们有一个知识点没有讲,就是点对象图层的组合和分离。我们这里补充一下:
点对象的组合与分割 组合点对象
首先,我们使用工具栏里的框选工具,框选我们需要保存的点:
接下来,我们右键被选中的点,打开右键菜单。选择编辑对象 edit 这个选项。
但是我们可以看见,我们这个菜单的位置是灰色的。
这是因为我们的图层当前设置为不可编辑的模式。
我们如果想要编辑这些对象,则需要点击图层栏里面对应的 City 图层右侧的铅笔和纸张的形状的按钮。
我们现在再次打开刚才的 Edit 菜单。这个时候菜单就不再是灰色了,可以点击选择 :
这个时候弹出了下面的菜单:
可以看见,软件此时在向你询问对于这两个点的各个属性值的处理方法。
我们合并了两个点之后,产生的新的组合对象也就相当于是只有一个对象,这一个对象的各个属性也只有一个对应的属性值。换句话说就是,这个新产生的对象的属性值可以由原来被合并的若干个对象的属性值来获得。
打个比方说,这里显示的 ID 为 Sum 的意思就是在说新产生的组合对象的 ID 值将会是我们之前选择的 上海 和 江苏 两个点的加和。
为了合理性,我们这里选择 ID 为 Value,再 Value 选项右侧的小框框里面设置为 5,然后选择 name 为 上海和苏州。剩余两项均保留原来的设定,为 Sum
选择 OK 之后就可以看见,数据点已经被合并了。这个时候如果我们在地图上选中这两个点中的任意一个,都能发现两个点被同时选中了。
我们这个时候查看一下数据的属性表:
可以看见这个时候属性表已经被合并好了。但是与此同时,我们也看见属性表中产生了两道灰色的线条。这是因为在 里,组合点的操作是先生成这两个点的组合体,然后删除这两个点。在这个过程中,数据库会产生冗余(上一次的笔记里面有写到过)。
要解决这种情况,可以 对属性表进行压缩。具体的操作在上一次的上课笔记里面已经有所提及,这里不多赘述了。
同时,这里的 ID 也因为合并对象而被打乱了,我们可以 通过更新列的方式来恢复其顺序。
操作后的属性表如下图所示:
分割点对象
在 中分割点对象的方法也十分简单,就是直接右键组合的点,选择 Edit 菜单中的 :
可以看到弹出了下面的菜单。这里我们暂时先不管这个菜单是什么意思,直接点击下一步:
然后就会看见下面的菜单:
这个菜单可以允许你对分割产生的对象的属性值作进一步的详细设置。我们也暂时先不管,点击 OK。
打开属性表:
我们可以看到,在这个时候,属性表里的元素 “上海和江苏” 已经被分割为了两个元素,但是这两个元素的各项属性值都是相等的。这是因为我们刚才在分割的时候没有单独设置如何分割两个对象的属性值。
与此同时,我们也可以看到,数据表里又一次产生了一条灰线,而且对象的 ID 序号也被打乱了。这是因为在 软件里面,分割对象的逻辑和我们刚才组合对象是一样的:首先创建分割的一个对象产生的对应的两个对象,然后再删除原来的对象。删除原来的对象的过程会产生数据冗余。在这种情况下,我们需要像之前那样,再次执行一遍压缩属性表,然后再次执行一遍更新列 ID 的操作。
线对象的绘制
有一些地理事物可以用一个点来描述,比方说在大尺度下看一个城市的位置或者城市中某些设施、站点的位置,但是还有一些地理事物比较适合用线来描述,比方说河流、山脊、公铁路线路、船舶和飞行器的航线等等,因此,在地理信息系统中,有一种线对象。
线对象是地理信息系统(GIS)中非常常用的维度为 1 的空间组分,表示对象和它们边界的空间属性。这些对象由一系列坐标表示,并具有以下特征:
实体长度:线对象从起点到终点的总长。弯曲度:用于表示线对象像道路拐弯时的弯曲程度。方向性:对于水流,方向是从上游到下游;对于公路,则有单向与双向之分。
通常情况下,线状实体包括线段、边界、链、弧段、网络等。
删除点图层
为了能够更好的介绍线对象,我们要创建一个新的线图层。这个时候我们来删除原来的点图层。
然而,从软件特性的角度上来讲,其实我们并不需要这么做。 软件和其他的地理信息系统软件不一样——如果你使用过其他的地理信息系统软件,就会知道——对于常见的一般的地理信息系统软件而言,点图层和线图层不能存在于同一个图层内。但是 软件是允许这样做的,在 里,你可以把点、线、面混置于同一个图层当中。
然而,这种做法会导致很多的问题,包括但不限于:
等等。
因此,在实际的操作过程中,我们要尽量避免这种情况的发生。
在 中删除图层,需要在选中图层之后点击图层管理器上方的红色叉叉。
点击之后,就能看见图层已经被我们删除了。
当然,这个按钮的作用相当于在软件中移除了这个图层。在我们删除了图层之后,我们的图层文件仍然还在我们的文件夹里面;只有彻底删除了图层文件,图层才相当于真正消失。
创建线图层
创建线图层的过程和创建任何普通的图层都是相同的——我们点击左上角的 File,选择 New Table,取消勾选 Open New ,勾选 Add to (跟上次的笔记里面创建点图层的过程完全一样的。如果不确定怎么操作,可以翻看我上次的笔记)
这里需要创建字段。为了演示我这里就创建 ID 和 这两个字段:
字段名称字段数据类型字段含义
ID
线对象的编号
Float
线对象的长度
随后,我们把新的图层保存为 Lines.TAB,放到跟之前的图层相同的目录下面。
创建线对象
中创建对象工具栏中各个按钮功能如下:
首先,我们先选择工具栏中的创建直线对象的按钮。
打个比方说,假设现在有一班航班从上海飞往大连,我们可以简单的用一根直线将两个城市连起来,表示这里有一班航班。
(注意,这只是一个示例图,用来讲解如何在 中创建线对象,不代表这条线是航线的真实形状。在现实生活中,航线在地图上投影的形状应当是一条弧形。这是因为在现实生活中,飞机通常按照大圆航线飞行,即在球体表面上最短距离的路径。由于地球是一个近似于椭球体的三维空间,而地图是将三维空间投影到二维平面上,所以在地图上展示时,大圆航线会呈现为弧形。)
注意:在绘制直线对象的时候,首先点击我们的起始点。接下来,鼠标需要一直按着,不要松开,直到我们把鼠标移动到终点上。 这个导航操作和一般的地理信息系统软件不太一样:大部分的地理信息系统软件在绘制直线的时候都是需要点击两次,而不是一直按着鼠标拖动。
我们创建的第一条直线有点模糊不清,我们可以调节一下线的样式,以便我们能更好的看清楚我们的线。
在上一次介绍点图层的时候,我们说过可以通过图层左侧的图例按钮来调整这个图层中对象的样式。但是其实 这个软件的一个神奇之处就在于,它允许你根据自己的喜好自由调整图层中任何一个对象的样式。只需要选中对象,在顶部的标签栏中找到 ,选择 Line Style,就可以为你选中的这条线单独设置一个样式。
我们这里设置线条样式为三个像素宽度的红色线条。如下图:
现在看清楚了。
开启嗅探 / 吸附工具
一般 GIS 软件都会有一个吸附工具, 也不例外。在 中,这个操作叫做开启嗅探,按下键盘上的 S 键即可开启嗅探,再按一下就是关闭。
在 12 中,嗅探工具(即吸附工具)可以帮助用户将新绘制的地理要素与现有要素精确对齐。它通过自动检测和捕捉现有要素上的节点、线段或顶点来实现。当用户使用嗅探工具时,它会自动将新绘制的要素“吸附”到最近的现有要素上,确保它们之间没有间隙或重叠。
具体来讲,我们看我们现在画的这张地图:假设我们现在要开设一条新的航线,从广州飞往上海,那么这个新绘制的线条就应该连接广州和上海两座城市的点。可是如果我们只是徒手去绘制,那么 “上海” 这一端的点与之前绘制的上海到大连的线的 “上海” 端点不可能完全重合。这是因为矢量地图是可以无限放大的,无论你人手画得多么精确,永远都会存在误差。可能这两条线并没有接上,也有可能两条线重叠了,产生了不必要的线头。
为了避免这种情况,我们可以按 S 开启嗅探。开启之后,等我们的鼠标移到 “上海” 这个线端点附近的时候,光标就会自动移动到端点上面,与之对齐。而我们画出来的线条也会自动与之相连接。
如下图所示,开启嗅探之后,当我们的鼠标移动到 “上海” 节点上方的时候,这里就会自动产生一个十字准星,表示已经对准的这个节点。这个时候我们的鼠标直接点下去,然后拖动线条,连接到 “广州” 所在的位置就能完成绘制了。
折线对象
假如现在有一条航线,从大同市出发,经过合肥转机之后飞往大连。我们想要在地图上把这条线表示出来,就需要绘制一条折线。
我们可以选择工具栏中的折线工具。该工具的使用和直线工具略有不同:不需要按住鼠标拖动,而是 多次点击,依次点击,折线所途经的点,最后在终点节点处鼠标双击表示结束。
我们这里依次
即可完成航线的绘制。
重塑线对象
假如现在我们刚才设定的从大同到合肥转机飞往大连的航线发生了更改,改为由大同出发,途经山东济南转飞大连。这个时候我们就需要对线对象进行重塑。
如果我们直接选择这个线对象,然后直接拖动节点,就会发现整个线对象一起被拖动了。显然,这种更改不符合我们的意愿。
在这种情况下,我们可以 在工具栏中找到重塑工具(如之前的工具栏图所示),选中我们需要重塑的对象之后,点击即可开启重塑模式。在重塑模式下,对象的每一个节点都是可以单独拖动、改变位置的。
增加节点
现在再举个例子:假如我们原本这条从上海直飞大连的航线,要改为由上海到日照转机,再飞往大连。这个时候我们的线条只有两个节点,现在要在这个线条上增加一个新的节点 “日照”。在这种情况下,我们就要用到新增节点工具。
使用新增节点工具应当首先 选中需要增加节点的对象,然后确保已经开启了重塑模式(否则按钮是灰色的点不下去)。
接下来,点击新增节点工具,然后 点中需要新增节点的对象上需要新增节点的线段,按住鼠标不要松开,直接拖动到你想要放置新节点的位置上去。在图中就是点击 “上海” 到 “大连” 的这一线段,然后拖动到 “日照” 的点上面来。
这样就完成了。
移动共同节点
假设现在产生了新的问题:分别从上海和大同出发的这两条航线的终点不是大连,而是要改成韩国首尔。
在这种情况下,我们就需要移动“大连” 这个节点改为 “首尔”。可是问题在于:这个节点是两个线对象的共同节点。如果我们直接选择重塑对象,并且拖动节点,就会出现下面的情况:
可以看到,在这种情况下,我们只挪动了一侧的节点,而从上海出发途经日照的这条航线的节点却没有跟着移动过去。
遇到这种情况,我们有两种选择:
再次点击从上海出发的航线到大连的节点,挪到韩国首尔去在 设置当中调整挪动共同节点时的配置选项,调整为同时挪动共同节点
我们可以想到,当 N 多条线汇聚于同一个点的时候,后一种方法虽然不够灵活,却很省事,否则我们将被迫移动若干次节点。
如果想要设置共同节点的挪动方式,首先需要打开设置菜单(或者叫首选项菜单),点击 ,选择 :
点击之后会弹出如下菜单,这个就是 软件的设置了。
我们点击 Map ...,打开地图窗口的设置菜单:
在弹出的菜单中找到 选项卡,把 Move Nodes in 选项由原来的 None of the 改为 the Same Layer
点击 OK 回到设置菜单,再次点击 OK 保存。
现在再次拖动节点,就会看见两个对象的公共节点同时被移动了。
组合线对象
现在考虑另一种情形:现在航空公司发生并购,另一家航空公司提供了从上海到北京的航线。我们现在要把两条航线合并,改为由广州出发,至上海转机后飞往北京。(如下图所示,为了区分我使用不同颜色标记的两条航线)
在这种情况下,我们就需要 合并两个线对象为同一个对象。合并的操作跟之前,合并点的操作是完全一样的:选中两个线对象,打开右键菜单、点击 ... 合并就好了。
由于这两根线的形状,想要同时选中两根线不是很容易,不管怎么框选都没有办法把这两根线同时框选进去而又不带入其他线条。实际上,在 软件里面,只要按住 shift 就可以连续选中对象。
这个时候再次弹出了让我们处理每一个属性值的菜单,但是因为我们还没有设置线对象的属性值,这里只做图形操作演示,所以这个菜单可以无所谓。点击 OK
然后就可以看到对象已经被合并了,变成了同样的颜色。使用选中工具,双击对象打开查看详细信息,可以看到对象有两组
分离线对象
那么这个时候,假如我们要把刚刚合并起来的线对象拆开,应该怎么做呢?
关于这个地方,我就不得不吐槽一下了,我们老师上课教学的时候把这个操作讲得无比复杂。 按照老师的意思,在 中,从一个节点分割一个线对象为两个线对象需要经过这几步:
围绕要分割的节点画一个非常小刚好能够覆盖节点的面对象选择需要分割的对象为目标右键选中面对象打开菜单Erase 操作,删除面内所覆盖的一切其他对象把剪切开来的两段线头重新合并在一起删除创建的小面
我们暂且先不管上面这一大堆操作是什么意思,我们来看一下正常情况下的简便操作方法。实际上,在 7.8 版本之后,就已经添加了 split at node 的功能,允许我们直接在一个点上分割两个对象。老师所讲的这种方法是过时的。
更加简单的操作如下:
用选中工具选中需要分割的对象确保打开了重塑对象 选项点击要断开的节点选中右键要断开的节点,选择 Edit ,点击 split at node
就完成了。
具体演示如下:
首先,用选中工具点击选中对象,确保已经打开了重塑模式:
点击选中需要断开的点,通常在实际点击这个点的时候用于框选点的灰色方框会稍微变大一点点,让我们可以看清我们已经选中了这个点:
右键这个点打开菜单,在 Edit 里找到 split at node
可以看见分割对象的菜单已经弹出来了:
点击 OK,大功告成。
现在完全可以给对象设置成不同的颜色,这完全就已经是两个对象了。
当然了,为了严谨,我同样会 把老师教的方法演示一遍。我这里用从山东出发、途经济南到首尔的这条航线来演示一下:
我们首先过点画小面,我们在创建对象选项卡中找到创建面(多边形)对象的选项,然后围绕 “济南” 这个点画一条非常个的面(多边形),刚好包裹住 “济南” 这个节点。
在 中,绘制面(多边形)的时候,点击地图上的起始点,沿着所需的轮廓线,在地图上点击鼠标左键以确定多边形的顶点位置。如果需要转弯或改变方向,可以在需要的位置多次点击鼠标左键。
这个非常小的多边形画成什么形状无所谓,只要能够覆盖节点而不覆盖其他有用的东西就行。我这里为了省事就画成了最简单的三角形。
接下来我们设置需要分割的对象为目标。首先选中,我们需要分割的对象,打开右键菜单,在 Edit 中找到 Set 。点击之后就会看到我们选中的线多了一些红色的毛刺状标识符,代表这条线已经被我们设为目标了。
最后再用选中工具选中我们刚才画的面,在 Edit 中找到 Erase。注意是 Erase 不是 Erase ,否则擦出的就是 “除了面内的节点之外的一切”。
然后删除我们绘制的面对象,就会看到我们的线在面所在的位置被挖去了一块,刚好在节点处断开。
最后再编辑两个对象,把断开的节点重新再济南接上,就变成了相连的两个对象了。
哎……()
线对象的属性表
和点对象一样,线对象也有其对应的属性表。我们可以右键图层打开其属性表来查看一下(我这里为了一会儿能好看一点,多画几根线。)
首先,这个图层的属性表刚才被我们一通胡乱折腾,现在已经非常混乱了。属性表里目前还没有填入任何东西,但是已经积累了一大攒的冗余数据。
我们首先执行一遍压缩属性表的操作,然后通过 rowID 函数更新列的方式,给每个属性添加 ID 序号。
这部分内容的操作和以前是完全一样的,我这里就不多演示了。
接下来我们说对于地理上的线对象,我们首先关心的就是这个线的长度,因为这个线的长度直接表示了两个点之间的地理直线距离。
我们学习 软件的目的,实际上就是希望这个软件能为我们所用,帮助我们分析地理空间信息,然后转化为我们想要的复杂网络,通过一些复杂网络的规划求解方法去找到我们想要的结果,比如某种特定的优化方案或者网络最短路之类的。
那么我们的软件实际上已经提供给我们批量获取这些线的长度的方法了。我们知道地理信息系统的本质实际上是一个数据库,这里可以用到一个 MySQL 语句:
ObjectLen(obj, "km")
这个语句的使用方法和之前更新列的时候使用的 rowid 函数是完全一样的,只不过这一次在更新列的时候,我们需要把列名设置为 。
同时,这个函数的表述实际上也不需要我们背下来,因为在更新列的菜单里面,我们可以直接用鼠标在菜单里面翻找,找到之后点击选中就可以了。
具体的操作步骤如下图所示:
更新后的属性表结果如下。
1213.9
1265.16
1092.16
1391.57
480.387
442.389
485.018
611.374
2711.4
10
2295.96