最近用arcgis GP服务做了几个Demo,为了不丢失自己的实践经验,我决定把过程记下来!!!
(一)最短路径分析
以上为效果图,在此感谢http://www.tzwhx.com/newOperate/html/5/51/514/15549.html博文给我的启发,我用自己的数据做了实验,并且汉化了路径描述(因为从英文直接汉化,因此可能有点Ehinese的不足),下面描述整个模型制作和程序实现过程:
(1)数据准备
这里必须是使用网络数据集,我从ShapeFile生成,在ArcCatalog里面操作,首先建立一个叫TestRouting的空文件夹,同时建立Scrach和ToolData子文件夹,Scrach用来存放模型生成的脚本结果,ToolData饱含制作模型的原数据,再建立一个叫TestRouting的工具箱,像下图这样子:
在ToolData文件夹里放入我们的实验数据,并制作网络数据集,当然这个实验数据不是简单的道路数据,包括一些网络数据集必须的字段(zbcov.shp),单击右键,选择New Network Dataset...
一些基本设置都是默认的,但是有一点必须注意,在下面这个窗口中,需要对elevation数据做以下设置,field要选择自己数据中对应的字段。
一路next,生成下面的两个数据,zbcov_ND和zbcov_ND_Junctions。
(2)模型制作
在ArcMap中打开zbcov_ND,并在ArcToolBox中加入刚才新建的TestRouting,在TestRouting上点击右键,new一个model,命名为ShortestRoute,按照下面的pic制作最短路径分析的模型.
制作模型需要注意很多,直接用Arcgis例子里的当然不是不行,但是制作模型本来也是一种乐趣,并且有助于理解ArcGIS的一些算法过程,由于我自己在这个过程碰到了很多问题,因此打算一步步把过程写下来。首先要加入Network的扩展模块,Tools->Extension,选择Network Analyst复选框。
A.将Network Analyst Tools工具箱打开,选择Analysisi->Make Route Layer,拖入Model窗口,当然如果找不到这个工具也不必郁闷,直接在Search里面搜就行了。双击Make Route Layer工具,在Input analysis network中选择我们在ArcMap中添加的图层zbcov_ND,其他的选项可以都选择默认。这时在模型中,输入项变成蓝色,工具变成黄色,输出为绿色。
B. 再找到Add Locations工具,拖入Model窗口。右键单击工具,选择Make Variable->From Parameter-> Input locations。
C.在Input locations这个输入项上单击右键,选择properties...,给这个数据项做如下参数设置,data type是Feature Set,symbology from选择zbcov_ND_Junctions.shp,其实后面这个是确定你在输入Feature时的样式和包含字段,可以选择ArcGIS里面保存的样式,我这个为了方便随便选的一个点数据层,表明样式随选择的数据层而定,加入的点数据和zbcov_ND_Junctions的字段是一样的。
D.双击Add locations工具,Input network analysis layer选择之前生成的Route层,Sub layer为Stops,表明我们要在Route层加入最短路径的站点,此外,还有barriers,表明障碍物。Input locaations为上一步加入的层,同时在Field mappings做字段匹配,因为我们选择了zbcov_ND_Junctions作为Input locations的symbol层,因此只有两个字段FID,和Zelev,因此我们只在Name中选择FID这个字段。其他字段可以选择默认。
F.在Model窗口内再拖一个Add Locations工具,步骤和添加站点的步骤差不多,是为路径分析添加障碍物的过程。为了区分添加站点,为添加障碍物的子模型修改名字,变为Add Barriers,输入项变为Input Barriers,另一个输入项为之前生成的结果图层Route (2)。在Add Barriers中的设置sub layer要选择barriers。Fields mapping仍然只设置name为FID。如下。
G.在Model窗口拖入Solve工具,双击,在Input network Analysis layer中选择上一步生成的Network Analyst Layer图层,如下图。
H.生成的结果做两个处理,一种直接把路径结果作为附加图层显示出来,一种生成路径描述xml,将select data工具和Directions工具拖入Model窗口,select data工具用直接与上一步生成的Route (3)连起来,双击select data工具,Child Data Element (optional)选择Routes,表明输出的结果图层是路径,双击Directions工具,Output file type选择xml,Output directions file选择生成的xml路径,即为我们最开始生成的Scratch文件夹。
当然生成的xml文件路径还有另外一种设置方式,在ArcMap窗口选择Tools->Options->Geoprocessing选项卡,做如下设置,Overwrite...表明每生成新的xml文件将覆盖以前的结果;log...表明有覆盖操作会有警告。
同时在Environments选择Scratch Workspace为最开始生成的Scrach文件夹。
这时Model窗口里的Direnctions工具的xml生成路径可以直接设置如下。
一般我们会选择第二种路径设置方式,便于多个生成文件的统一管理。
I.开始做模型的时候以为这样就完事了,其实疏忽了一个非常容易丢掉但又很重要的环节,就是确定模型的输入输出项,如果我们不做这一步,模型就是空的。这个模型有两个输入项,Input locations(设置站点),Input barriers(设置障碍),两个输出项,ShortestRoute和Route_Directions.xml,zbcov_ND其实也是一个输入项,但是因为我们制作模型时就已经设置了,不作为用户输入。设置方式如下,右键单击设置项,选择Model Parameter。
最后的模型如下图:
(3)测试模型
保存刚生成的模型,在工具箱中双击模型,可以看到模型框框。在ArcMap的图层上点击,输入两个站点和一个障碍,运行后就可以看到结果作为一个图层显示出来。
(4)发布GP服务
将刚刚做好的ShortestRoute模型拖入ArcMap中的Layers里,作为第一个图层,zbcov_ND作为分析层为第二层,保存为一个mxd(TestRoutingService.mxd)。同时zbcov.shp原数据单独保存为一个mxd(TestRoutingBasemap.mxd),作为路径分析的底图,如果有其他数据也可以加进去,这个不是重点。在ArcCatalog中可以看到文件的格局如下。
TestRoutingBasemap直接发布为一个MapService,不做赘述;TestRoutingService发布为一个GeoprocessingService,具体步骤如下:
A.之前要Add ArcGIS Server,然后Add GIS Service,Type选择Geoprocessing Service,并给服务起一个名字。下一步。。。
B.选择Synchronous执行方式,选择发布一个map的方式,并在Data Frame中选择Layers,选中Show Messages复选框。至于Synchronous和Asynchronous的区别,前者是同步执行,用于不很复杂的GP服务,效率较高;后者是异步执行,不做赘述。下一步。。。选择默认设置,完成。
(5)测试GP服务
打开一个空的ArcMap,从catalog中直接把刚刚发布的BaseMap拖入Layers,在ArcToolBox中将刚发布的Geoprocessing服务加载进来,这时可以看到模型的图标变为一个小斧头。
双击这个模型,进行参数输入,执行
如果发布的模型没有问题,将会出现如下的结果。
(6)在Flex中调用模型。
底图的服务url为"http://localhost/arcgis/rest/services/testRoutingBm/MapServer";
GP服务的url为"http://localhost/arcgis/rest/services/DriveTime/GPServer/ShortestRoute2".
因为是在自己的机器上发布的,因此都是localhost...
代码直接参考http://www.tzwhx.com/newOperate/html/5/51/514/15549.html的博文,贴不下就不贴了。
GP调用的关键为下面的语句:
var params:Object = {
"Input_locations":featureSet,
"Input_barriers":featureSet2
};
//进行分析成功调用onResult方法,失败调用onFault方法
gp.execute(params, new AsyncResponder(onResult,onFault));
这里的Input_locations和Input_barriers就是模型的两个输入项,通过GP服务的URL可以直接看到详细的描述,如下为Input_barriers的详细描述。
gp.execute执行结果通过AsyncResponder传入onResult,如果出错,通过onFault执行。
(7)汉化输入路径
输出路径的描述默认是英文,这是比较郁闷,因此想办法汉化一下。找到%ArcGIS安装路径%\NetworkAnalyst\Directions,我的是C:\Program Files\ArcGIS\NetworkAnalyst\Directions,将里面的directions.lng文件英文的描述全部改为中文,虽然比较麻烦琐碎,但是这时一个过程(最好备份一下以前的directions.lng以防不测)。另存为需要注意选择UTF-8的编码方式。
最上面改成下面的
[General]
Encoding = UTF-8
Default = zh_cn
再次运行程序,会发现Directions表格里面的路径描述都变为中文。
终于写完了第一篇,下一篇将是最近设施查找……有时间再写,先贴个效果图。