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. 添加win10激活工具

    其实我们可以随便准备一个win10的激活密钥激活! 以管理员的身份进入到CMD下.. slmgr.vbs /upk                清除掉旧的slmgr /ipk W269N-WFGWX ...

  2. centos 安装搜狗

    原文:https://www.cnblogs.com/blueherb/p/9521827.html 1.通过centos的搜狐到百度下载linux fo sougou 注:找到下载路径(定义为A) ...

  3. springboot配置文件的所有属性

    转载:https://blog.csdn.net/qq_28929589/article/details/79439795 # spring boot application.properties配置 ...

  4. 在 Domoticz 中添加插座开关

    前言 继上一篇的折腾,将 WiFi 插座刷为 ESPEasy,这次介绍一下在 Domoticz 中启用该插座的方法 步骤 在 Domoticz 控制台,设置 → 硬件中添加 Dummy,名称为&quo ...

  5. 多气体组分DEM流动的DMP并行内存错误

    今天踩到一个坑.调DEM反应的时候,气体需要设置为多组分,这时就不能用 DES_INTERP_ON = .T. DES_INTERP_SCHEME = 'GARG_2012' 这个差值格式了,否则DM ...

  6. [WC2008]游览计划(斯坦纳树)

    [Luogu4294] 题解 : 斯坦纳树 \(dp[i][j]\) 表示以\(i\)号节点为根,当前状态为\(j\)(与\(i\)连通的点为\(1\)) 当根\(i\)不改变时状态转移方程是: \( ...

  7. HDU - 5050 (大数二进制gcd)

    It's time to fight the local despots and redistribute the land. There is a rectangular piece of land ...

  8. naginx安装入门

    一.nginx是什么 nginx是一个开源的,支持高性能,高并发的www服务和代理服务软件.它是一个俄罗斯人lgor sysoev开发的,作者将源代码开源出来供全球使用. nginx比它大哥apach ...

  9. 剑指offer——面试题11:旋转数组的最小数字

    #include"iostream" using namespace std; int GetMinNumber(int *data,int len) { ,right=len-, ...

  10. 剑指offer——面试题5:替换空格

    利用STL: #include"iostream" #include"stdio.h" #include"algorithm" using ...