1、前言

移动GIS项目开发中点线面的要素绘制及编辑是最常用的操作,在ArcGIS Runtime SDK for iOS 自带AGSSketchLayer类可以帮助用户快速实现要素的绘制,图形编辑。但是在ArcGIS Runtime SDK for Android的版本中并没有提供类似的功能,实现过程相对较复杂。(10.2.8及以下版本需要用户自定义扩展实现,通过扩展MapOnTouchListener类实现,Quartz版SDK默认自带)

之前有大神gispace封装了DrawTools2.0工具类DEMO,实现了简单的要素绘制。但是并没有对要素绘制及编辑状态做很好的体现,如节点,回退操作等。所以鉴于此,我在DrawTools2.0工具类基础上扩展实现了DrawTools3.0,该版本能够实现基本点线面要素的绘制,精细化展现节点变化信息,支持加点,删点,移点操作。

DrawTools2.0地址:http://blog.csdn.net/gispace/article/details/6723459

转载请注明出处:http://www.cnblogs.com/gis-luq/p/5857661.html

2、使用说明

DrawTools3.0基于DrawTools2.0扩展开发而来,使用思路基本一致,增加节点增加、节点删除、回退操作,要素编辑状态开启与关闭操作。

开源项目库地址:http://git.oschina.net/gis-luq/DrawTool3.0

使用流程

  1. 初始化DrawTool工具。
  2. 使用Activity扩展DrawEventListener ,并将当前Activity设置为DrawTool的Listener。
  3. 实现DrawEventListener中的handleDrawEvent方法。
  4. 使用DrawTool工具绘制图形。

MainActivity.java

package com.gis_luq.drawtoolsdemo;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle; import android.widget.Button; import com.esri.android.map.GraphicsLayer;
import com.esri.android.map.MapOnTouchListener;
import com.esri.android.map.MapView;
import com.esri.android.map.ags.ArcGISTiledMapServiceLayer;
import com.esri.core.map.Graphic;
import com.esri.core.table.TableException;
import com.gis_luq.lib.Draw.DrawEvent;
import com.gis_luq.lib.Draw.DrawEventListener;
import com.gis_luq.lib.Draw.DrawTool; import java.io.FileNotFoundException; public class MainActivity extends Activity implements DrawEventListener { private Context context;
private MapView mapView = null;
private ArcGISTiledMapServiceLayer arcGISTiledMapServiceLayer = null;
private GraphicsLayer graphicsLayer = null; private Graphic selectGraphic = null;
private DrawTool drawTool; public MapOnTouchListener mapDefaultOnTouchListener;//默认点击事件
public DrawEventListener drawEventListener;//要素绘制点击事件 @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); context = this; this.mapView = (MapView)this.findViewById(R.id.map);//设置UI和代码绑定 String strMapUrl="http://map.geoq.cn/ArcGIS/rest/services/ChinaOnlineCommunity/MapServer";
this.arcGISTiledMapServiceLayer = new ArcGISTiledMapServiceLayer(strMapUrl);
this.mapView.addLayer(arcGISTiledMapServiceLayer); graphicsLayer = new GraphicsLayer();
this.mapView.addLayer(graphicsLayer); // 初始化DrawTool实例
this.drawTool = new DrawTool(this.mapView);
// 将本Activity设置为DrawTool实例的Listener
this.drawTool.addEventListener(this); //设置地图事件
mapDefaultOnTouchListener = new MapOnTouchListener(this.mapView.getContext(), this.mapView);
drawEventListener = this; ToolsOnClickListener toolsOnClickListener = new ToolsOnClickListener(context,drawTool,selectGraphic,mapView);
Button btnDrawPoint = (Button)this.findViewById(R.id.btnDrawPoint);
btnDrawPoint.setOnClickListener(toolsOnClickListener); Button btnDrawPolyline = (Button)this.findViewById(R.id.btnDrawPolyline);
btnDrawPolyline.setOnClickListener(toolsOnClickListener); Button btnDrawFreePolyline = (Button)this.findViewById(R.id.btnDrawFreePolyline);
btnDrawFreePolyline.setOnClickListener(toolsOnClickListener); Button btnDrawPolygon = (Button)this.findViewById(R.id.btnDrawPolygon);
btnDrawPolygon.setOnClickListener(toolsOnClickListener); Button btnDrawFreePolygon = (Button)this.findViewById(R.id.btnDrawFreePolygon);
btnDrawFreePolygon.setOnClickListener(toolsOnClickListener); Button btnDrawCircle = (Button)this.findViewById(R.id.btnDrawCircle);
btnDrawCircle.setOnClickListener(toolsOnClickListener); Button btnDrawEnvlope = (Button)this.findViewById(R.id.btnDrawEnvlope);
btnDrawEnvlope.setOnClickListener(toolsOnClickListener); Button btnDrawEditor = (Button)this.findViewById(R.id.btnDrawSave);
btnDrawEditor.setOnClickListener(toolsOnClickListener); Button btnDrawUndo = (Button)this.findViewById(R.id.btnDrawUndo);
btnDrawUndo.setOnClickListener(toolsOnClickListener); Button btnDrawDeleteNode = (Button)this.findViewById(R.id.btnDrawDeleteNode);
btnDrawDeleteNode.setOnClickListener(toolsOnClickListener); } @Override
public void handleDrawEvent(DrawEvent event) throws TableException, FileNotFoundException {
// 将画好的图形(已经实例化了Graphic),添加到drawLayer中并刷新显示
this.graphicsLayer.addGraphic(event.getDrawGraphic());
// 修改点击事件为默认
this.mapView.setOnTouchListener(mapDefaultOnTouchListener);
}
}

