MAPZONE GIS SDK接入Openlayers3之五——图形编辑工具
图形编辑工具提供对要素图形进行增、删、改的功能,具体包括以下几种工具类型:
- 浏览工具
- 选择工具
- 创建要素工具
- 删除命令
- 分割工具
- 合并命令
- 节点编辑工具
- 修边工具
- 撤销命令
- 重做命令
工具的实现基本上是基于ol.interation来实现的,只不过做了组合、结果处理等实现。分割工具效果图如下:

实现思路:
1.通过工具管理器进行工具间切换等统一调度
2.每个工具通过SetActive方法实现该工具的启动、卸载逻辑
3.每个工具维护自己的光标状态、辅助工具栏和交互处理逻辑
线分割示例代码:
'use strict';
var mzToolType = require('./mzToolEnum');
var ToolManager = require('./mzToolManager.js');
var mzFormat = require('./../Format');
var mzSpatialanylize = require('./../../MAPZONE JavaScript SDK/mzGeometry/mzSpatialanylize.js');
var mzOperationGroup = require('./../mzUndoRedo/mzOperationGroup.js');
var mzSelectManager = require('./mzSelectManager.js'); module.exports = mzSplitTool; function mzSplitTool(opt_options) {
var options = opt_options || {};
if (undefined == options.map)
return;
this.type = mzToolType.mzToolType.MZ_SPLIT_TOOL;
this.name = options.name !== undefined ? options.name : '线分割';
this.interaction = new ol.interaction.Draw({
type: 'LineString'
}); options.map.addInteraction(this.interaction);
this.interaction.setActive(false); //初始化辅助工具栏
this.mainbar = new ol.control.Bar();
this.initAssistantToolbar();
this.active = false;
} mzSplitTool.prototype.drawendfuntion = function (e) {
var manager = ToolManager.getToolManager();
var selectTool = manager.getTool('选择'); var lineString = e.feature.getGeometry(); var SelectManager = mzSelectManager.getSelectManager();
var fts = SelectManager.getSelectFs();
if (fts.length < 1) {
Materialize.toast("请至少选择一个要素!", 2000);
return;
}
var undoredoManager = selectTool.interaction.map_.undoredoManager;
undoredoManager.beginTrans(new mzOperationGroup()); for (var i = 0; i < fts.length; i++) {
var source = fts[i].vector;
var nSrid = source.getSrid(); var polygon = mzFormat.olGeo2mzGeo(fts[i].feature.getGeometry());
polygon.setSRID(nSrid); var path = mzFormat.olGeo2mzGeo(lineString);
path.setSRID(nSrid); var tolarence = polygon.getTolerance();
var geoSet = mzSpatialanylize.cut(polygon, path, tolarence);
var nCount = geoSet.getGeometryCount(); for (var j = 0; j < nCount; j++) {
var geo = geoSet.getGeometry(j);
if (0 == j) {
source.updateGeometry(fts[i].feature, mzFormat.mzGeo2olGeo(geo), undoredoManager);
}
else {
var feature = new ol.Feature();
feature.setId(-1);
feature.setProperties(fts[i].feature.getProperties());
feature.setGeometry(mzFormat.mzGeo2olGeo(geo));
source.addFeature(feature, undoredoManager);
}
}
}
undoredoManager.endTrans(); selectTool.clear(); selectTool.interaction.map_.customRefresh();
} mzSplitTool.prototype.setActive = function (active) { if (active == this.active)
return;
if (undefined == this.interaction)
return;
var manager = ToolManager.getToolManager();
var selectTool = manager.getTool('选择'); var SelectManager = mzSelectManager.getSelectManager();
var fts = SelectManager.getSelectFs(); if (fts.length < 1 && active) {
Materialize.toast("请至少选择一个要素!", 2000);
active = false;
} if (active) {
manager.unLoadTool({
tool: this
});
this.setCursor();
}
this.interaction.setActive(active);
if (active) {
this.interaction.on('drawend', this.drawendfuntion, this); //加载辅助工具栏
this.interaction.map_.addControl(this.mainbar);
}
else {
this.interaction.un('drawend', this.drawendfuntion, this); //卸载辅助工具栏
this.interaction.map_.removeControl(this.mainbar); } this.active = active;
} mzSplitTool.prototype.getActive = function () {
return this.active;
} mzSplitTool.prototype.setCursor = function (opt_options) {
var options = opt_options || {};
var cursor = options.cursor;
document.getElementById("map").style.cursor = cursor == undefined ? "crosshair" : cursor;
} mzSplitTool.prototype.initAssistantToolbar = function () { // Edit control bar
var editbar = new ol.control.Bar(
{
toggleOne: true, // one control active at the same time
group: false // group controls together
});
this.mainbar.addControl(editbar); //完成线分割
var finishDrawing = new ol.control.TextButton(
{
html: '<i class="fa fa-check"></i>',
title: "完成",
handleClick: function () {
var ToolManager = require('../../mapzone-ol3-plugin/mzTool/mzToolManager.js');
var manager = ToolManager.getToolManager(this.map_);
manager.getTool('线分割').interaction.finishDrawing();
}
}); editbar.addControl(finishDrawing); //取消线分割
var cancleDrawing = new ol.control.TextButton(
{
html: '<i class="fa fa-times"></i>',
title: "取消",
handleClick: function () {
var ToolManager = require('../../mapzone-ol3-plugin/mzTool/mzToolManager.js');
var manager = ToolManager.getToolManager(this.map_);
manager.getTool('线分割').interaction.abortDrawing_();
}
}); editbar.addControl(cancleDrawing);
}
撤销重做实现逻辑:
1)将撤销重做内容抽象成原子操作,可以执行do、undo、redo方法
2)实现撤销重做管理器,根据需要将原子操作执行入栈、出栈等逻辑
3)为数据库的增、删、改实现撤销重做原子操作,例如增的do和redo实现就是将Feature保存到数据库中,undo是将该Feature从数据库中删除
4)实现撤销重做原子操作组,像分割这样执行多次数据库增删改的工具,可以一次撤销、一次重做
MAPZONE GIS SDK接入Openlayers3之五——图形编辑工具的更多相关文章
- MAPZONE GIS SDK接入Openlayers3之一——矢量数据集接入
在选择开源前端GIS框架的时候,定下来MapBox和Openlayers3.起初被MapBox美观的地图显示效果所吸引,研究后发现其实现机制与MAPZONE GIS SDK相差深远,不如Openlay ...
- MAPZONE GIS SDK接入Openlayers3之三——瓦片数据集接入
瓦片数据集接入实现思路: 1.构造ol.source.TileImage数据源,构造该数据源需要以下几项: 1)空间参考,通过如下代码构造 2)TileGrid,构造需要以下几项: a)原点 b)分辨 ...
- MAPZONE GIS SDK接入Openlayers3之四——高级标注效果实现
首先看实现效果: 实现要点: 1)树形标注实现 2)复杂标注样式定义 3)效率优化 1.树形标注实现 树形标注采用字体符号来实现,包括以下几个步骤 1)载入字体 2)设置标注值与字体对照关系 3)设置 ...
- MAPZONE GIS SDK接入Openlayers3之二——空间参考扩展
Openlayers默认了两种空间参考,一个是EPSG4326,一个是EPSG3857,其它的空间参考需要进行扩展才能使用.所以我们初始化时进行了如下操作: 1.将配置数据库中所有的空间参考读取出来, ...
- 【Telerik控件学习】-建立自己的图形编辑工具(Diagram)
Telerik提供了RadDiagram控件,用于图形元素的旋转,拖拽和缩放.更重要的是,它还拓展了许多绑定的命令(复制,剪切,粘贴,回退等等). 我们可以用来组织自己的图形编辑工具. Step1.定 ...
- WPF学习12:基于MVVM Light 制作图形编辑工具(3)
本文是WPF学习11:基于MVVM Light 制作图形编辑工具(2)的后续 这一次的目标是完成 两个任务. 本节完成后的效果: 本文分为三个部分: 1.对之前代码不合理的地方重新设计. 2.图形可选 ...
- WPF学习11:基于MVVM Light 制作图形编辑工具(2)
本文是WPF学习10:基于MVVM Light 制作图形编辑工具(1)的后续 这一次的目标是完成 两个任务. 画布 效果: 画布上,选择的方案是:直接以Image作为画布,使用RenderTarget ...
- WPF学习10:基于MVVM Light 制作图形编辑工具(1)
图形编辑器的功能如下图所示: 除了MVVM Light 框架是一个新东西之外,本文所涉及内容之前的WPF学习0-9基本都有相关介绍. 本节中,将搭建编辑器的界面,搭建MVVM Light 框架的使用环 ...
- AE二次开发中几个功能速成归纳(符号设计器、创建要素、图形编辑、属性表编辑、缓冲区分析)
/* * 实习课上讲进阶功能所用文档,因为赶时间从网上抄抄改改,凑合能用,记录一下以备个人后用. * * ----------------------------------------------- ...
随机推荐
- Linux菜鸟起飞之路【二】Linux基本常识
一.Unix操作系统基本常识 1.什么是Unix? Unix是一个计算机操作系统,是一个用来协调.管理和控制计算机硬件与软件资源的控制程序. 2.Unix操作系统的特点? 多用户与多任务.多用户表示在 ...
- perl学习笔记之:模式匹配,模块,文档
Perl语言的最大特点,也是Perl作为CGI首选语言的最大特点,是它的模式匹配操作符.Perl语言的强大的文本处理能力正是通过其内嵌的对模式匹配的支持体现的.模式通过创建正则表达式实现.Perl的正 ...
- 《linux设备驱动开发详解》笔记——6字符设备驱动
6.1 字符设备驱动结构 先看看字符设备驱动的架构: 6.1.1 cdev cdev结构体是字符设备的核心数据结构,用于描述一个字符设备,cdev定义如下: #include <linux/cd ...
- Python9-函数-day9
初识函数定义与调用 def my_len(): i = 0 for k in s1: i +=1 return i #返回值 # s = 'tim' s1 = '班主任阿娇' length =my_l ...
- 牛客网暑期ACM多校训练营(第五场)F take(概率, 递推)
链接: https://www.nowcoder.com/discuss/84119 题意: 给定n个箱子, 每个箱子打开发现钻石的概率P(这里的P要除100), 每个钻石的重量, 有一个人只能持有一 ...
- hadoop学习爬坑记录
1. Q: hdfs管理界面50070端口设置后,无法访问情况. A: 1)停止当前所有服务./stop-all.sh 2)在hdfs-site.xml中,更改开放端口的绑定IP: <prope ...
- java 移位操作
http://blog.csdn.net/javazejian/article/details/51181320 java的移位操作
- Python基础之(判断,循环,列表,字典)
一.python介绍 Python是一种简单易学,功能强大的编程语言,它有高效率的高层数据结构,简单而有效地实现面向对象编程.Python简洁的语法和对动态输入的支持,再加上解释性语言的本质,使得它在 ...
- 【LeetCode】Permutations(全排列)
这道题是LeetCode里的第46道题. 题目要求: 给定一个没有重复数字的序列,返回其所有可能的全排列. 示例: 输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3 ...
- numpy hstack()
numpy.hstack(tup)[source] Stack arrays in sequence horizontally (column wise). Take a sequence of ar ...