arcgis for android 短路径分析 查找最短路径

来源:互联网 发布:小宋老师单片机 编辑:程序博客网 时间:2024/05/08 10:28

ArcGIS for Android(10.1.1)只支持在线的网络分析,执行路径分析可以通过RoutingTask类的solve方法来进行,通过给slove方法传递RoutingParameters类型的参数,可以最短路径的查找。而要成功执行路径分析,就必须发布网络分析服务,比较麻烦,下面的代码中使用的服务是arcgisonline.上已经发布的服务。以下代码程序的界面如下:


界面包含两控件:TextView和MapView,在执行路径分析前单击MapView会增加路径分析的停靠点,长按MapView会根据停靠点(至少要两个停靠点)执行查找最短路径的操作,执行成功之后会在TextView中显示相关的路径信息,这时候单击查询的路径,会选中路径片段,相关的信息也会在TextView上显示。单击TextView就会清空所有结果,恢复到原始状态。(代码绝大部分来自API中的Routing这个例子)

[java] view plaincopy
  1. public class NATestActivity extends Activity {  
  2.       
  3.     MapView mMapView ;  
  4.     private TextView tv_label;  
  5.     private SpatialReference mapSR=SpatialReference.create(102100);;  
  6.     private SpatialReference NASR=SpatialReference.create(4326);  
  7.     private GraphicsLayer routeLayer;//查询到的整条路径  
  8.     private GraphicsLayer semLayer;//查询到的路径片段  
  9.     private List<Point> stopPoints;//保存所有的停靠点  
  10.     private Symbol stopSymbol;//停靠点的符号  
  11.      private SimpleLineSymbol hiderSym;//查询到的路径的片段,设置透明将其“隐藏”  
  12.      private SimpleLineSymbol showSym;//当路径片段被选中的时候,显示的符号  
  13.      private int selectID=-1;//被选中的路径片段的ID(-1表示没有变选中)  
  14.     /** Called when the activity is first created. */  
  15.     @Override  
  16.     public void onCreate(Bundle savedInstanceState) {  
  17.         super.onCreate(savedInstanceState);  
  18.         setContentView(R.layout.main);  
  19.           
  20.         mMapView = (MapView) findViewById(R.id.map);  
  21.           
  22.         tv_label=(TextView) findViewById(R.id.directionsLabel);  
  23.         ArcGISTiledMapServiceLayer atl=new ArcGISTiledMapServiceLayer("http://services.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer");  
  24.         mMapView.addLayer(atl);  
  25.         //mapSR=mMapView.getSpatialReference();  
  26.         routeLayer=new GraphicsLayer();  
  27.         semLayer=new GraphicsLayer();  
  28.         stopPoints=new ArrayList<Point>();  
  29.         mMapView.addLayer(routeLayer);  
  30.         mMapView.addLayer(semLayer);  
  31.         stopSymbol=new SimpleMarkerSymbol(Color.RED, 3, SimpleMarkerSymbol.STYLE.CIRCLE);  
  32.         hiderSym=new SimpleLineSymbol(Color.WHITE, 1);  
  33.         //设置成透明,使其处于“隐藏”状态  
  34.         hiderSym.setAlpha(100);  
  35.         showSym=new SimpleLineSymbol(Color.RED, 4);  
  36.         mMapView.setOnStatusChangedListener(new OnStatusChangedListener() {  
  37.               
  38.             public void onStatusChanged(Object arg0, STATUS arg1) {  
  39.                 if(arg0==mMapView&&arg1==STATUS.INITIALIZED){  
  40.                     Point p= new Point( -122.084095,37.422006);  
  41.                     mMapView.zoomToResolution((Point) GeometryEngine.project(p, NASR, mapSR), 20.0);  
  42.                     Log.i("OK""KKK");  
  43.                     //单击地图添加要经过的位置  
  44.                     mMapView.setOnSingleTapListener(new MyOnSintTapLis());  
  45.                     //长按开始执行路径分析  
  46.                     mMapView.setOnLongPressListener(new MyOnPressLis());  
  47.                     //设置tv_label的单击事件为,清楚所以选中的和查询的结果  
  48.                     tv_label.setOnClickListener(new OnClickListener() {  
  49.                         public void onClick(View v) {  
  50.                             semLayer.removeAll();  
  51.                             routeLayer.removeAll();  
  52.                             selectID=-1;  
  53.                             tv_label.setText("");  
  54.                         }  
  55.                     });  
  56.                 }  
  57.             }  
  58.         });  
  59.   
  60.     }  
  61.       
  62.     /** 
  63.      * 单击地图事件,先判断是semLayer里面是否为空, 
  64.      * 如果为空就增加停靠点,如果不为空则进行选择semLayer中的内容操作 
  65.      */  
  66.     class MyOnSintTapLis implements OnSingleTapListener{  
  67.         public void onSingleTap(float arg0, float arg1) {  
  68.               
  69.             if(semLayer.getNumberOfGraphics()==0){//增加停靠点  
  70.                 Point mapPoint=mMapView.toMapPoint(arg0, arg1);  
  71.                 routeLayer.addGraphic(new Graphic(mapPoint, stopSymbol));  
  72.                 stopPoints.add((Point)GeometryEngine.project(mapPoint, mapSR, NASR));  
  73.             }else{//选中路径片段  
  74.                 int[] ids= semLayer.getGraphicIDs(arg0, arg1, 20);  
  75.                 if(ids.length>0){//有路径片段被选中  
  76.                     //回复已经被选中的路径片段为透明  
  77.                     semLayer.updateGraphic(selectID,hiderSym);  
  78.                     //设置新的被选中的路径片段为被选中状态  
  79.                     selectID=ids[0];  
  80.                     semLayer.updateGraphic(selectID,showSym);  
  81.                     //取得被选中的路径片段和其属性  
  82.                     Graphic selectGraphic=semLayer.getGraphic(selectID);  
  83.                     String text=(String) selectGraphic.getAttributeValue("text");  
  84.                     double time=(Double) selectGraphic.getAttributeValue("time");  
  85.                     double length=(Double) selectGraphic.getAttributeValue("length");  
  86.                     tv_label.setText("长度:"+length+"米,  时间:"+time+"分钟,描述:"+text);  
  87.                     //缩放到被选中的片段  
  88.                     mMapView.setExtent(selectGraphic.getGeometry(),100);  
  89.                 }  
  90.             }  
  91.         }  
  92.           
  93.     }  
  94.     //长按地图事件  
  95.     class MyOnPressLis implements OnLongPressListener{  
  96.         public void onLongPress(float arg0, float arg1) {  
  97.         if(stopPoints.size()<2){  
  98.             Toast.makeText(getApplicationContext(), "必须至少选择两个停靠点"0).show();  
  99.             return;  
  100.         }  
  101.         Toast.makeText(getApplicationContext(), "开始查找最短路径"1).show();  
  102.             new Thread(){//网络分析不能再主线程中进行  
  103.                 public void run() {  
  104.                     //准备参数  
  105.                     RoutingParameters rp=new RoutingParameters();  
  106.                     NAFeaturesAsFeature naferture=new NAFeaturesAsFeature();  
  107.                     //设置查询停靠点,至少要两个  
  108.                     for(Point p :stopPoints){  
  109.                         StopGraphic sg=new StopGraphic(p);  
  110.                         naferture.addFeature(sg);  
  111.                     }  
  112.                     rp.setStops(naferture);  
  113.                     //设置查询输入的坐标系跟底图一样  
  114.                     rp.setOutSpatialReference(mapSR);  
  115.                       RoutingTask rt = new RoutingTask(   
  116.                               "http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/Network/USA/NAServer/Route",  
  117.                               null);  
  118.                       try {  
  119.                           //执行操作  
  120.                         RoutingResult rr=rt.solve(rp);  
  121.                         runOnUiThread(new MyRun(rr));  
  122.                     } catch (Exception e) {  
  123.                         e.printStackTrace();  
  124.                         Looper.prepare();  
  125.                         Toast.makeText(getApplicationContext(), e.getMessage(), 1).show();  
  126.                         Looper.loop();  
  127.                     }  
  128.                   
  129.                 }  
  130.             }.start();  
  131.         }  
  132.           
  133.     }  
  134.       
  135.     class MyRun implements Runnable{  
  136.         private RoutingResult rr;  
  137.         public MyRun(RoutingResult rr) {  
  138.             this.rr=rr;  
  139.         }  
  140.         public void run() {  
  141.                 stopPoints.clear();  
  142.                 //得到查询到的路径  
  143.                 Route r=rr.getRoutes().get(0);  
  144.                 //往tv_label中赋值  
  145.                 tv_label.setText("中长度:"+r.getTotalLength()+"米,  总时间:"+r.getTotalTime()+"分钟,描述:"+r.getRouteName());  
  146.                 //将这条查询到路径放入routeLayer中  
  147.                 Graphic routeGraphic=new Graphic(r.getRoute().getGeometry(),new SimpleLineSymbol(Color.BLUE, 3));  
  148.                 routeLayer.addGraphic(routeGraphic);  
  149.                 mMapView.setExtent(routeGraphic.getGeometry(),100);  
  150.                 List<RoutingDirection>  routeDirs=rr.getRoutes().get(0).getRoutingDirections();  
  151.                   
  152.                 //取得查询到的路径片段,和其属性,放入到semLayer中,供点击查询每个片断信息  
  153.                 Map<String ,Object> atts=new HashMap<String,Object>();  
  154.                 for(RoutingDirection routeDir: routeDirs){  
  155.                 atts.put("text", routeDir.getText());  
  156.                 atts.put("length", routeDir.getLength());  
  157.                 atts.put("time", routeDir.getTime());  
  158.                 Graphic dirGraphic=new Graphic(routeDir.getGeometry(), hiderSym, atts, null);  
  159.                 semLayer.addGraphic(dirGraphic);      
  160.             }  
  161.         }  
  162.           
  163.     }  
  164.   
  165.     @Override   
  166.     protected void onDestroy() {   
  167.         super.onDestroy();  
  168.  }  
  169.     @Override  
  170.     protected void onPause() {  
  171.         super.onPause();  
  172.         mMapView.pause();  
  173.  }  
  174.     @Override   protected void onResume() {  
  175.         super.onResume();   
  176.         mMapView.unpause();  
  177.     }  
  178.   
  179. }  


结果:



0 0