日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

ArcGIS网络分析之Silverlight客户端最近设施点分析(四)

發(fā)布時(shí)間:2023/12/18 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ArcGIS网络分析之Silverlight客户端最近设施点分析(四) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
ArcGIS網(wǎng)絡(luò)分析之Silverlight客戶端最近設(shè)施點(diǎn)分析(四) 原文:ArcGIS網(wǎng)絡(luò)分析之Silverlight客戶端最近設(shè)施點(diǎn)分析(四)

??? 在上一篇中說(shuō)了如何實(shí)現(xiàn)最近路徑分析,本篇將討論如何實(shí)現(xiàn)最近設(shè)施點(diǎn)分析。

最近設(shè)施點(diǎn)分析實(shí)際上和路徑分析有些相識(shí),實(shí)現(xiàn)的過(guò)程基本一致,不同的是參數(shù)的設(shè)置,選用的分析圖層為最近設(shè)施點(diǎn)網(wǎng)絡(luò)分析圖層,一般形式為:

http://<服務(wù)器名或ip地址>/ArcGIS/rest/services/<地圖服務(wù)名稱>/NAServer/<最近設(shè)施點(diǎn)分析圖層名稱>

在ArcGIS Api for Silverlight中,最近設(shè)施點(diǎn)分析的參數(shù)名稱為:RouteClosestFacilityParameters,同樣它也繼承自BaseRouteParameters。其主要的參數(shù)(屬性)有:

????屬性名稱???????????
Incidents表示事件點(diǎn)
Facilities表示設(shè)施點(diǎn)
Barriers表示障礙點(diǎn),還有線障礙:PolylineBarriers,面障礙:PolygonBarriers
DefaultCutoff表示默認(rèn)終斷值,即不會(huì)搜索超出該值的設(shè)施點(diǎn)(從事件點(diǎn)到設(shè)施點(diǎn),反之同理)
ReturnDirections表示是否返回方向指南
DirectionsLanguage表示返回方向指南使用的描述語(yǔ)言(默認(rèn)與網(wǎng)絡(luò)分析圖層一致,NAServer中只有英語(yǔ),其他語(yǔ)言需要自己安裝)
DirectionsLengthUnits表示計(jì)算方向時(shí)使用的長(zhǎng)度單位。默認(rèn)與路徑網(wǎng)絡(luò)圖層的設(shè)置一致。可用的值包括esriFeet,esriKilometers, esriMeters,esriMile,esriNauticalMiles和esriYards
ReturnRoutes表示是否返回設(shè)施點(diǎn)與事件點(diǎn)的路徑
ReturnFacilities表示是否返回設(shè)施點(diǎn)
ReturnIncidents表示是否返回事件點(diǎn)
TravelDirection表示路徑的方向(從設(shè)施點(diǎn)到事件點(diǎn)還是事件點(diǎn)到設(shè)施點(diǎn))
UseHierarchy表示是否啟用等級(jí)屬性
FacilityReturnType表示設(shè)施返回類型,默認(rèn)為FacilityReturnType.ServerFacilityReturnAll
DefaultTargetFacilityCount表示默認(rèn)搜索的設(shè)施點(diǎn)個(gè)數(shù)

?

以上是最近設(shè)施點(diǎn)參數(shù)中一般用到的屬性說(shuō)明。

下面我們來(lái)看一下實(shí)現(xiàn)的具體過(guò)程。

1.首先我們需要一個(gè)最近設(shè)施點(diǎn)的網(wǎng)絡(luò)分析圖層,并實(shí)例化一個(gè)RouteTask。

例如本文發(fā)布的最近設(shè)施點(diǎn)的網(wǎng)絡(luò)分析圖層地址為:

http://localhost/ArcGIS/rest/services/NetworkAnaysisMap/NAServer/ClosestFacility

實(shí)例化RouteTask

RouteTask closestFacilityTask = new RouteTask("http://qzj-pc/ArcGIS/rest/services/NetworkAnaysisMap/NAServer/ClosestFacility");//最近設(shè)施點(diǎn)Task

這里在之前的博文中已經(jīng)說(shuō)了網(wǎng)絡(luò)分析圖層的建立和發(fā)布。在此不再討論。

2.注冊(cè)RouteTask的完成和失敗事件

注冊(cè)事件:

closestFacilityTask.SolveClosestFacilityCompleted += new EventHandler<RouteEventArgs>(closestFacilityTask_SolveClosestFacilityCompleted); closestFacilityTask.Failed += new EventHandler<TaskFailedEventArgs>(Task_Failed);

事件完成響應(yīng)函數(shù):

private void closestFacilityTask_SolveClosestFacilityCompleted(object sender, RouteEventArgs e){//獲取結(jié)果的代碼
}
private void Task_Failed(object sender, TaskFailedEventArgs e){MessageBox.Show("求解失敗" + e.Error.ToString());}

