现在的位置: 首页 > 综合 > 正文

ArcGIS for Android 体验(二) 绘制标绘

2018年02月18日 ⁄ 综合 ⁄ 共 21835字 ⁄ 字号 评论关闭

前言

在前文已经http://blog.csdn.net/david_ocean/article/details/13296125中已经说到了对于地图图层的添加,其中特意说明了矢量图层的特质,在线矢量图层的加载和离线矢量图层的权限问题。

         而本章的重点,是通过矢量图层进行操作,完成绘制。在ArcGIS for Android中,矢量图层的离线加载是需要认证许可。而在mapview中自行创建的矢量图层,可以将矢量信息进行表达,只是无法存储而已。

查看API中,可知道,对于加载的在线矢量地图ArcGISFeatureLayer是GraphicsLayer的子类,而我们绘制信息的图层也是GraphicLayer图层。

体验

标绘基础结构

         在ArcGIS for Android中,对于绘制的基本元素之一是Geometry,例如我们最常用也是最重要的就是:point,polyline,polygon。他们包含地理坐标信息和类型信息。在ArcGIS for Android中对于他们有自己的定义,请看看示意:

          最最基本的单位是point。然后通过point可以自己组成一个点要素,然后若是想要组成polyline或者polyline的话,那么需要进行更多操作。Polyline和polygon的基本组成要素是line,可以理解成线段。而line是需要point来组成。每个line有且仅有两个point,也就是两点组成一段,然后又line来组成polyline和polygon。这和我们以往的理解有些不同。在以往的理解中,polyline和polygon都是由point组成的。所以现在有了这个不同,在这里本人就要特别提一下。

         大家看到这个point,polyline以及polygon了,这些只能算是要素,自己是没有外形的。我们需要为其设定外形,点的形状,颜色,大小。线的粗细,颜色,虚线与否。面的透明度,颜色以及填充物样式等。这些在ArcGIS for Android中为Symbol中进行设定。Symbol的基本结构大概如此:

        一个真正的标绘Graphic的基本组成单元是由Geometry和Symbol共同完成的,所以我们在设定标绘的时候,要使用两者一同设定。下文是Graphic的构造器的说明:

工程的建立

Menu的设定

在谈及完Graphic的结构原理后,现在需要做的是对于工程的建立来实现标绘的添加。

在界面中,不修改main.xml,整个屏幕不添加控件,让其显示最完成。然后所有操作设定在menu上面。我分成点,线,面三种类型的绘制,每种类型有一些选择来区别标绘内容。

         Menu设定的实现代码:

[java] view
plain
copy

  1. //菜单的加载  
  2.     @Override  
  3.     public boolean onCreateOptionsMenu(Menu menu){  
  4.         //加载点选择菜单  
  5.         SubMenu pointSubMenu=menu.addSubMenu("点");  
  6.         pointSubMenu.setHeaderTitle("选择绘制的点");  
  7.         pointSubMenu.add(000"图点");  
  8.         pointSubMenu.add(010"红点");  
  9.         pointSubMenu.add(020"蓝点");  
  10.         pointSubMenu.add(030"绿点");  
  11.         //加载线选择菜单  
  12.         SubMenu lineSubMenu=menu.addSubMenu("线");  
  13.         lineSubMenu.setHeaderTitle("选择绘制的线");  
  14.         lineSubMenu.add(1,0,0,"白线");  
  15.         lineSubMenu.add(110"红线");  
  16.         lineSubMenu.add(120"蓝虚线");  
  17.         lineSubMenu.add(130"黄粗线");  
  18.         //加载面选择菜单  
  19.         SubMenu gonMenu=menu.addSubMenu("面");  
  20.         gonMenu.setHeaderTitle("选择绘制的面");  
  21.         gonMenu.add(200"红面");  
  22.         gonMenu.add(210"绿面半透明");  
  23.         gonMenu.add(2,2,0,"蓝面虚线填充");  
  24.           
  25.         return super.onCreateOptionsMenu(menu);  
  26.     }  
  27.     //菜单项被单击的事件  
  28.     @Override  
  29.     public boolean onOptionsItemSelected(MenuItem mi){  
  30.         isChoose=true;  
  31.         //判断是在哪个groupid里面的  
  32.         switch (mi.getGroupId()) {  
  33.         case 0:  
  34.             drawType=Geometry.Type.POINT;  
  35.             switch (mi.getItemId()) {  
  36.                 case 0:  
  37.                         Drawable drawable=this.getResources().getDrawable(R.drawable.icon);  
  38.                         symbol=new PictureMarkerSymbol(drawable);  
  39.                     break;  
  40.                       
  41.                 case 1:  
  42.                     symbol=new SimpleMarkerSymbol(Color.RED, 14, SimpleMarkerSymbol.STYLE.CIRCLE);  
  43.                     break;  
  44.                       
  45.                 case 2:  
  46.                     symbol=new SimpleMarkerSymbol(Color.BLUE, 14, SimpleMarkerSymbol.STYLE.CIRCLE);  
  47.                     break;  
  48.                       
  49.                 case 3:  
  50.                     symbol=new SimpleMarkerSymbol(Color.GREEN, 14, SimpleMarkerSymbol.STYLE.CIRCLE);  
  51.                     break;  
  52.       
  53.                 default:  
  54.                     break;  
  55.             }  
  56.             break;  
  57.         case 1:  
  58.             drawType=Geometry.Type.POLYLINE;  
  59.             switch (mi.getItemId()) {  
  60.                 case 0:  
  61.                     symbol=new SimpleLineSymbol(Color.WHITE, 8, SimpleLineSymbol.STYLE.SOLID);  
  62.                     break;  
  63.                       
  64.                 case 1:  
  65.                     symbol=new SimpleLineSymbol(Color.RED, 8, SimpleLineSymbol.STYLE.SOLID);  
  66.                     break;  
  67.                       
  68.                 case 2:  
  69.                     symbol=new SimpleLineSymbol(Color.BLUE, 10, SimpleLineSymbol.STYLE.DASH);  
  70.                     break;  
  71.                       
  72.                 case 3:  
  73.                     symbol=new SimpleLineSymbol(Color.YELLOW, 18, SimpleLineSymbol.STYLE.SOLID);  
  74.                     break;  
  75.       
  76.                 default:  
  77.                     break;  
  78.             }  
  79.               
  80.             break;  
  81.         case 2:  
  82.             drawType=Geometry.Type.POLYGON;  
  83.             switch (mi.getItemId()) {  
  84.                 case 0:  
  85.                     fillSymbol=new SimpleFillSymbol(Color.RED, SimpleFillSymbol.STYLE.SOLID);  
  86.                     fillSymbol.setAlpha(100);  
  87.                     break;  
  88.                       
  89.                 case 1:  
  90.                     fillSymbol=new SimpleFillSymbol(Color.GREEN);  
  91.                     fillSymbol.setAlpha(50);  
  92.                     break;  
  93.                       
  94.                 case 2:  
  95.                     fillSymbol=new SimpleFillSymbol(Color.BLUE,SimpleFillSymbol.STYLE.BACKWARD_DIAGONAL);  
  96.                     fillSymbol.setAlpha(100);  
  97.                     break;  
  98.                       
  99.                 case 3:  
  100.                       
  101.                     break;  
  102.       
  103.                 default:  
  104.                     break;  
  105.             }  
  106.               
  107.             break;  
  108.           
  109.   
  110.         default:  
  111.             break;  
  112.         }  
  113.           
  114.           
  115.         return false;  
  116.           
  117.     }  

 界面效果为:

点击点的时候的效果:

点击线和点击面的效果差不多。

触碰监听的设定

         在Mapview中设定触碰监听,这样能够通过监听器来让系统完成绘制作用。我在这里这写一个类来继承MapOnTouchListener,重写单击事件来确定各个绘制。代码如下:

[java] view
plain
copy

  1. /** 
  2.      *  
  3.     * @ClassName: DrawGraphicTouchListener 
  4.     * @Description: 对触碰点击事件进行重写,使得能够进行绘制 
  5.     * @author David.Ocean david_ocean@163.com 
  6.     * @date 2013年10月30日 下午2:46:06 
  7.     * 
  8.      */  
  9.     public class DrawGraphicTouchListener extends MapOnTouchListener{  
  10. //      List<Point> pointsList=new ArrayList<Point>();  
  11.         Point ptStart=null;  
  12.         Point ptPrevious=null;  
  13.         Polygon polygon=null;  
  14.         public DrawGraphicTouchListener(Context context, MapView view) {  
  15.             super(context, view);  
  16.         }  
  17.         @Override  
  18.         public  boolean onSingleTap (MotionEvent point){  
  19.             if(isChoose==true){  
  20.                 ptPrevious=null;  
  21.                 ptStart=null;  
  22.                 polygon=null;  
  23.             }  
  24.             float x=point.getX();  
  25.             float y=point.getY();  
  26.             Point ptCurrent=map.toMapPoint(x,y);  
  27.             if (drawType==Geometry.Type.POINT) {  
  28.                 Graphic pGraphic=new Graphic(ptCurrent, symbol);  
  29.                 graphicsLayer.addGraphic(pGraphic);  
  30.             }  
  31.             else {  
  32. //              pointsList.add(ptCurrent);  
  33.                 if (ptStart==null) {  
  34.                     ptStart=ptCurrent;  
  35.                     Graphic pgraphic=new Graphic(ptStart,new SimpleMarkerSymbol(Color.RED, 8, SimpleMarkerSymbol.STYLE.CIRCLE));  
  36.                     graphicsLayer.addGraphic(pgraphic);  
  37.                 }  
  38.                 else {  
  39.                     Graphic pGraphic=new Graphic(ptCurrent,new SimpleMarkerSymbol(Color.RED, 8, SimpleMarkerSymbol.STYLE.CIRCLE));  
  40.                     graphicsLayer.addGraphic(pGraphic);  
  41.                     Line line=new Line();  
  42.                     line.setStart(ptPrevious);  
  43.                     line.setEnd(ptCurrent);  
  44.                     if(drawType==Geometry.Type.POLYLINE){  
  45.                         Polyline polyline=new Polyline();  
  46.                         polyline.addSegment(line, true);  
  47.                         Graphic iGraphic=new Graphic(polyline, symbol);  
  48.                         graphicsLayer.addGraphic(iGraphic);  
  49.                     }  
  50.                     else if (drawType==Geometry.Type.POLYGON) {  
  51.                         if(polygon==null){  
  52.                             polygon=new Polygon();  
  53.                         }  
  54.                         polygon.addSegment(line, false);  
  55.                         Graphic gGraphic=new Graphic(polygon, fillSymbol);  
  56.                         graphicsLayer.addGraphic(gGraphic);  
  57.                     }  
  58.                 }  
  59.             }  
  60.             ptPrevious=ptCurrent;  
  61.             isChoose=false;  
  62.             return false;  
  63.               
  64.         }  
  65.           
  66.     }  

在程序中的表现效果为:

代码说明:

在代码中,对于单击事件中,每按下一个点,就是屏幕中获取到的MotionEvent,这不是地图坐标系下的点,所以要经过转化,调用方法map.toMapPoint(x,y),这样就可以获得在地图上的点。

然后根据drawType来确定geometry的类型,从而确定应该执行的方法。对于点的操作,直接将geometry和symbol导入,形成graphic,然后添加到graphiclayer即可。

[java] view
plain
copy

  1. if (drawType==Geometry.Type.POINT) {  
  2.                 Graphic pGraphic=new Graphic(ptCurrent, symbol);  
  3.                 graphicsLayer.addGraphic(pGraphic);  
  4.             }  

如果是polyline和polygon的话,则需要设定line,并把其加入到polyline或者polygon中。

[java] view
plain
copy

  1. Line line=new Line();  
  2.                     line.setStart(ptPrevious);  
  3.                     line.setEnd(ptCurrent);  

判断之后,根据线或者面来分别处理。

[java] view
plain
copy

  1. if(drawType==Geometry.Type.POLYLINE){  
  2.                         Polyline polyline=new Polyline();  
  3.                         polyline.addSegment(line, true);  
  4.                         Graphic iGraphic=new Graphic(polyline, symbol);  
  5.                         graphicsLayer.addGraphic(iGraphic);  
  6.                     }  
  7.                     else if (drawType==Geometry.Type.POLYGON) {  
  8.                         if(polygon==null){  
  9.                             polygon=new Polygon();  
  10.                         }  
  11.                         polygon.addSegment(line, false);  
  12.                         Graphic gGraphic=new Graphic(polygon, fillSymbol);  
  13.                         graphicsLayer.addGraphic(gGraphic);  
  14.                     }  

