config.xml文件的配置如下:

         <widget label="路径导航" icon="assets/images/lujingdaohang.png"
config="widgets/eDriections/eDirectionsWidget.xml" url="widgets/eDriections/eTabDirectionsWidget.swf" />

源代码目录如下:

界面效果:

大概的思路如下:1.文本框输入开始点以及结束点,获取两个点坐标;2.直接在地图上点击两个点,获取两个点坐标;其实两个的最终目的是一样的,都是为了获取两个点坐标。其中用到了地理编码服务,用于根据地名来获取坐标以及根据坐标来获取地名信息。

用到了arcgis api的最短路径分析接口,routeParams以及routeTask,routeParams用来设置一些关于路径分析的参数,routeTask是用来执行路径分析方法的,具体的要看看api的介绍才行。备注:该功能模块的核心前提是要发布网络分析服务,这个在我的博客其他文章有写的

总的来说,获取两个点坐标,保存在一个stops数组里面,然后设置routeParams的属性,routeParams对象有个属性是stops,除了stops之外,还有attributeParameterValues、directionsLengthUnits、returnDirectionsreturnDirections、returnRoutes、returnStops等等;最好是执行routeTask.solve(routeParams);

eDirectionsWidget.xml:配置一些路径分析的信息

<?xml version="1.0" ?>
<configuration>
<url>http://localhost:6080/ArcGIS/rest/services/gzRoad/NAServer/路径</url>
<useproxy>false</useproxy>
<!-- <locatorurl>http://172.16.6.67/ArcGIS/rest/services/guangzhou_loc/GeocodeServer</locatorurl> -->
<locatorurl>http://localhost:6080/ArcGIS/rest/services/ns_loc_Composite/GeocodeServer</locatorurl>
<routeoptions />
<fromTx>广州市南沙区信访局</fromTx>
<toTx>小虎一桥</toTx>
</configuration> <!-- See Directions widget tag reference at http://links.esri.com/directionswidget -->

eTabDirectionsWidget.mxml:

