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. .net mvc 框架实现后台管理系统4-layedit使用

    做个简单的文章发布,使用了layui的layedit 效果: 在html页面添加: <textarea id="MyArticleContent" style="d ...

  2. Qt 学习之路 2(70):进程间通信

    Qt 学习之路 2(70):进程间通信 豆子 2013年11月12日 Qt 学习之路 2 16条评论 上一章我们了解了有关进程的基本知识.我们将进程理解为相互独立的正在运行的程序.由于二者是相互独立的 ...

  3. FTP 两种连接模式

    简介 FTP协议要用到两个TCP连接, 一个是命令连接,用来在FTP客户端与服务器之间传递命令:另一个是数据连接,用来上传或下载数据.通常21端口是命令端口,20端口是数据端口.当混入主动/被动模式的 ...

  4. git 下载 安装

    1.下载Git,官网地址:https://git-scm.com/,进入官网首页 在右下方的显示器中找到最新的版本下载,点击下载,跳转到下载页面 下载完成 2.安装Git 双击刚刚下载完成的安装文件, ...

  5. P2801 教主的魔法

    传送门 $N$ 太大了主席树过不了 考虑分块 对每个块内的元素排序,询问就对大块二分查找,对两边小的部分暴力枚举 修改时维护 $add[i]$ 标记,维护当前块内整块已经加的数 那么整块的就直接修改 ...

  6. linux系统编程之(一) 信号量

    信号量 一.什么是信号量 信号量的使用主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程)所拥有. 信号量的值为正的时候,说明它空闲.所测试的线程可以锁定而使用它.若为0,说明 它被占用,测 ...

  7. TensorFlow-简单的卷积神经网络

    先弄懂卷积神经网络的原理,推荐这两篇博客:http://blog.csdn.net/yunpiao123456/article/details/52437794   http://blog.csdn. ...

  8. 金融量化分析-python量化分析系列之---使用python获取股票历史数据和实时分笔数据

    财经数据接口包tushare的使用(一) Tushare是一款开源免费的金融数据接口包,可以用于获取股票的历史数据.年度季度报表数据.实时分笔数据.历史分笔数据,本文对tushare的用法,已经存在的 ...

  9. GreenPlum 大数据平台--备份-邮件配置-gpcrondump & gpdbrestore(五)

    01,备份 生成备份数据库 [gpadmin@greenplum01 ~]$ gpcrondump -l /gpbackup/back2/gpcorndump.log -x postgres -v [ ...

  10. Angular4+NodeJs+MySQL 入门-05 接口调用

    接口调用 今天讲一下,如果在前端页面上通过调用后台接口,返回来的数据.把前面的几章结合起来. 这里所有用的代码在 https://github.com/xiaotuni/angular-map-htt ...