3.寻找所有临时标签中的最小值,例如yi。
于是,结点i得到一个固定的标签值yi*。
4.重复上述2~3步直到所有结点都得到一个固定的标签值。
我们用下面的例子来演示这种方法。
图2.1a为由结点及连接线组成的网络,连接线上的数字为阻滞。
第
(1)步,设置结点1的固定标签值为y1*=0;临时标签y2=y3=y4=y5=M。
令i=1。
固定标签以“*”标记。
见图2.1b。
第
(2)步,结点1与结点2、3相连,于是重新计算得到2、3的临时标签。
y2=min(y2,y1+d12)=min(M,0+25)=25,类似地,y3=min(y3,y1+d13)=min(M,0+55)=55。
第(3)步,最小的临时标签值是min(25,55,M,M)=25=y2。
于是给结点2一个固定标签,令i=2。
见图2.1c。
22
回到第
(2)步,重新计算结点3、4、5的临时标签值。
结点2与结点3、4、5相连。
y3=min(y3,y2+d23)=min(55,25+40)=55,y4=min(y4,y2+d24)=min(M,25+45)=70,y5=min(y5,y2+d25)=min(M,25+50)=75。
再是第(3)步,最小临时标签值为min(55,70,75)=55=y3。
给结点3一个固定标签,令i=3。
参见图2.1d。
再回到第
(2)步,重新计算结点4、5的临时标签值。
结点3与结点5相连,则y5=min(y5,y3+d35)=min(75,55+30)=75。
再是第(3)步,最小临时标签值为min(70,75)=70=y4。
给结点4一个固定标签,令i=4。
参见图2.1e。
再回到第
(2)步,计算结点5的值。
从结点4到结点5,可得y5=min(y5,y4+d45)=min(75,70+35)=75。
结点5是剩下的唯一临时标注点,因此我们给它一个固定标签。
于是,所有结点都得到一个固定值,问题得到解决。
参见图2.1f。
23
固定标签值yi是结点1到结点i之间的最短距离。
一旦某个结点被赋予一个固定的标签值,则该结点被扫描一次。
当标签改变时,最短距离随之改变,并以“扫描结点”的形式保存下来(WuandCoppins,1981:
319)。
上面的例子可以总结为表2.1。
2.2.2用ArcGIS测算网络距离和时间
ArcGIS中处理的网络包括交通网络和市政管道网络,我们这里只讨论交通网络。
许多GIS教科书(如Chang(2004),第十六章;Price(2004)第十四章)讨论了如何用ArcGIS获取两点之间的距离(或某点与多个点之间的距离)。
在许多空间分析中,我们需要一系列起点和终点两两之间的距离矩阵。
为此,需要用ArcInfo工作站,即用ArcPlot模块里面的NODEDISTANCE命令。
默认情况下,NODEDISTANCE命令是通过公路网络来计算最短距离。
同时它也提供了计算欧式距离或曼哈顿距离的选项。
恰当地定义选项IMPEDANCE作为时间或成本,就可以计算最短交通时间或最小交通成本。
下面介绍如何用ArcGIS计算网络距离矩阵。
第一步,建立网络。
交通网络由线段费时、转弯费时、单行线、天桥、地下通道等网络要素构成(Chang,2004:
351)。
建立这样一个路网的数据采集和处理工作量都很大,往往是非常昂贵甚至是不可行的。
例如,从美国人口普查局的TIGER线文件里提取的公路图层并不包含公路结点、转弯参数或限速等信息。
在此情况下,我们只好假设用一些自动工具(如ArcGIS里构建拓扑关系的工具)生成的公路结点是相对可靠的,近似反映了真实路网的情况。
而对于线段费时,我们可以基于道路等级设定限速标准,并考虑到交通堵塞的因素。
有的研究(LuoandWang,2003根据美国统计局)在TIGER线文件中公路等的CFCC编码来设定公路限速。
另一项研究(Wang,2003基于土地利用强度(商业和居住密度)及其他一些因素建立回归模型来考虑交通堵塞程度从而预测行车速度。
第二步,用NETCOVER命令建立网络计算的路径系统。
第三步,定义始结点、末结点及阻力参数。
可以用CENTERS、STOPS、NODES等来定义始末结点,用IMPEDANCE指定用网络属性表中的哪一项来定义线段长度或费时。
24
最后,用NODEDISTANCE命令来计算始末结点之间的网络距离。
需要注意的是,NODEDISTANCE命令只计算网络上结点之间的距离。
但是,起始点或终点有可能并不在网络上。
虽然起始点(或终点)到网络结点之间的距离有可能很小,但仍需计算在内。
这是计算网络距离时需要考虑的一个重要步骤,详见下面的案例2。
2.3案例2:
测算中国东北地区各县到四大中心城市之间的距离
本例计算中国东北地区各县到中心城市之间的距离。
所得结果将在案例4B中用于定义城市腹地(参见第四章,第4.4节)。
我们的研究区选为中国的东北平原是因为该地区是一个相对完整的区域。
包括三个省:
黑龙江、吉林和辽宁。
按人口和经济规模划分,有4大中心城市:
三个省会城市(哈尔滨、长春、沈阳)和大连。
铁路一直是中国客货运输的主要方式,在本研究区尤其如此,因此这里用铁路来测量网络距离。
参见图2.2。
本书光盘提供了本例所需的下述数据:
1.包含中国东北地区203个县(或县级行政单元)的多边形文件cntyne;
2.本区4大中心城市的点文件city4;
3.研究区铁路网络的线文件railne。
为了保证网络的完整性,铁路网络涵盖的范围比三个省区略大。
这里关于各县和中心城市的空间数据是从中国县级单元GIS数据库中提取,可以从http:
//sedac.ciesin.columbia.edu/china下载。
铁路数据由中国科学院地理科学与资源研究所的金凤君先生提供。
2.3.1测算欧式距离和曼哈顿距离
如前所述,欧式距离和曼哈顿距离可以通过网络分析中心NODEDISTANCE命令来实现。
本节介绍如何不用到网络分析来计算这两种距离。
曼哈顿距离不适于象中国东北这么大区域范围内的测量(参见第2.1节),下面第(3)-(5)步中演示的曼哈顿距离的计算方法,为可选操作。
1.生成县域重心
在ArcToolbox中依次选择DataManagementTools>Features>FeatureToPoint,选择cntyne作为输入要素,并将输出要素(县域重心)命名为CntyNEpt,选中选项。
“Inside”(既重心在县城范围)
2.计算欧式距离
25
在ArcToolbox中,依次选择AnalysisTools>Proximity>PointDistance,选择CntyNEpt作为输入要素(InputFeatures),选择city4(point)作为近邻要素(NearFeatures),并将结果命名为Dist.dbf。
这里不需要限定收索半径,因为我们需要计算所有的距离。
所得表中一共有203(县)×4(市)=812条距离记录。
在距离表中加入一列airdist,根据公式airdist=distance/1000计算,得到欧式距离的公里数(原图距离单位是米)。
26
3.可选操作:
添加县域重心及城市重心的XY坐标
在ArcToolbox中,依次选择DataManagementTools>Features>AddXYCoordinates,选择CntyNEpt作为输入要素。
在CntyNEpt的属性表中,所得结果保存在point-x和point-y两列中。
此外,在ArcToolbox中,依次选择CoverageTools>DataManagement>Tables>AddXYCoordinates,选择city4作为输入文件。
在属性表city4中,所得结果保存在x-coord和y-coord两列中。
4.可选操作:
将坐标连接到县和市的距离表
在ArcMap中,右键点击表Dist.dbf,依次选择JoinsandRelates>Join,用CntyNEpt(源数据表)中的FID和Dist.dbf(目标表)中的INPUT_FID作为连接关键词将二表连接在一起。
类似地,用City4属性表中的FID和新Dist.dbf表中的NEAR_FID作为连接关键词将二表连接在一起。
5.可选操作:
计算曼哈顿距离
打开新表Dist.dbf,添加一列Manhdist,按照公式Manhdist=abs(x-coord-point-x)/1000+abs(y-coord-point-y)/1000计算数值。
所得曼哈顿距离的单位为公里,通常比欧式距离大。
2.3.2第二部分:
测算交通路网距离
26
27
两地之间(这里是起始县城与目的地中心城市)的交通距离由三部分组成。
图2.3给出了一个示例:
(1)第一段(S1)是县城编号76到它最近的铁路结点171的直线距离;
(2)第二段(S2)是铁路上两结点171和162之间铁路网络距离(途经165和163两个结点);(3)第三段(S3)是中心城市编号4到它最近的铁路结点162的直线距离。
在这里,S1和S3以直线距离近似地代替,S2为两结点之间的路网距离。
换言之,从县城#76到城市#4,假设其通行路径为:
先从县城#76到最近的结点171,然后通过铁路到结点162(途经结点165和163),最后到达中心城市#4。
本节的主要工作即是寻找这些距离县城或城市最近的铁路结点,然后计算上述三段的距离,最后将其加总。
1.准备交通网络图层
在ArcToolbox中,依次点击CoverageTools>DataManagement>Topology>Build,在railne图层上创建线拓扑关系。
重复此过程,创建点拓扑关系。
理想状态下,结点应定义为实际的铁路站点。
但我们没有这样的数据,这里假设ArecGIS拓扑工具产生的结点就是铁路站点。
2.计算县城、城市与最近铁路结点之间的直线距离
在ArcToolbox中,依次选择AnalysisTools>Proximity>Near,并选择CntyNEpt作为输入要素,railne(结点)作为最近邻要素(NearFeatures)。
在更新后的CntyNEpt属性表中,NEAR_FID列为距离县城的最近结点,而列NEAR_DIST为它们之间的直线距离。
用图层city4重复上述操作得到离中心城市最近的结点:
以city4(点)为输入要素,railne(结点)为最近邻要素。
在更新后的City4属性表中,列NEAR_FID为距离城市最近的铁路网络结点,另外的一列NEAR_DIST为它们之间的直线距离。
这一步工作分别得到了县城和城市与其最近铁路结点之间的直线距离(图2.3中的S1和S3)。
3.寻找起,始结点对
在计算路网距离时,起(始)结点不能重复。
在CntyNEpt属性表中,有多个县城对应NEAR_FID中的同一个结点。
例如,编码FID=5及FID=8的两个县城,其最近邻结点都是NEAR_FID=34的结点。
也就是说,一些近邻的县城共享铁路网络上的同一个最近邻结点(始结点)。
在city4属性表中,每个中心城市对应不同的铁路结点(末结点),因此无需再处理,四个中心城市对应于四个不同的末结点,下面介绍如何定义不重复的始结点。
打开属性表CntyNEpt,右键单击列NEAR_FID,选择Summarize,将结果保存为表Sum_FID.dbf,在该表中,列Cnt_NEAR_F(频率统计)代表每个NEAR_FID结点对应的县城数。
当频率数大于1时,表明是多个县城共享同一个结点。
表Sum_FID.dbf有149条记录,表明有149个不同的始结点。
4.定义始末结点的INFO文件
28
这一步主要为下一步准备两个INFO文件:
一个包括所有的始结点,另一个包括所有的末结点。
这两个INFO文件都必须用ArcInfoworkstation来生成。
数据表Sum_FID.dbf用于生成始结点的INFO文件,属性表city4.pat本身已经是INFO文件了,它将用于生成末结点的INFO文件。
在ArcInfoworkstation中,多边形或点图层的属性表文件扩展名为.PAT,意为Polygon(Point)AttrabuteTable多边形(或点)属性表;线(Arc)属性表文件的扩展名为.AAT;结点(Node)的属性表文件扩展名为.NAT。
ArcInfoworkstation里的操作方法如下:
在ArcInfoworkstation中,切换到目标工程文件夹(路径)(例如,通过输入命令wc:
\Quant_GIS\proj2来实现),然后输入下述命令(这里,“/*”之后的内容为命令行的注释说明):
Dbaseinfosum_fid.dbftmp/*sum-fid。
dbf转换成名为“tmp”的INFO文件
Pullitemstmpfm_nodenear_fid/*提取tmp中的“near_fid”,并生成INFO文件“fm_node”,即始结点文件
Pullitemscity4.patto_nodenear_fid/*提取city4.pat中的“near_fid”并生成INFO文件“to_node”,即末结点文件。
INFO文件fm_node和to_node中的列名称near_fid需要改为railne-id以便与铁路图层中的名字相对应。
结点属性表railne.nat中的railne-id为每个结点的唯一标志码。
这可以用ArcCatalog来实现:
右键单击fm_node(或to_node),从内容菜单中选择属性(Properties),选择Items标签,打开对话框窗口,点击Edit可以修改某项的名字。
熟练的ArcInfoworkstation用户,可以在workstation环境下修改变量名,也可以通过编写一段AML程序来自动实现。
5.计算铁路网络结点之间的距离。
可以用下述ArcInfoworkstation命令来实现:
ap/*调用arcplot模块
netcoverrailnerailroute/*设置路径系统
centersfm_node/*定义始结点
stopsto_node/*定义末结点
nodedistancecentersstopsrdist3000000networkids
q/*退出
在这里的“nodedistance”命令以3,000公里(或一个非常大的距离值)作为阈值,计算centers中每个结点跟stops中每个结点两两之间的距离,所得结果生成一个名为rdist的INFO文件。
最后两个参数是可选参数:
“network”为默认选项(其他两个选项为“Euclidean”、“Manhattan”,分别用于计算欧式距离和曼哈顿距离),参数“ids”用于指定结点的ids值作为始末结点的唯一标志(默认值为“noids”)。
在INFO文件rdist中,railne-ida项用于确定始结点,railne-idb项用于确定末结点,而network是它们之间的距离。
上述过程用于计算始末结点之间的距离(即图2.3中的S2)。
在fm_node表中有149个始结点,表to_node中有4个末结点,从而rdist中有149×4=596条距离值,这比欧式距离文件Dist.dbf中的812条距离值要少。
29
下一步是将这三段距离值连接到一起:
S2保存在表rdist中,而我们在上述第2步中得到的S1和S3分别保存在更新后的表CntyNEpt和city4中。
然而,我们不能简单地将CntyNEpt和rdist连接起来得到S1和S2。
由于每个末结点对应唯一的中心城市,把表City4和rdist连接起来(基于共同的末结点),从而得到一个包含距离S3和S2的表是不存在问题的。
在上面第3步中我们已经提到,每个始结点可能对应着CntyNEpt中的若干个县城;而一个始结点又对应着rdist中的4个末结点。
因此,表CntyNEpt和rdist的关系将会是多对多的关系,这给我们创建包含S1、S2、S3这三段距离值的数据表带来一个挑战。
在下面第6步中,我们将用欧式距离文件Dist.dbf作为一个模板来实现这个任务。
图2.4(a)-(c)为这一过程的示例,可以方便读者理解。
6.添加直线距离值
在ArcMap中,右键点击欧式距离表Dist.dbf,依次选择JoinsandRelates>RemoveJoin(s)。
这是为了去掉前面操作时连接的一些不必要的数据列。
与第一部分中的第4步类似,两次使用“join”:
将属性表CntyNEpt连接到表Dist.dbf(对应的连接标志分别为FID和INPUT_FID),将属性表city4也连接到Dist.dbf(对应的连接标志分别为:
FID和NEAR_FID)。
注意到属性表得到了更新,即上述第2步计算得到的直线距离值S1和S3添加到了表Dist.dbf中:
CntyNEpt.NEAR_DIST为县城与最近邻结点之间的距离,point:
NEAR_DIST为中心城市与其最近邻结点之间的距离。
图2.4(a)为本步的图示。
7.添加路网距离值
为了将路网距离值rdist连接到表Dist.dbf,我们需要创建一个公共的连接标志linkid用于确定始末结点的唯一铁路路径。
列linkid由始末结点的ID标志组成。
打开INFO表rdist,添加一列linkid(定义类型为“longinteger”)并根据公式linkid=1000*railne-ida+railne-idb计算。
例如,如果railne-ida=198,railne-idb=414,则linkid=198414。
参见图2.4(b)中的左表。
类似地,在表Dist.dbf中添加列linkid并根据公式Dist.linkid=1000*CntyNEpt.NE