3.設(shè)置最近設(shè)施點(diǎn)分析的參數(shù),即RouteClosestFacilityParameters,例如:

RouteClosestFacilityParameters closestFacilityParameter = new RouteClosestFacilityParameters(){//設(shè)置事件點(diǎn)Incidents = stopsGraphicsLayer.Graphics,//設(shè)置設(shè)置點(diǎn)Facilities = gplayer.Graphics,//設(shè)置障礙點(diǎn)Barriers = barriesGraphicsLayer.Graphics,ReturnDirections = true,DirectionsLanguage = new System.Globalization.CultureInfo("en-US"),ReturnRoutes = true,ReturnFacilities = true,ReturnBarriers = false,ReturnIncidents = true,ReturnPolygonBarriers = false,ReturnPolylineBarriers = false,DefaultCutoff = 100000,FacilityReturnType = FacilityReturnType.ServerFacilityReturnAll,DefaultTargetFacilityCount = Convert.ToInt32(ClosestFaciclityNumTextBox.Text),TravelDirection = FacilityTravelDirection.TravelDirectionToFacility,OutSpatialReference = MyMap.SpatialReference,};

以上過(guò)程省略了關(guān)于添加障礙點(diǎn)和事件點(diǎn)的過(guò)程,其過(guò)程和最短路徑分析的過(guò)程完全一致,所以在此不再多做解釋,具體過(guò)程可以參考前一篇的博文

4.進(jìn)行最近設(shè)施點(diǎn)分析

if (closestFacilityTask.IsBusy)closestFacilityTask.CancelAsync();closestFacilityTask.SolveClosestFacilityAsync(closestFacilityParameter);

5.獲取分析結(jié)果,以及處理分析失敗的情況
最近設(shè)施點(diǎn)查詢返回的結(jié)果和最短路徑是一樣的,參數(shù)都是RouteEventArgs。所以這里我們?nèi)〉肦outeEventArgs中的RouteResults集合即可。

但是對(duì)結(jié)果的處理方式和最短路徑又有一點(diǎn)點(diǎn)小差別。因?yàn)樽疃搪窂椒祷氐慕Y(jié)果只有一條路徑,而最近設(shè)施點(diǎn)的分析結(jié)果則根據(jù)查詢的設(shè)施點(diǎn)不同而不同,例如我們想查詢最近的3個(gè)設(shè)施點(diǎn),如果查詢成功,并且找到最近的三個(gè)設(shè)施點(diǎn),那么返回的路徑就有3條。

所以這里我們需要對(duì)設(shè)施點(diǎn)查詢返回的結(jié)果進(jìn)行循環(huán)。然后剩下的工作就和最短路徑一樣了。

這里我們選擇用TreeView控件來(lái)顯示不同的路徑,最后生成的界面如下:

例如查詢附近4個(gè)最近的警察局,獲得四條路線,并可以展看查看每一天的詳情:

同時(shí)當(dāng)選中一條路徑時(shí)(位置1-第二警局),高亮顯示。

示例代碼如下:

private void closestFacilityTask_SolveClosestFacilityCompleted(object sender, RouteEventArgs e){//清空顯示方向的面板 DirectionStackPanel.Children.Clear();//情況路線圖層(即上一次查詢的結(jié)果) RoutegraphicsLayer.Graphics.Clear();//定義一個(gè)TreeView控件,將用于顯示路徑TreeView RouteTree = new TreeView();//注冊(cè)TreeView事件,當(dāng)選擇不同的節(jié)點(diǎn)時(shí),高亮顯示相應(yīng)的路徑RouteTree.SelectedItemChanged += new RoutedPropertyChangedEventHandler<object>(RouteTree_SelectedItemChanged);//遍歷返回的結(jié)果(路線)foreach (RouteResult SolvedRoute in e.RouteResults){RouteResult routeResult = SolvedRoute;//定義路線樣式routeResult.Route.Symbol = LayoutRoot.Resources["MyRouteLineSymbol"] as SimpleLineSymbol;//將路線添加到圖層中 RoutegraphicsLayer.Graphics.Add(routeResult.Route);//添加一個(gè)Item,即表示當(dāng)前的路線。將路線以樹(shù)視圖的形式展示出來(lái)TreeViewItem RouteItem = new TreeViewItem();//樹(shù)視圖一級(jí)標(biāo)題格式:<路線ID>.<路線名稱>RouteItem.Header = string.Format("{0}: {1}", SolvedRoute.Directions.RouteID, SolvedRoute.Directions.RouteName);//將TreeViewItem的Tag設(shè)置為相應(yīng)路線的ID,以便之后高亮顯示其對(duì)應(yīng)路線。RouteItem.Tag = SolvedRoute.Directions.RouteID;int i = 1;foreach (Graphic g in routeResult.Directions){StringBuilder direction = new StringBuilder();direction.AppendFormat("{0}. {1}", i, g.Attributes["text"]);if (i > 1 && i < routeResult.Directions.Features.Count){decimal Distance = (decimal)g.Attributes["length"];direction.AppendFormat(" {0}米", Distance.ToString("#0.000"));decimal NeedTime = (decimal)g.Attributes["time"];direction.AppendFormat(", {0}分鐘", NeedTime.ToString("#0.00"));}RouteItem.Items.Add(new TextBlock(){Text = direction.ToString(),Margin = new Thickness(4)});i++;}//添加總時(shí)間和路程的屬性RouteItem.Items.Add(new TextBlock(){Text = string.Format(" 總路程為:{0}千米\n\n 總時(shí)間為:{1}分鐘", (SolvedRoute.Directions.TotalLength).ToString("#0.000"),
SolvedRoute.Directions.TotalDriveTime.ToString("#0.00"))});//遍歷一條路線結(jié)束,將該路線的信息添加到TreeView中,TreeView獲得一個(gè)節(jié)點(diǎn)。 RouteTree.Items.Add(RouteItem);}//遍歷路線結(jié)束,將路線結(jié)果添加到顯示方向的面板中。 DirectionStackPanel.Children.Add(RouteTree);}

