1. 程式人生 > >arcgis for android 短路徑分析 查詢最短路徑

arcgis for android 短路徑分析 查詢最短路徑

ArcGIS for Android(10.1.1)只支援線上的網路分析,執行路徑分析可以通過RoutingTask類的solve方法來進行,通過給slove方法傳遞RoutingParameters型別的引數,可以最短路徑的查詢。而要成功執行路徑分析,就必須釋出網路分析服務,比較麻煩,下面的程式碼中使用的服務是arcgisonline.上已經發布的服務。以下程式碼程式的介面如下:


介面包含兩控制元件:TextView和MapView,在執行路徑分析前單擊MapView會增加路徑分析的停靠點,長按MapView會根據停靠點(至少要兩個停靠點)執行查詢最短路徑的操作,執行成功之後會在TextView中顯示相關的路徑資訊,這時候單擊查詢的路徑,會選中路徑片段,相關的資訊也會在TextView上顯示。單擊TextView就會清空所有結果,恢復到原始狀態。(程式碼絕大部分來自API中的Routing這個例子)

  1. publicclass NATestActivity extends Activity {  
  2.     MapView mMapView ;  
  3.     private TextView tv_label;  
  4.     private SpatialReference mapSR=SpatialReference.create(102100);;  
  5.     private SpatialReference NASR=SpatialReference.create(4326);  
  6.     private GraphicsLayer routeLayer;//查詢到的整條路徑
  7.     private
     GraphicsLayer semLayer;//查詢到的路徑片段
  8.     private List<Point> stopPoints;//儲存所有的停靠點
  9.     private Symbol stopSymbol;//停靠點的符號
  10.      private SimpleLineSymbol hiderSym;//查詢到的路徑的片段,設定透明將其“隱藏”
  11.      private SimpleLineSymbol showSym;//當路徑片段被選中的時候,顯示的符號
  12.      privateint selectID=-1;//被選中的路徑片段的ID(-1表示沒有變選中)
  13.     /** Called when the activity is first created. */
  14.     @Override
  15.     publicvoid onCreate(Bundle savedInstanceState) {  
  16.         super.onCreate(savedInstanceState);  
  17.         setContentView(R.layout.main);  
  18.         mMapView = (MapView) findViewById(R.id.map);  
  19.         tv_label=(TextView) findViewById(R.id.directionsLabel);  
  20.         ArcGISTiledMapServiceLayer atl=new ArcGISTiledMapServiceLayer("http://services.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer");  
  21.         mMapView.addLayer(atl);  
  22.         //mapSR=mMapView.getSpatialReference();
  23.         routeLayer=new GraphicsLayer();  
  24.         semLayer=new GraphicsLayer();  
  25.         stopPoints=new ArrayList<Point>();  
  26.         mMapView.addLayer(routeLayer);  
  27.         mMapView.addLayer(semLayer);  
  28.         stopSymbol=new SimpleMarkerSymbol(Color.RED, 3, SimpleMarkerSymbol.STYLE.CIRCLE);  
  29.         hiderSym=new SimpleLineSymbol(Color.WHITE, 1);  
  30.         //設定成透明,使其處於“隱藏”狀態
  31.         hiderSym.setAlpha(100);  
  32.         showSym=new SimpleLineSymbol(Color.RED, 4);  
  33.         mMapView.setOnStatusChangedListener(new OnStatusChangedListener() {  
  34.             publicvoid onStatusChanged(Object arg0, STATUS arg1) {  
  35.                 if(arg0==mMapView&&arg1==STATUS.INITIALIZED){  
  36.                     Point p= new Point( -122.084095,37.422006);  
  37.                     mMapView.zoomToResolution((Point) GeometryEngine.project(p, NASR, mapSR), 20.0);  
  38.                     Log.i("OK""KKK");  
  39.                     //單擊地圖新增要經過的位置
  40.                     mMapView.setOnSingleTapListener(new MyOnSintTapLis());  
  41.                     //長按開始執行路徑分析
  42.                     mMapView.setOnLongPressListener(new MyOnPressLis());  
  43.                     //設定tv_label的單擊事件為,清楚所以選中的和查詢的結果
  44.                     tv_label.setOnClickListener(new OnClickListener() {  
  45.                         publicvoid onClick(View v) {  
  46.                             semLayer.removeAll();  
  47.                             routeLayer.removeAll();  
  48.                             selectID=-1;  
  49.                             tv_label.setText("");  
  50.                         }  
  51.                     });  
  52.                 }  
  53.             }  
  54.         });  
  55.     }  
  56.     /** 
  57.      * 單擊地圖事件,先判斷是semLayer裡面是否為空, 
  58.      * 如果為空就增加停靠點,如果不為空則進行選擇semLayer中的內容操作 
  59.      */
  60.     class MyOnSintTapLis implements OnSingleTapListener{  
  61.         publicvoid onSingleTap(float arg0, float arg1) {  
  62.             if(semLayer.getNumberOfGraphics()==0){//增加停靠點
  63.                 Point mapPoint=mMapView.toMapPoint(arg0, arg1);  
  64.                 routeLayer.addGraphic(new Graphic(mapPoint, stopSymbol));  
  65.                 stopPoints.add((Point)GeometryEngine.project(mapPoint, mapSR, NASR));  
  66.             }else{//選中路徑片段
  67.                 int[] ids= semLayer.getGraphicIDs(arg0, arg1, 20);  
  68.                 if(ids.length>0){//有路徑片段被選中
  69.                     //回覆已經被選中的路徑片段為透明
  70.                     semLayer.updateGraphic(selectID,hiderSym);  
  71.                     //設定新的被選中的路徑片段為被選中狀態
  72.                     selectID=ids[0];  
  73.                     semLayer.updateGraphic(selectID,showSym);  
  74.                     //取得被選中的路徑片段和其屬性
  75.                     Graphic selectGraphic=semLayer.getGraphic(selectID);  
  76.                     String text=(String) selectGraphic.getAttributeValue("text");  
  77.                     double time=(Double) selectGraphic.getAttributeValue("time");  
  78.                     double length=(Double) selectGraphic.getAttributeValue("length");  
  79.                     tv_label.setText("長度:"+length+"米,  時間:"+time+"分鐘,描述:"+text);  
  80.                     //縮放到被選中的片段
  81.                     mMapView.setExtent(selectGraphic.getGeometry(),100);  
  82.                 }  
  83.             }  
  84.         }  
  85.     }  
  86.     //長按地圖事件
  87.     class MyOnPressLis implements OnLongPressListener{  
  88.         publicvoid onLongPress(float arg0, float arg1) {  
  89.         if(stopPoints.size()<2){  
  90.             Toast.makeText(getApplicationContext(), "必須至少選擇兩個停靠點"0).show();  
  91.             return;  
  92.         }  
  93.         Toast.makeText(getApplicationContext(), "開始查詢最短路徑"1).show();  
  94.             new Thread(){//網路分析不能再主執行緒中進行
  95.                 publicvoid run() {  
  96.                     //準備引數
  97.                     RoutingParameters rp=new RoutingParameters();  
  98.                     NAFeaturesAsFeature naferture=new NAFeaturesAsFeature();  
  99.                     //設定查詢停靠點,至少要兩個
  100.                     for(Point p :stopPoints){  
  101.                         StopGraphic sg=new StopGraphic(p);  
  102.                         naferture.addFeature(sg);  
  103.                     }  
  104.                     rp.setStops(naferture);  
  105.                     //設定查詢輸入的座標系跟底圖一樣
  106.                     rp.setOutSpatialReference(mapSR);  
  107.                       RoutingTask rt = new RoutingTask(   
  108.                               "http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/Network/USA/NAServer/Route",  
  109.                               null);  
  110.                       try {  
  111.                           //執行操作
  112.                         RoutingResult rr=rt.solve(rp);  
  113.                         runOnUiThread(new MyRun(rr));  
  114.                     } catch (Exception e) {  
  115.                         e.printStackTrace();  
  116.                         Looper.prepare();  
  117.                         Toast.makeText(getApplicationContext(), e.getMessage(), 1).show();  
  118.                         Looper.loop();  
  119.                     }  
  120.                 }  
  121.             }.start();  
  122.         }  
  123.     }  
  124.     class MyRun implements Runnable{  
  125.         private RoutingResult rr;  
  126.         public MyRun(RoutingResult rr) {  
  127.             this.rr=rr;  
  128.         }  
  129.         publicvoid run() {  
  130.                 stopPoints.clear();  
  131.                 //得到查詢到的路徑
  132.                 Route r=rr.getRoutes().get(0);  
  133.                 //往tv_label中賦值
  134.                 tv_label.setText("中長度:"+r.getTotalLength()+"米,  總時間:"+r.getTotalTime()+"分鐘,描述:"+r.getRouteName());  
  135. 相關推薦

    arcgis for android 路徑分析 查詢路徑

    ArcGIS for Android(10.1.1)只支援線上的網路分析,執行路徑分析可以通過RoutingTask類的solve方法來進行,通過給slove方法傳遞RoutingParameters型別的引數,可以最短路徑的查詢。而要成功執行路徑分析,就必須釋出網路分析

    ArcGIS API for Javascript4.8 路徑網路分析路徑查詢

    程式碼是在官方demo上修改來的,官方的demo是需要裝置代理伺服器,才能顯示效果的,這裡我直接設定了ArcGIS Server允許跨域,所以不需要設定代理。 <!DOCTYPE html> <html> <head>

    一個ArcGIS網路分析路徑例子||A Network Analyst Shortest Route of ArcGIS

    這是我前幾年利用ArcMap,ArcCatalog做的最短路徑查詢時候實現的步驟說明記錄,留作後用,時代久遠,很容易忘記,適當做個記錄算是個好習慣吧。 例子是以上海地鐵線路換乘的。 可以實現任意兩點之間的地鐵路線查詢。 主要內容:ArcMap,ArcCatalog,Netw

    Arcgis For Android 查詢功能

    Arcgis For Android 有三種常用的查詢方式:IdentifyTask 、FindTask 和 QueryTask。 1、QueryTask QueryTask是一個進行空間和屬性查詢的功能類,它可以在某個地圖服務的某個子圖層內進行查詢,QueryTask進行查詢的地圖服務並不必須載入到Map中

    Arcgis for android 離線查詢

    package com.esri.arcgis.android.samples.offlineroutingandgeocoding; import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.Lis

    arcgis for android空間查詢 點選某點,選中該點所在區域,高亮顯示

    修改mail.xml <com.esri.android.map.MapView android:id="@+id/map" android:layout_width="fill_parent" an

    arcgis for android 離線切片載入與geodatabase查詢

    載入geodatabase資料private FeatureLayer valueFL; //離線資料圖 @Override public void getLocalMapServerDiFangData(){ try {

    Arcgis for Android 空間數據WKT與JSON描述

    nbsp gis str ext 10.9 select exception json字符串 spatial 點線面數據標準格式 一、 點 WKT: POINT(-118.4 -45.2) JSON: { "x": -118.4, "y": -45.2, "

    Arcgis for android的離線數據庫小記

    pan eat 下載失敗 roi 一模一樣 數據 ID 找到 code 最近在使用arcgis for android,要實現本地數據的編輯,esri的解決方案搞的太復雜,遇到了不少問題,特此記錄 1.Desktop生成的runtime geodatabase無法在本地進

    arcgis for android 呼叫公網天地圖註記重影問題

          最近在android專案開發中,使用arcgis for android 地圖api呼叫公網的天地圖。有一個問題,天地圖的註記層,在地圖縮放的時候重新整理滯後,導致註記層有重影,使用者體驗差。    &nb

    ArcGIS for Android 100.3的學習與應用(三) 實現地圖新增自定義指北針

    圖為高德地圖實現指北針的效果,那麼ArcGIS如何實現呢? 實現方式: 新增地圖的旋轉監聽: map.addMapRotationChangedListener(new MapRotationChangedListener() { @Override

    ArcGIS for Android 100.3的學習與應用(二) 如何移除指定的點和線?

    在地圖上新增點和線的時候,我們有時候會遇到要移除或者切換指定的點和線的操作。那麼如何移除指定的點和線呢? ArcGIS的api裡點和線都是由GraphicsOverlay類來進行建立新增的。通過Graphic物件將點或者線的圖形物件(SimpleMarkerSymbol,SimpleLine

    ArcGIS for Android 100.3的學習與應用(一) 如何繪製點和線?

    平時工作中,我們接觸到的地圖類開發平臺有很多,最常用的有高德,百度,騰訊地圖。而且它們都有自己的開發者平臺和文件供我們使用。基本能滿足我們的業務需求。 由於公司裡的專案會涉及一些地圖資料統計和展示方面的需求,同時也會發布一些地圖服務,所以選擇了使用在地圖方面比較牛逼的ArcGIS。 把平時遇

    路徑 單源路徑Dijkstra(迪傑斯特拉)演算法 Floyd(弗洛伊德)演算法

    兩個演算法的主要思想都是鬆弛,就是兩點間的距離通過第三點來變短 比如   1->3=10     1->2=2   2->3=5    這樣你就可以通過2號點把1,3兩點的距離縮短為7 Dijkstra演算法被稱為單源最短路,意思就是隻能計算某個點到

    ArcGIS for Android載入WMS(1)——WMS基本介紹

    今天開始寫ArcGIS for Android載入WMS系列的一些記錄,主要包括WMS的基本介紹,ArcGIS for Android載入WMS,用MapGuide和GeoServer釋出WMS並在ArcGIS for Android中載入以及其中存在的一些問題等。因為前兩天

    ArcGIS for Android 的學習與應用(二) 如何移除指定的點和線?

    在地圖上新增點和線的時候,我們有時候會遇到要移除或者切換指定的點和線的操作。那麼如何移除指定的點和線呢? ArcGIS的api裡點和線都是由GraphicsOverlay類來進行建立新增的。通過Graphic物件將點或者線的圖形物件(SimpleMarkerSy

    Dijkstra--POJ 2502 Subway(求出所有路徑再求路徑

    題意: 你從家往學校趕,可以用步行和乘坐地鐵這兩種方式,步行速度為10km/h,乘坐地鐵的速度為40KM/h。輸入資料的第一行資料會給你起點和終點的x和y的座標。然後會給你數目不超過200的雙向地鐵線路的站點,你可以從一個站點乘坐地鐵到下一個站點,你可以在同一線

    每天一道LeetCode-----計算從二維陣列的左上角到達右下角的所有路徑數及的那條,如果存在障礙物時又是多少

    Unique Paths 原題連結Unique Paths 計算從左上角有多少條不同的路徑可以到達右下角,移動方向只能是向右和向下。 對於每個位置,都有兩種移動的可能,即向右移動和向下移動。可以用深度優先(dfs)解決,同時為了解決重複計算,可以用動態

    ArcGIS for Android示例解析之地圖旋轉-----MapRotation

      MapRotation 新增地圖控制元件,並且為地圖容器中新增地圖服務上面已經介紹完了,下面我們來個複雜一點的,這個例子主要實現了地圖的旋轉功能,下面來看一下應用的佈局檔案main.xml,內容如下: <com.esri.android.map.MapView

    【深度優先_棧】:輸出迷宮的所有路徑,並求出路徑長度及路徑

    //要求輸出迷宮的所有路徑,並求出最短路徑長度及最短路徑。 //入口座標設為(1,1),出口座標設為(4,4) #include<stdio.h> #define M 4 //行數 #define N 4 //列數 #define MaxSiz