ToolsOnClickListener.java

package com.gis_luq.drawtoolsdemo;

import android.content.Context;
import android.view.View; import com.esri.android.map.MapView;
import com.esri.core.map.Graphic;
import com.gis_luq.lib.Draw.DrawTool; /**
* 绘图点击事件
* Created by gis-luq on 2016/1/2.
*/
public class ToolsOnClickListener implements View.OnClickListener { private Context context = null;
private DrawTool drawTool = null;
private Graphic selectGraphic =null;
private MapView mapView = null; public ToolsOnClickListener(Context context, DrawTool drawTool, Graphic selectGraphic, MapView mapView) {
this.context = context;
this.drawTool = drawTool;
this.selectGraphic = selectGraphic;
this.mapView = mapView;
} @Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btnDrawPoint://绘制点
drawTool.activate(DrawTool.POINT);
break;
case R.id.btnDrawPolyline://绘制线
drawTool.activate(DrawTool.POLYLINE);
break;
case R.id.btnDrawFreePolyline://绘制流状线
drawTool.activate(DrawTool.FREEHAND_POLYLINE);
break;
case R.id.btnDrawPolygon://绘制面
drawTool.activate(DrawTool.POLYGON);
break;
case R.id.btnDrawFreePolygon://绘制流状面
drawTool.activate(DrawTool.FREEHAND_POLYGON);
break;
case R.id.btnDrawCircle://绘制圆
drawTool.activate(DrawTool.CIRCLE);
break;
case R.id.btnDrawEnvlope://绘制矩形
drawTool.activate(DrawTool.ENVELOPE);
break;
case R.id.btnDrawSave://保存
drawTool.sendDrawEndEvent();
break;
case R.id.btnDrawUndo://回退
drawTool.actionUndo();
break;
case R.id.btnDrawDeleteNode://删除节点
drawTool.actionDelete();
break;
} }
}