其中,需要注意的是polygon不能在判断语句中初始化,因为他是由至少三个点才能组成一个面,所以需要在触碰监听类刚建立的时候进行初始化创建。

         在逻辑层判断的时候,当再次进行菜单选择的时候,则存储的点和polygon需要进行清空,那么就要一层逻辑判断。在菜单单击事件出,给boolean型的ischoose赋值,来进行判断。

[java] view
plain
copy

  1. public boolean onOptionsItemSelected(MenuItem mi){  
  2.         isChoose=true;  

那么在触碰监听的时候,则直接判断时候根据判断来确定是否清零。

[java] view
plain
copy

  1. public  boolean onSingleTap (MotionEvent point){  
  2.             if(isChoose==true){  
  3.                 ptPrevious=null;  
  4.                 ptStart=null;  
  5.                 polygon=null;  
  6.             }  

这样可以保证不会出现所有点都是连续的情况。

总结

         关于graphicLayer的设计和设定,首先要将Graphic进行设定。而70%工作就是将geometry和symbol的各个类型分配清楚,此为关键。然后在随后的触碰监听中,自己设定逻辑判断来使得各个graphic能够生成正确,并最终能够添加到graphicLayer中。

         在逻辑判断中,要记住,polyline和polygon的基本单位是line。调用addSegement()方法来添加。Polyline和polygon很多相似,但是要记住,一条线可以组成polyline但是不能组成polygon,所以要区别对待。

         菜单的使用上面,要设定清楚,往后的例子中,对菜单的使用会更多。

最后,将整个类的完整代码贴出来:

[java] view
plain
copy

  1. /* Copyright 2012 ESRI 
  2.  *  
  3.  * All rights reserved under the copyright laws of the United States 
  4.  * and applicable international laws, treaties, and conventions. 
  5.  *  
  6.  * You may freely redistribute and use this sample code, with or 
  7.  * without modification, provided you include the original copyright 
  8.  * notice and use restrictions. 
  9.  *  
  10.  * See the Sample code usage restrictions document for further information. 
  11.  *  
  12.  */  
  13. package com.esri.arcgis.android.samples.addlayer;  
  14.   
  15.   
  16. import android.app.Activity;  
  17. import android.content.Context;  
  18. import android.graphics.Color;  
  19. import android.graphics.drawable.Drawable;  
  20. import android.os.Bundle;  
  21. import android.view.Menu;  
  22. import android.view.MenuItem;  
  23. import android.view.MotionEvent;  
  24. import android.view.SubMenu;  
  25.   
  26. import com.esri.android.map.GraphicsLayer;  
  27. import com.esri.android.map.MapOnTouchListener;  
  28. import com.esri.android.map.MapView;  
  29. import com.esri.android.map.ags.ArcGISLocalTiledLayer;  
  30. import com.esri.core.geometry.Geometry;  
  31. import com.esri.core.geometry.Line;  
  32. import com.esri.core.geometry.Point;  
  33. import com.esri.core.geometry.Polygon;  
  34. import com.esri.core.geometry.Polyline;  
  35. import com.esri.core.map.Graphic;  
  36. import com.esri.core.symbol.PictureMarkerSymbol;  
  37. import com.esri.core.symbol.SimpleFillSymbol;  
  38. import com.esri.core.symbol.SimpleLineSymbol;  
  39. import com.esri.core.symbol.SimpleMarkerSymbol;  
  40. import com.esri.core.symbol.Symbol;  
  41.   
  42. /** 
  43.  * Adds a layer statically and dynamically and toggles the visibility of top layer  
  44.  * with a single tap  
  45.  * 
  46.  */  
  47. public class AddLayer extends Activity {  
  48.       
  49.       
  50.   
  51.     private MapView map = null;  
  52.       
  53.     //Dynamic layer URL from ArcGIS online  
  54. /*  String dynamicMapURL =  
  55.             "http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Specialty/ESRI_StateCityHighway_USA/MapServer"; 
  56.     ArcGISTiledMapServiceLayer basemap; 
  57.     ArcGISDynamicMapServiceLayer dynamicLayer;*/  
  58.     private GraphicsLayer graphicsLayer;  
  59.     //  设定绘制的类型  
  60.     private Geometry.Type drawType=null;  
  61.     private Symbol symbol=null;  
  62.     private SimpleFillSymbol fillSymbol=null;  
  63.     //判断是否发生菜单选择事件  
  64.     private boolean isChoose;  
  65.   
  66.       
  67.     @Override  
  68.     public void onCreate(Bundle savedInstanceState) {  
  69.         super.onCreate(savedInstanceState);  
  70.         setContentView(R.layout.main);  
  71.           
  72.         // Retrieve the map and initial extent from XML layout  
  73.         map = (MapView)findViewById(R.id.map);  
  74.         /*map.addLayer(new ArcGISDynamicMapServiceLayer( 
  75.                 "http://services.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer"));*/  
  76.         /*basemap = new ArcGISTiledMapServiceLayer(this.getResources().getString( 
  77.                 R.string.basemap_url)); 
  78.         map.addLayer(basemap); 
  79.         */  
  80.         /*dynamicLayer = new ArcGISDynamicMapServiceLayer(this.getResources() 
  81.                 .getString(R.string.dynamiclayer_url)); 
  82.         map.addLayer(dynamicLayer);*/  
  83.         //Creates a dynamic layer using service URL   
  84.     /*  ArcGISDynamicMapServiceLayer dynamicLayer = new ArcGISDynamicMapServiceLayer(dynamicMapURL); 
  85.         //Adds layer into the 'MapView' 
  86.         map.addLayer(dynamicLayer);*/  
  87.           
  88.         //加载在线切片地图  
  89.         /*ArcGISTiledMapServiceLayer tiledMapServiceLayer=new ArcGISTiledMapServiceLayer( 
  90.                  "http://services.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer"); 
  91.         map.addLayer(tiledMapServiceLayer);*/  
  92.           
  93.         //加载离线切片地图  
  94.         ArcGISLocalTiledLayer localtitleLayer=new ArcGISLocalTiledLayer("file:///mnt/sdcard/basemap/东直门.tpk");  
  95.         map.addLayer(localtitleLayer);  
  96.           
  97.           
  98.         //加载在线矢量地图  
  99.         /*ArcGISFeatureLayer featureLayer=new ArcGISFeatureLayer("http://192.168.112.112:6080/arcgis/rest" 
  100.                 + "/services/Feature/edit_polygon/MapServer/0", MODE.SNAPSHOT); 
  101.         map.addLayer(featureLayer);*/  
  102.           
  103.         //设定用户进入许可  
  104.         /*UserCredentials creds = new UserCredentials(); 
  105.         creds.setUserAccount("rick", "rick@esri"); 
  106.          
  107.         //加载在线需验证的矢量地图 
  108.         ArcGISFeatureLayer secureFeatureLayer = new ArcGISFeatureLayer("https://servicesbeta.esri.com/ArcGIS/rest" 
  109.                 + "/services/SanJuan/ColoradoCounties/MapServer/0", 
  110.                 MODE.SNAPSHOT,creds);                                               
  111.         map.addLayer(secureFeatureLayer);*/  
  112.         //setContentView(map);  
  113.         map.enableWrapAround(true);  
  114.         map.setEsriLogoVisible(true);  
  115.         //加载graphiclayer  
  116.         graphicsLayer=new GraphicsLayer();  
  117.         map.addLayer(graphicsLayer);  
  118.         //设定绘制的监听事件,让其能够绘制  
  119.         DrawGraphicTouchListener drawgraphictouchlistener=new DrawGraphicTouchListener(this,map);  
  120.         map.setOnTouchListener(drawgraphictouchlistener);  
  121.     }  
  122.     //菜单的加载  
  123.     @Override  
  124.     public boolean onCreateOptionsMenu(Menu menu){  
  125.         //加载点选择菜单  
  126.         SubMenu pointSubMenu=menu.addSubMenu("点");  
  127.         pointSubMenu.setHeaderTitle("选择绘制的点");  
  128.         pointSubMenu.add(000"图点");  
  129.         pointSubMenu.add(010"红点");  
  130.         pointSubMenu.add(020"蓝点");  
  131.         pointSubMenu.add(030"绿点");  
  132.         //加载线选择菜单  
  133.         SubMenu lineSubMenu=menu.addSubMenu("线");  
  134.         lineSubMenu.setHeaderTitle("选择绘制的线");  
  135.         lineSubMenu.add(1,0,0,"白线");  
  136.         lineSubMenu.add(110"红线");  
  137.         lineSubMenu.add(120"蓝虚线");  
  138.         lineSubMenu.add(130"黄粗线");  
  139.         //加载面选择菜单  
  140.         SubMenu gonMenu=menu.addSubMenu("面");  
  141.         gonMenu.setHeaderTitle("选择绘制的面");  
  142.         gonMenu.add(200"红面");  
  143.         gonMenu.add(210"绿面半透明");  
  144.         gonMenu.add(2,2,0,"蓝面虚线填充");  
  145.           
  146.         return super.onCreateOptionsMenu(menu);  
  147.     }  
  148.     //对菜单的点击事件  
  149.     //菜单项被单击的事件  
  150.     @Override  
  151.     public boolean onOptionsItemSelected(MenuItem mi){  
  152.         isChoose=true;  
  153.         //判断是在哪个groupid里面的  
  154.         switch (mi.getGroupId()) {  
  155.         case 0:  
  156.             drawType=Geometry.Type.POINT;  
  157.             switch (mi.getItemId()) {  
  158.                 case 0:  
  159.                         Drawable drawable=this.getResources().getDrawable(R.drawable.icon);  
  160.                         symbol=new PictureMarkerSymbol(drawable);  
  161.                     break;  
  162.                       
  163.                 case 1:  
  164.                     symbol=new SimpleMarkerSymbol(Color.RED, 14, SimpleMarkerSymbol.STYLE.CIRCLE);  
  165.                     break;  
  166.                       
  167.                 case 2:  
  168.                     symbol=new SimpleMarkerSymbol(Color.BLUE, 14, SimpleMarkerSymbol.STYLE.CIRCLE);  
  169.                     break;  
  170.                       
  171.                 case 3:  
  172.                     symbol=new SimpleMarkerSymbol(Color.GREEN, 14, SimpleMarkerSymbol.STYLE.CIRCLE);  
  173.                     break;  
  174.       
  175.                 default:  
  176.                     break;  
  177.             }  
  178.             break;  
  179.         case 1:  
  180.             drawType=Geometry.Type.POLYLINE;  
  181.             switch (mi.getItemId()) {  
  182.                 case 0:  
  183.                     symbol=new SimpleLineSymbol(Color.WHITE, 8, SimpleLineSymbol.STYLE.SOLID);  
  184.                     break;  
  185.                       
  186.                 case 1:  
  187.                     symbol=new SimpleLineSymbol(Color.RED, 8, SimpleLineSymbol.STYLE.SOLID);  
  188.                     break;  
  189.                       
  190.                 case 2:  
  191.                     symbol=new SimpleLineSymbol(Color.BLUE, 10, SimpleLineSymbol.STYLE.DASH);  
  192.                     break;  
  193.                       
  194.                 case 3:  
  195.                     symbol=new SimpleLineSymbol(Color.YELLOW, 18, SimpleLineSymbol.STYLE.SOLID);  
  196.                     break;  
  197.       
  198.                 default:  
  199.                     break;  
  200.             }  
  201.               
  202.             break;  
  203.         case 2:  
  204.             drawType=Geometry.Type.POLYGON;  
  205.             switch (mi.getItemId()) {  
  206.                 case 0:  
  207.                     fillSymbol=new SimpleFillSymbol(Color.RED, SimpleFillSymbol.STYLE.SOLID);  
  208.                     fillSymbol.setAlpha(100);  
  209.                     break;  
  210.                       
  211.                 case 1:  
  212.                     fillSymbol=new SimpleFillSymbol(Color.GREEN);  
  213.                     fillSymbol.setAlpha(50);  
  214.                     break;  
  215.                       
  216.                 case 2:  
  217.                     fillSymbol=new SimpleFillSymbol(Color.BLUE,SimpleFillSymbol.STYLE.BACKWARD_DIAGONAL);  
  218.                     fillSymbol.setAlpha(100);  
  219.                     break;  
  220.                       
  221.                 case 3:  
  222.                       
  223.                     break;  
  224.       
  225.                 default:  
  226.                     break;  
  227.             }  
  228.               
  229.             break;  
  230.           
  231.   
  232.         default:  
  233.             break;  
  234.         }  
  235.           
  236.           
  237.         return false;  
  238.           
  239.     }  
  240.       
  241.       
  242.       
  243.     @Override  
  244.     protected void onPause() {  
  245.         super.onPause();  
  246.         map.pause();  
  247.  }  
  248.       
  249.     @Override  
  250.     protected void onResume() {  
  251.         super.onResume();   
  252.         map.unpause();  
  253.     }     
  254.     /** 
  255.      *  
  256.     * @ClassName: DrawGraphicTouchListener 
  257.     * @Description: 对触碰点击事件进行重写,使得能够进行绘制 
  258.     * @author David.Ocean david_ocean@163.com 
  259.     * @date 2013年10月30日 下午2:46:06 
  260.     * 
  261.      */  
  262.     public class DrawGraphicTouchListener extends MapOnTouchListener{  
  263. //      List<Point> pointsList=new ArrayList<Point>();  
  264.         Point ptStart=null;  
  265.         Point ptPrevious=null;  
  266.         Polygon polygon=null;  
  267.         public DrawGraphicTouchListener(Context context, MapView view) {  
  268.             super(context, view);  
  269.         }  
  270.         @Override  
  271.         public  boolean onSingleTap (MotionEvent point){  
  272.             if(isChoose==true){  
  273.                 ptPrevious=null;  
  274.                 ptStart=null;  
  275.                 polygon=null;  
  276.             }  
  277.             float x=point.getX();  
  278.             float y=point.getY();  
  279.             Point ptCurrent=map.toMapPoint(x,y);  
  280.             if (drawType==Geometry.Type.POINT) {  
  281.                 Graphic pGraphic=new Graphic(ptCurrent, symbol);  
  282.                 graphicsLayer.addGraphic(pGraphic);  
  283.             }  
  284.             else {  
  285.                 if (ptStart==null) {  
  286.                     ptStart=ptCurrent;  
  287.                     Graphic pgraphic=new Graphic(ptStart,new SimpleMarkerSymbol(Color.RED, 8, SimpleMarkerSymbol.STYLE.CIRCLE));  
  288.                     graphicsLayer.addGraphic(pgraphic);  
  289.                 }  
  290.                 else {  
  291.                     Graphic pGraphic=new Graphic(ptCurrent,new SimpleMarkerSymbol(Color.RED, 8, SimpleMarkerSymbol.STYLE.CIRCLE));  
  292.                     graphicsLayer.addGraphic(pGraphic);  
  293.                     Line line=new Line();  
  294.                     line.setStart(ptPrevious);  
  295.                     line.setEnd(ptCurrent);  
  296.                     if(drawType==Geometry.Type.POLYLINE){  
  297.                         Polyline polyline=new Polyline();  
  298.                         polyline.addSegment(line, true);  
  299.                         Graphic iGraphic=new Graphic(polyline, symbol);  
  300.                         graphicsLayer.addGraphic(iGraphic);  
  301.                     }  
  302.                     else if (drawType==Geometry.Type.POLYGON) {  
  303.                         if(polygon==null){  
  304.                             polygon=new Polygon();  
  305.                         }  
  306.                         polygon.addSegment(line, false);  
  307.                         Graphic gGraphic=new Graphic(polygon, fillSymbol);  
  308.                         graphicsLayer.addGraphic(gGraphic);  
  309.                     }  
  310.                 }  
  311.             }  
  312.             ptPrevious=ptCurrent;  
  313.             isChoose=false;  
  314.             return false;  
  315.               
  316.         }  
  317.           
  318.     }  
  319.   
  320. }  

可通过http://download.csdn.net/detail/david_ocean/6477961来下载该程序和离线切片地图。

-----2013.10.30

-----David.Ocean

抱歉!评论已关闭.