?高亮顯示當(dāng)前選中的路線,并取消高亮上一次選擇的路線,示例代碼如下:

//記錄上一次點(diǎn)擊的是哪一個(gè)節(jié)點(diǎn)int OldIndex = 0;private void RouteTree_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e){//必須點(diǎn)擊節(jié)點(diǎn)才有效,節(jié)點(diǎn)下的TextBlock雖然也能觸發(fā)Changed事件,但是無(wú)效if (e.NewValue.ToString() == typeof(TextBlock).ToString()){return;}//如果舊值不為空,即不是第一次點(diǎn)擊,那么上一次點(diǎn)擊就有可能是節(jié)點(diǎn)還有可能是節(jié)點(diǎn)下的TextBlock。//因?yàn)楫?dāng)點(diǎn)擊不同的節(jié)點(diǎn)時(shí),我們需要將上一次高亮顯示的路線不高亮,而高亮顯示本次選中的路線//所以在此需要處理if (e.OldValue != null){//如果上一次點(diǎn)擊的是TreeViewItem則直接將其還原成不高亮顯示if (e.OldValue.ToString() == typeof(TreeViewItem).ToString()){ TreeViewItem treeViewItem = (TreeViewItem)e.OldValue;OldIndex = Convert.ToInt32(treeViewItem.Tag);//在Tag中1表示的是第一條路線,其對(duì)應(yīng)Graphics的索引值為0,一次類推減1.RoutegraphicsLayer.Graphics[OldIndex - 1].Symbol = LayoutRoot.Resources["MyRouteLineSymbol"] as SimpleLineSymbol;}//如果上一次點(diǎn)擊的不是TreeView,則需要通過(guò)記錄上一次點(diǎn)擊的索引:Oldindex來(lái)確定上一次點(diǎn)擊的是那一個(gè)TreeView,并將其還原成不高亮else{RoutegraphicsLayer.Graphics[OldIndex].Symbol = LayoutRoot.Resources["MyRouteLineSymbol"] as SimpleLineSymbol;}}//獲得當(dāng)前點(diǎn)擊節(jié)點(diǎn)的索引int currentIndex = Convert.ToInt32(((TreeViewItem)((TreeView)sender).SelectedItem).Tag);//高亮顯示當(dāng)前選擇的路線RoutegraphicsLayer.Graphics[currentIndex - 1].Symbol = LayoutRoot.Resources["RouteRenderer"] as SimpleLineSymbol;//將本次點(diǎn)擊的所以賦給OldIndex.OldIndex = currentIndex - 1;}

這樣所有的工作基本就已經(jīng)完成了。下面是整體效果圖:

注:以上內(nèi)容參考了ERSI官網(wǎng)例子,以及ESRI中國(guó)編寫的ArcGIS Api For Silverlight指導(dǎo)教程。

下一篇將講解服務(wù)區(qū)分析的實(shí)現(xiàn)過(guò)程,歡迎關(guān)注!

(版權(quán)所有,轉(zhuǎn)載請(qǐng)標(biāo)明出處)

posted on 2014-05-26 12:00 NET未來(lái)之路 閱讀(...) 評(píng)論(...) 編輯 收藏

轉(zhuǎn)載于:https://www.cnblogs.com/lonelyxmas/p/3752781.html

總結(jié)

以上是生活随笔為你收集整理的ArcGIS网络分析之Silverlight客户端最近设施点分析(四)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。