《ArcGIS Runtime SDK for Android开发笔记》——(15)、要素绘制Drawtools3.0工具DEMO的更多相关文章

  1. 《ArcGIS Runtime SDK for Android开发笔记》

    开发笔记之基础教程 ArcGIS Runtime SDK for Android 各版本下载地址 <ArcGIS Runtime SDK for Android开发笔记>——(1).And ...

  2. 《ArcGIS Runtime SDK for Android开发笔记》——离在线一体化技术:概述

    1.前言 数据生产和数据展示是常见的两大专业级移动GIS应用场景,这里我们针对数据生产环节的ArcGIS的离在线一体化技术给大家做一个基本的介绍和梳理. 使用ArcGIS离在线一体化技术首先需要以下基 ...

  3. 《ArcGIS Runtime SDK for Android开发笔记》——离在线一体化技术:离线矢量数据同步

    1.前言 上一篇文章中我们实现了离线要素的编辑操作,这一篇中主要介绍离在线一体化技术中最后一个环节离线数据的同步功能,通过对数据的上传,服务器端的版本化管理,实现数据生产管理的整个流程. 转载请注明出 ...

  4. 《ArcGIS Runtime SDK for Android开发笔记》——(7)、示例代码arcgis-runtime-samples-android的使用

    1.前言 学习ArcGIS Runtime SDK开发,其实最推荐的学习方式是直接看官方的教程.示例代码和帮助文档,因为官方的示例一般来说都是目前技术最新,也是最详尽的.对于ArcGIS Runtim ...

  5. 《ArcGIS Runtime SDK for Android开发笔记》——(6)、基于Android Studio的ArcGIS Android工程结构解析

    1.前言 Android Studio 是第一个Google官方的 Android 开发环境.其他工具,例如 Eclipse,在 Android Studio 发布之前已经有了大规模的使用.为了帮助开 ...

  6. 《ArcGIS Runtime SDK for Android开发笔记》——(5)、基于Android Studio构建ArcGIS Android开发环境(离线部署)(转)

    1.前言 在上一篇的内容里我们介绍了基于Android Studio构建ArcGIS Runtime SDK for Android开发环境的基本流程,流程中我们采用的是基于Gradle的构建方式,在 ...

  7. 《ArcGIS Runtime SDK for Android开发笔记》——(9)、空间数据的容器-地图MapView

    1.前言 在上一篇内容里介绍了 关于ArcGIS Android开发的未来(“Quartz”版Beta)相关内容,期间也提到了关于API接口的重构,开发思路的调整,根据2015UC资料也可以知道新版预 ...

  8. 《ArcGIS Runtime SDK for Android开发笔记》——(4)、基于Android Studio构建ArcGIS Android开发环境

    1.前言 2015年1月15日,发布ArcGIS Runtime SDK for Android v10.2.5版本.从该版本开始默认支持android studio开发环境,示例代码的默认开发环境也 ...

  9. 《ArcGIS Runtime SDK for Android开发笔记》——(3)、ArcGIS Runtime SDK概述

    1.前言 ArcGIS Runtime SDK是一整套用于构建原生及跨平台的地图应用程序的开发包,包括移动设备的Android.iOS.Windows Phone,针对桌面的.Net.Java.OSX ...

随机推荐

  1. python学习,day2:列表的复制

    主要涉及列表的潜复制(第二层受后面修改的影响)和深复制(不受后面修改的影响) 代码如下 # coding=utf-8 # Author: RyAn Bi import copy names = ['A ...

  2. D3.js v4版本 按住shift键框选节点demo

    http://download.csdn.net/download/qq_25042329/10139649

  3. (转)关于INF为0x3f3f3f3f

    转自https://blog.csdn.net/jiange_zh/article/details/50198097 在算法竞赛中,我们常常需要用到一个“无穷大”的值,对于我来说,大多数时间我会根据具 ...

  4. input type=checkbox的值后台怎么接受

    input type=checkbox的值是on或off 实体类中这样写即可 public void setChapterVisibility(Object chapterVisibility) { ...

  5. Java中使用nextLine(); 没有输入就自动跳过的问题

    转自:https://www.cnblogs.com/1020182600HENG/p/6564795.html [问题分析] 必要的知识:in.nextLine();不能放在in.nextInt() ...

  6. 学习总结——docker

    1.docker 配置 docker 安装 docker 修改默认存储位置 docker 命令详解(run篇) docker 命令详解(cp篇) 2.docker 镜像相关资料 docker 把容器c ...

  7. 读《NoSQL精粹》前三章有感

    现在NoSQL很流行,所以买了一本这方面的书,这本书虽然很薄 156页,但是感觉的确是大师的经验之谈,对于自己经验还是很少.无法能完全能心领神会,大师所说的,就像一个人说药苦,你没吃过.再听别人描述也 ...

  8. jquery返回顶部和底部插件和解决ie6下fixed插件

    (function($){ //返回顶部和底部插件 $.fn.extend({ goTopBootom:function (options){ //默认参数 var defaults = { &quo ...

  9. Android开发_如何调用系统默认浏览器访问

    Android开发_如何调用系统默认浏览器访问 2015-10-20 17:53 312人阅读  http://blog.sina.com.cn/s/blog_6efce07e010142w7.htm ...

  10. lua 遍历table

    lua中有四种主要的遍历一个table的方法. 第一种方法: for key, value in pairs(testtb) do xxxx end 这种方法是按照key哈希后的顺序遍历的.比如下面代 ...