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. 深入理解javascript对象系列第二篇——属性操作

    × 目录 [1]查询 [2]设置 [3]删除[4]继承 前面的话 对于对象来说,属性操作是绕不开的话题.类似于“增删改查”的基本操作,属性操作分为属性查询.属性设置.属性删除,还包括属性继承.本文是对 ...

  2. Android自定义Dialog(美化界面)

    前言:在做项目的时候,发现dialog界面太丑陋,从csdn上下载了一份自定义dialog的源码,在他的基础上对界面进行美化...有需要的朋友可以直接拿走 效果图如下: 主要代码: /** * 自定义 ...

  3. EntityFramework 7 Linq Contains In 奇怪问题(已修复)

    问题说明: 博客问题纪录 Use EF7, Linq Contains In is error. EF7 Code Commit adding (client side) support for Co ...

  4. Flume官方文档翻译——Flume 1.7.0 User Guide (unreleased version)(二)

    Flume官方文档翻译--Flume 1.7.0 User Guide (unreleased version)(一) Logging raw data(记录原始数据) Logging the raw ...

  5. android 布局 使用 viewPager 时,如何解决 和 子页面 长按滑动 冲突问题

    使用 viewPager 时,如何解决 和 子页面 长按滑动 冲突问题. 我的问题原型: 这个问题,我相信遇到的人会比较少,我是在 一个 viewPager 中,其中 一个 fragment 中实现了 ...

  6. ASP.NET网站优化(转自一位博友的文章,写的非常好)

    不修改代码就能优化ASP.NET网站性能的一些方法 阅读目录 开始 配置OutputCache 启用内容过期 解决资源文件升级问题 启用压缩 删除无用的HttpModule 其它优化选项 本文将介绍一 ...

  7. HTML5 Canvas 画布

    一.Canvas是什么? canvas,是一个画布,canvas元素用于在网页上绘制图形. canvas 拥有多种绘制路径.矩形.圆形.字符以及添加图像的方法. 二.创建Canvas元素 加上基本的属 ...

  8. Node.js、Express框架获取客户端IP地址

    Node.js //传入请求HttpRequest function getClientIp(req) { return req.headers['x-forwarded-for'] || req.c ...

  9. 【十大经典数据挖掘算法】k-means

    [十大经典数据挖掘算法]系列 C4.5 K-Means SVM Apriori EM PageRank AdaBoost kNN Naïve Bayes CART 1. 引言 k-means与kNN虽 ...

  10. JAVA错误汇总

    1.Slf4J-API版本兼容 问题描述 Exception in thread "main" java.lang.NoSuchMethodError: org.slf4j.hel ...