<?xml version="1.0" encoding="utf-8"?>
<!--
///////////////////////////////////////////////////////////////////////////
// Copyright (c) 2013 Esri. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
///////////////////////////////////////////////////////////////////////////
-->
<viewer:BaseWidget xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:viewer="com.esri.viewer.*"
xmlns:esri="http://www.esri.com/2008/ags"
xmlns:RichTabNavigator="com.RichTabNavigator.*"
initialize="basewidget_initializeHandler(event)"
widgetConfigLoaded="basewidget_widgetConfigLoaded()">
<viewer:states>
<s:State name="textInput"/>
<s:State name="resultsList"/>
</viewer:states> <viewer:transitions>
<s:Transition autoReverse="true" toState="*">
<s:Fade id="fade"/>
</s:Transition>
</viewer:transitions>
<fx:Script>
<![CDATA[
import com.esri.ags.FeatureSet;
import com.esri.ags.Graphic;
import com.esri.ags.SpatialReference;
import com.esri.ags.events.DrawEvent;
import com.esri.ags.events.LocatorEvent;
import com.esri.ags.events.RouteEvent;
import com.esri.ags.geometry.Extent;
import com.esri.ags.geometry.Geometry;
import com.esri.ags.geometry.MapPoint;
import com.esri.ags.geometry.Polyline;
import com.esri.ags.portal.PopUpRenderer;
import com.esri.ags.portal.supportClasses.PopUpInfo;
import com.esri.ags.symbols.TextSymbol;
import com.esri.ags.tasks.supportClasses.AddressCandidate;
import com.esri.ags.tasks.supportClasses.AddressToLocationsParameters;
import com.esri.ags.tasks.supportClasses.DirectionsFeatureSet;
import com.esri.ags.tasks.supportClasses.NAOutputLine;
import com.esri.ags.tasks.supportClasses.RouteResult; import mx.collections.ArrayCollection;
import mx.containers.Panel;
import mx.containers.TitleWindow;
import mx.controls.Alert;
import mx.controls.Text;
import mx.controls.TextArea;
import mx.core.IVisualElement;
import mx.core.UIComponent;
import mx.events.CloseEvent;
import mx.events.EffectEvent;
import mx.events.FlexEvent;
import mx.events.ListEvent;
import mx.events.ModuleEvent;
import mx.events.ResizeEvent;
import mx.formatters.*;
import mx.managers.PopUpManager;
import mx.rpc.AsyncResponder;
import mx.rpc.Fault;
import mx.rpc.events.FaultEvent; import spark.components.NavigatorContent;
import spark.events.IndexChangeEvent;
import spark.primitives.Path; private const ICON_URL:String = "assets/images/";
private var textsearchLabel:String="路径分析";
private var resultsLabel:String="分析结果";
[Bindable]
private var fromText:String;
[Bindable]
private var toText:String;
protected function basewidget_initializeHandler(event:FlexEvent):void
{
if (isPartOfPanel) // if widget is part of "left", "right" or "bottom" panel
{
this.percentWidth = this.percentHeight = 100;
wTemplate.percentWidth = wTemplate.percentHeight = 100;
}
else
{
wTemplate.height = map.height - map.height / 100 - Number(this.top) - Number(this.bottom);
wTemplate.width = 440;
}
} private function basewidget_widgetConfigLoaded():void
{
// hide map infowindow if any
map.infoWindow.hide();
if (configXML)
{
sUrl = configXML.url[0];
var useProxyForDirections:Boolean = configXML.useproxy[0] && configXML.useproxy == "true";
locatorURL = configXML.locatorurl[0];
fromText=configXML.fromTx[0];
toText=configXML.toTx[0];
}
wTemplate.addTitlebarButton(ICON_URL + "i_searchtext.png", textsearchLabel, showStateTextSearch);
wTemplate.addTitlebarButton(ICON_URL + "i_table.png", resultsLabel, showStateResults);
fade.targets = [ textInput, resultsList ];
wTemplate.visible = true;
} private function showStateTextSearch():void
{
this.currentState = "textInput";
wTemplate.selectedTitlebarButtonIndex = 0;
} private function showStateResults():void
{
this.currentState = "resultsList";
wTemplate.selectedTitlebarButtonIndex = 1;
} //////////////////////////////////////////////////////
//路径分析功能部分代码
[Bindable]
private var sUrl:String;//="http://172.16.6.67/ArcGIS/rest/services/gzRoad/NAServer/路径";
[Bindable]
private var locatorURL:String;
private var stopType:String;
private var fromGraphic:Graphic;
private var toGraphic:Graphic;
[Bindable]
private var startTime:Date=new Date();
[Bindable]
private var endTime:Date; [Bindable]
private var travelTypeList:ArrayCollection = new ArrayCollection( [
{ label: "步行", data: 0 },
{ label: "驾车", data: 1 },
{label: "自行车", data: 2 }]); [Bindable]
private var attributeParameters:Array = new Array({
"attributeName" : "Time",
"parameterName" : "TravelType",
"value" :1}); [Bindable]
private var impedanceAttributes:ArrayCollection = new ArrayCollection( [
{ label: "最短距离", data: "Distance" },
{ label: "最少时间", data: "Time" }]); [Bindable]
private var restrictionAttributes:Array=new Array("walking"); private const NL:String = "\n"; [Bindable]private var stopsFS:FeatureSet = new FeatureSet(); private var directionResult:directionResultGroup;
private var segmentGraphic:Graphic; private var tabImpactIndex:int = 0;
private function getDirections():void
{
//hanhh
/* directionResult =new directionResultGroup();
tabImpact.addChild(directionResult);
tabImpactIndex = tabImpact.numChildren-1;
tabImpact.selectedIndex = tabImpactIndex; */
//add by lizeping ,2014/02/13
startTime=startDateField.selectedDate;
startTime.hours=hoursStepper.value;
startTime.minutes=minutesStepper.value; stopsFS.features = [];
segmentGraphic = null;
//hanhh
// directionResult.map = map;
// map.defaultGraphicsLayer.clear();
var fromParameters:AddressToLocationsParameters = new AddressToLocationsParameters();
fromParameters.distance=0.005;
fromParameters.address = { SingleLine: fromTx.text, CountryCode: 'US' };
fromParameters.outFields = [ "Loc_name" ];
locator.addressToLocations(fromParameters, new AsyncResponder(
myResultFunction, myFaultFunction, "From")); var toParameters:AddressToLocationsParameters = new AddressToLocationsParameters();
toParameters.address = { SingleLine: toTx.text, CountryCode: 'US' };
toParameters.distance=0.005;
toParameters.outFields = [ "Loc_name" ];
locator.addressToLocations(toParameters, new AsyncResponder(
myResultFunction, myFaultFunction, "To")); function myResultFunction(result:Array, token:String = null):void
{
solveRoute(result, token);
}
function myFaultFunction(error:Fault, token:Object = null):void
{
Alert.show(error.faultString, "Locator Error");
}
} private function solveRoute(addressCandidates:Array, type:String):void
{
if (addressCandidates.length == 0)
{
Alert.show(type + " address not found.", "Missing Result");
return;
} var stop:AddressCandidate = addressCandidates[0]; if (type == "From")
{
map.defaultGraphicsLayer.remove(fromGraphic);
fromGraphic = new Graphic(stop.location, fromSymbol, { address: stop.address, score: stop.score });
map.defaultGraphicsLayer.add(fromGraphic);
stopsFS.features[0] = fromGraphic; }
else if (type == "To")
{
map.defaultGraphicsLayer.remove(toGraphic);
toGraphic = new Graphic(stop.location, toSymbol, { address: stop.address, score: stop.score });
map.defaultGraphicsLayer.add(toGraphic);
stopsFS.features[1] = toGraphic; } if (stopsFS.features[0] && stopsFS.features[1])
{
routeParams.attributeParameterValues=attributeParameters; routeTask.solve(routeParams);
}
} private function solveCompleteHandler(event:RouteEvent):void
{
directionResult =new directionResultGroup();
tabImpact.addChild(directionResult);
tabImpactIndex = tabImpact.numChildren-1;
tabImpact.selectedIndex = tabImpactIndex;
directionResult.map = map;
showStateResults();
var routeResult:RouteResult = event.routeSolveResult.routeResults[0];
directionResult.directionsFS = routeResult.directions;
//add at 2014-01-08 //var route:Graphic=routeResult.route;
directionResult.route=routeResult.route;
directionResult.graphicLayer.add(fromGraphic);//图标传给动态生成的tab页
directionResult.graphicLayer.add(toGraphic);//图标传给动态生成的tab页
map.defaultGraphicsLayer.clear();
directionResult.showResult();
} private function faultHandler(event:FaultEvent):void
{
Alert.show(event.fault.faultString + "\n\n" + event.fault.faultDetail, "Routing Error " + event.fault.faultCode);
} private function formatDistance(dist:Number, units:String):String
{
var result:String = ""; var d:Number = Math.round(dist * 100) / 100; if (d != 0)
{
result = d + " " + units;
} return result;
} private function formatTime(time:Number):String
{
var result:String; var hr:Number = Math.floor(time / 60);
var min:Number = Math.round(time % 60); if (hr < 1 && min < 1)
{
result = "";
}
else if (hr < 1 && min < 2)
{
result = min + " 分钟";
}
else if (hr < 1)
{
result = min + " 分钟";
}
else
{
result = hr + " 小时 " + min + " 分钟";
} return result;
} protected function cmbTravelType_changeHandler(event:ListEvent):void
{
// TODO Auto-generated method stub
attributeParameters = new Array({
"attributeName" : "Time",
"parameterName" : "TravelType",
"value" : cmbTravelType.selectedItem.data});
if(cmbTravelType.selectedItem.data==0){
trace("use walking");
restrictionAttributes=new Array("walking");
}else{
restrictionAttributes=new Array("driving");
}
routeParams.attributeParameterValues=attributeParameters;
} protected function cmbImpedance_changeHandler(event:ListEvent):void
{
routeParams.impedanceAttribute=cmbImpedance.selectedItem.data; } protected function btnFrom_clickHandler(event:MouseEvent):void
{
// TODO Auto-generated method stub
stopType="From";
myDrawTool.markerSymbol=fromSymbol;
myDrawTool.activate(DrawTool.MAPPOINT); } protected function btnTo_clickHandler(event:MouseEvent):void
{
// TODO Auto-generated method stub
stopType="To";
myDrawTool.markerSymbol=toSymbol;
myDrawTool.activate(DrawTool.MAPPOINT);
} protected function drawTool_drawEndHandler(event:DrawEvent):void
{
// reset after finished drawing a feature
myDrawTool.deactivate();
//查询地址信息
if(stopType=="From"){
map.defaultGraphicsLayer.remove(fromGraphic);
fromGraphic=event.graphic;
}else{
map.defaultGraphicsLayer.remove(toGraphic);
toGraphic=event.graphic;
}
var point:MapPoint=event.graphic.geometry as MapPoint;
locator.locationToAddress(point, 1000); } private function onLocationToAddressComplete(event:LocatorEvent):void
{ var candidate:AddressCandidate = event.addressCandidate; if (candidate && candidate.address && candidate.address.Address)
{
var address:Object = candidate.address; if(stopType=="From"){
fromTx.text=address.Address;
}
else{
toTx.text=address.Address;
}
}
else
{
Alert.show("This location does not have a known street address.");
}
} private function onFault(event:FaultEvent):void
{
if (event.fault.name == 'Error'
&& event.fault.faultCode == '500'
&& event.fault.faultString == 'An unexpected error occurred processing the request.')
{
Alert.show("Did you click too far from a road?\n\n" + event.fault.faultDetail, "No result");
}
else
{
Alert.show(event.fault.faultString + "\n\n" + event.fault.faultDetail, "Reverse Geocoding Error " + event.fault.faultCode);
}
} private function widgetClosedHandler(event:Event):void
{
map.defaultGraphicsLayer.clear();
} ]]>
</fx:Script> <fx:Declarations>
<!-- Symbol for all point shapes --> <esri:DrawTool id="myDrawTool" drawEnd="drawTool_drawEndHandler(event)"
graphicsLayer="{map.defaultGraphicsLayer}" map="{map}"/>
<!--http://geocode.arcgis.com/arcgis/rest/services/World/GeocodeServer-->
<esri:Locator id="locator" fault="onFault(event)"
locationToAddressComplete="onLocationToAddressComplete(event)"
outSpatialReference="{map.spatialReference}" showBusyCursor="true"
url="{encodeURI(locatorURL)}"/> <esri:RouteTask id="routeTask" concurrency="last" fault="faultHandler(event)"
requestTimeout="30" showBusyCursor="true"
solveComplete="solveCompleteHandler(event)" url="{encodeURI(sUrl)}"/> <esri:RouteParameters id="routeParams" attributeParameterValues="{attributeParameters}"
directionsLengthUnits="esriMeters"
outputGeometryPrecisionUnits="esriDecimalDegrees"
outSpatialReference="{map.spatialReference}"
restrictionAttributes="{restrictionAttributes}"
returnDirections="true" returnRoutes="true" returnStops="true"
startTime="{startTime}" stops="{stopsFS}"/> <!--<esri:SimpleMarkerSymbol id="fromSymbol" color="0x00FF00"/>-->
<!--<esri:SimpleMarkerSymbol id="toSymbol" color="0xFF0000"/>-->
<esri:PictureMarkerSymbol id="fromSymbol" source="assets/skins/directions/green-A.png"/>
<esri:PictureMarkerSymbol id="toSymbol" source="assets/skins/directions/blue-B.png"/>
<esri:SimpleLineSymbol id="routeSymbol" width="4" alpha="0.5" color="0x0000FF"/>
<esri:SimpleLineSymbol id="segmentSymbol" width="8" alpha="0.5" color="0xFF0000"/>
<esri:SimpleLineSymbol id="tempSymbol" width="8" alpha="0" color="0xFF0000"/>
<s:DateTimeFormatter id="dtFormatter" dateTimePattern="MM/dd/yy, HH:mm"/>
</fx:Declarations>
<viewer:WidgetTemplate id="wTemplate" closed="widgetClosedHandler(event)" width="340" height="520"> <s:Group id="textInput" visible="false" width="100%" height="100%"
visible.textInput="true">
<s:Form width="100%">
<!-- 更改垂直间距 -->
<s:layout>
<s:FormLayout gap="-14"/>
</s:layout>
<s:FormItem label="起点:">
<s:HGroup width="100%">
<s:TextInput id="fromTx" text="{fromText}" width="90%"/>
<s:Image id="addFrom" buttonMode="true" click="btnFrom_clickHandler(event)" height="30"
source="@Embed('assets/skins/directions/add-stop.png')"
toolTip="{resourceManager.getString('ESRIMessages', 'directionsAddDestinationByMapClickTooltip')}"
useHandCursor="true"/>
</s:HGroup>
</s:FormItem>
<s:FormItem label="终点:">
<s:HGroup width="100%">
<s:TextInput id="toTx" text="{toText}" width="90%"/>
<s:Image id="addTo" buttonMode="true" click="btnTo_clickHandler(event)" height="30"
source="@Embed('assets/skins/directions/add-stop.png')"
toolTip="{resourceManager.getString('ESRIMessages', 'directionsAddDestinationByMapClickTooltip')}"
useHandCursor="true"/>
</s:HGroup>
</s:FormItem>
<s:FormItem label="出行方式:">
<mx:ComboBox id="cmbTravelType" change="cmbTravelType_changeHandler(event)"
dataProvider="{travelTypeList}" selectedIndex="1"/> </s:FormItem>
<s:FormItem label="路径选择:">
<mx:ComboBox id="cmbImpedance" change="cmbImpedance_changeHandler(event)"
dataProvider="{impedanceAttributes}" selectedIndex="0"/> </s:FormItem>
<s:FormItem label="出发时间:">
<s:HGroup><mx:DateField id="startDateField" formatString="YYYY-MM-DD" height="30"
selectedDate="{new Date()}">
</mx:DateField>
<s:NumericStepper id="hoursStepper" width="40" maximum="24" minimum="1">
</s:NumericStepper><s:Label text="时"/>
<s:NumericStepper id="minutesStepper" width="40" maximum="59" minimum="0"></s:NumericStepper><s:Label text="分"/>
</s:HGroup></s:FormItem>
<s:FormItem>
<s:Button label="查询" click="getDirections()" height="30"/>
</s:FormItem>
</s:Form>
</s:Group>
<s:Group id="resultsList" visible="false" width="100%" height="100%"
visible.resultsList="true">
<RichTabNavigator:RichTabNavigator id="tabImpact" width="100%" height="100%" backgroundAlpha="0"
cornerRadius="5" dropShadowVisible="false" horizontalAlign="left"
paddingTop="-1" tabHeight="30" tabWidth="110" borderVisible="true">
</RichTabNavigator:RichTabNavigator>
</s:Group> </viewer:WidgetTemplate>
</viewer:BaseWidget>

