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二次开发中几个功能速成归纳(符号设计器、创建要素、图形编辑、属性表编辑、缓冲区分析)
/* * 实习课上讲进阶功能所用文档,因为赶时间从网上抄抄改改,凑合能用,记录一下以备个人后用. * * ----------------------------------------------- ...
随机推荐
- ios 序列化
1到底这个序列化有啥作用? 面向对象的程序在运行的时候会创建一个复杂的对象图,经常要以二进制的方法序列化这个对象图,这个过程叫做Archiving. 二进制流可以通过网络或写入文件中(来源于某教材的一 ...
- 将Xcode的本地代码push到github仓库上
1.首先,你得有一个github账号,如果没有的话就去注册一个,通过下面图片的方式创建一个github仓库. 2.创建仓库后填写相关的信息,比如说仓库名等. 3.在xcode上进行设置,添加远程git ...
- PAT 乙级 1005
题目 题目地址:PAT 乙级 1005 题解 本题主要就在于将一个数的一系列计算结果不重复地存储起来并便于检索,考虑到STL中的集合有相似的特性,使用set可以有效地简化代码和运算. 过程如下: (初 ...
- Linux菜鸟起飞之路【三】Linux常用命令
一.Linux命令的基本格式 命令 [选项] [参数] a)命令:就是告诉操作系统要做什么 b)选项:说明命令的运行方式,有的会改变命令的功能,选项通常以“-”开始 c)参数:说明命令的操作对象,如文 ...
- clock gate
clock gate 这个专题,比较复杂设计DC PT PR.下面仅仅从RTL行为级说明一下.
- 循环链表的C风格实现(单向)
头文件: #ifndef _CIRCLELIST_H_ #define _CIRCLELIST_H_ typedef void CircleList; // typedef struct _tag_C ...
- POJ 1160 四边形不等式优化DP Post Office
d(i, j)表示用i个邮局覆盖前j个村庄所需的最小花费 则有状态转移方程:d(i, j) = min{ d(i-1, k) + w(k+1, j) } 其中w(i, j)的值是可以预处理出来的. 下 ...
- bean容器能力
bean容器能力 对bean容器的最简单的述求 能生产bean 能注入组装bean: 字段,构造函数 spring bean容器(3.0版本)的能力列表 能生产bean 能注入组装bean:字段,构造 ...
- 图论trainning-part-2 C. The Largest Clique
C. The Largest Clique Time Limit: 3000ms Memory Limit: 131072KB 64-bit integer IO format: %lld ...
- NYOJ 118 修路方案
修路方案 时间限制:3000 ms | 内存限制:65535 KB 难度:5 描述 南将军率领着许多部队,它们分别驻扎在N个不同的城市里,这些城市分别编号1~N,由于交通不太便利,南将军准备修 ...