备注:

GIS技术交流QQ群:432512093

WebGIS二次开发培训入门群: 238339408

天津政府应急系统之GIS一张图(arcgis api for flex)讲解(十一)路径导航模块的更多相关文章

  1. 天津政府应急系统之GIS一张图(arcgis api for flex)讲解(一)GIS一张图的系统开发环境以及flexviewer框架

    系统的GIS功能实现是基于arcgis api for flex,首先附上系统的主界面图,接下来的是对主界面的模块功能详细讲解: 一.GIS环境软件安装 (1)arcgis desktop的安装,要是 ...

  2. 天津政府应急系统之GIS一张图(arcgis api for flex)讲解(十)态势标绘模块

    config.xml文件的配置如下: <widget label="态势标绘" icon="assets/images/impact_area_over.png&q ...

  3. 天津政府应急系统之GIS一张图(arcgis api for flex)讲解(八)资源搜索模块

    config.xml文件的配置如下: <widget label="资源搜索" icon="assets/images/public_impact_over.png ...

  4. 天津政府应急系统之GIS一张图(arcgis api for flex)讲解(二)鹰眼模块

    讲解GIS功能模块实现之前,先大概说一下flexviewer的核心配置文件config.xml,系统额GIS功能widget菜单布局.系统的样式.地图资源等等都是在这里配置的,这里对flexviewe ...

  5. 天津政府应急系统之GIS一张图(arcgis api for flex)解说(二)鹰眼模块

    解说GIS功能模块实现之前,先大概说一下flexviewer的核心配置文件config.xml,系统额GIS功能widget菜单布局.系统的样式.地图资源等等都是在这里配置的,这里对flexviewe ...

  6. 天津政府应急系统之GIS一张图(arcgis api for flex)讲解(十三)台风模块

    config.xml文件的配置如下: <widget label="台风" icon="assets/images/typhoon.png" config ...

  7. 天津政府应急系统之GIS一张图(arcgis api for flex)讲解(六)地图搜索模块

    config.xml文件的配置如下: <widget label="地图搜索" icon="assets/images/emergency_resource_ove ...

  8. 天津政府应急系统之GIS一张图(arcgis api for flex)讲解(四)地图导航控件模块

    config.xml文件的配置如下: <widget left="10" top="50" config="widgets/Navigation ...

  9. 天津政府应急系统之GIS一张图(arcgis api for flex)讲解(三)显示地图坐标系模块

    config.xml文件的配置如下: <widget left="3" bottom="3" config="widgets/Coordinat ...

随机推荐

  1. ScriptTask读取SharePoint上的Excel

    很多情况下,我们会SharePoint 作为文件共享的Server,有时,业务上需要将SharePoint上的Excel文档 Download 到db中.对于搞DB的人来说,难点是如何下载Excel? ...

  2. 推荐21款最佳 HTML5 网页游戏

    尽管 HTML5 的完全实现还有很长的路要走,但 HTML5 正在改变 Web,未来 HTML5 将把 Web 带入一个更加成熟和开放的应用平台.现在,越来越多的人尝试用 HTML5 来制作网页游戏等 ...

  3. WPF Datagrid删除一行

    private void btnDel_Click(object sender, RoutedEventArgs e) { if (DGUser.SelectedItem != null) { Dat ...

  4. Java基础之类Class使用

    大家都知道Java是一门面向对象编程语言,在Java世界里,万事万物皆对象,那个Java中怎么表示对象呢?Class 我们知道Java中的对象都是Object类的子类,那么今天我们就一起来研究一下Ja ...

  5. 【资源】108个大数据文档PDF开放下载-整理后打包下载

                  本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4288836.html        本博客其他.NET开源项目文章目录:h ...

  6. SAE学习-使用SAE的Storage服务存储图片

    看到园子里面有同学写了一篇<基于PHP实现阿里云开放存储服务>,围观地址:http://www.cnblogs.com/nosqlcoco/p/3474773.html.想起自己也在Sin ...

  7. Javascript之一切皆为对象1

    在javascript的世界里,有这么一句话,一切皆为对象. 但是这个对象,应该怎么理解呢? OMG,难道值类型也是对象?!! 当然,不是. 准确地讲是对于“引用类型”而言. 那,在JavaScrip ...

  8. 配置putty自动登陆服务器

    putty是一款知名的SSH工具,可以用来登陆linux服务器,提供了终端.SSH是secure Shell的缩写.我之前也有一篇文章介绍这个话题:http://www.cnblogs.com/che ...

  9. 分享一个 @user 前端插件

    开源地址:https://github.com/yuezhongxin/Mention.js 插件效果:类似于微博或 github 中 @user 列表效果. 这是个二次开发的插件,花了几天时间,对 ...

  10. EntityFramework 7 Join Count LongCount 奇怪问题

    先吐槽一下,EF7 目前来说,真对的起现在的版本命名:"EntityFramework": "7.0.0-beta1". 这篇博文纪录一下:当 Linq 查询中 ...