改造SuperMap的DrawHandler接口,自定义绘制的图形样式
2024-10-08 06:59:08
超图WebGL三维接口中有一个绘制的接口(new Cesium.DrawHandler(viewer, mode, clampMode),它封装了绘制完之后的式样,画完之后捕捉绘制完成的实体有一定的难度,而且样子也改不了,所以我对其Drawhandler的方法做了变形,只使用其绘制中的预览效果,最终画完的东西按我们自己的来,我们只抓取绘制的点。
原理是使用Drawhandler的 drawEvt,绘制完成事件的回调
handler.drawEvt.addEventListener(function(result){
console.log(result);
});
下面是改装:
let draw = new Cesium.DrawHandler(_view.view, mode, _clampMode||Cesium.ClampMode.Space);
draw.activate();
let style;
if(!_style){
style={};
}else{
style=_style;
}
draw.drawEvt.addEventListener(function(result){
let DRAWENTITY;
switch (mode) {
case Cesium.DrawMode.Polygon:case 'Cesium.DrawMode.Polygon':case '2':case 2:
style.polygon.hierarchy=result.object.polygon.hierarchy;
_view.view.entities.remove(result.object);
draw.clear();
DRAWENTITY= _view.view.entities.add({
id:entityProperty.id||null,
description:entityProperty.description||null,
name:entityProperty.name||'',
show:entityProperty.show||true,
polygon:style.polygon
});
break;
case Cesium.DrawMode.Point:case 'Cesium.DrawMode.Point':case '0':case 0:
let pointPosition = result.object.position;
_view.view.entities.remove(result.object);
draw.clear();
DRAWENTITY=_view.view.entities.add({
id:entityProperty.id||null,
description:entityProperty.description||null,
name:entityProperty.name||'',
show:entityProperty.show||true,
position:pointPosition,
point:style.point
});
break;
case Cesium.DrawMode.Line:case 'Cesium.DrawMode.Line':case '1':case 1:
let lineStyle = style;
lineStyle.polyline.positions= result.object.positions;
_view.view.entities.remove(result.object);
draw.clear();
DRAWENTITY=_view.view.entities.add({
id:entityProperty.id||null,
description:entityProperty.description||null,
name:entityProperty.name||'',
show:entityProperty.show||true,
polyline:lineStyle.polyline
});
break;
case Cesium.DrawMode.Marker:case 'Cesium.DrawMode.Marker':case '3':case 3:
if(style.billboard) {
let markerPosition = result.object.position;
_view.view.entities.remove(result.object);
draw.clear();
DRAWENTITY=_view.view.entities.add({
id:entityProperty.id||null,
description:entityProperty.description||null,
name:entityProperty.name||'',
show:entityProperty.show||true,
position:markerPosition,
billboard:style.billboard
});
}else{
DRAWENTITY=result.object
}
break;
}
if(_drawEndcallback){
_drawEndcallback(DRAWENTITY)
}
draw.deactivate();
});
这样就可以在回调中抓取到绘制的实体,当然,如果不想依赖于超图的接口,因为在绘制过程中预览效果用的是绿色的线,不好看。也可以基于纯Cesium自己写一个,我写的基于原始Cesium的绘制方法在下面这个链接里:
最新文章
- wex5 实战 用户点评与提交设计技巧
- 【final】站立会议---11.27
- Shell数组例子
- pascal矩阵
- wpf 获取DataGrid某一个单元格,设置此单元格ToolTip内容和背景颜色
- BZOJ 4027 [HEOI 2015] 兔子与樱花 解题报告
- 树莓派(raspberry)启用root账户 分类: 服务器搭建 Raspberry Pi 2015-04-12 18:45 95人阅读 评论(0) 收藏
- 69个spring面试题及答案
- [转]Delphi 中 image 控件加载bmp、JPG、GIF、PNG等图片的办法
- 达到XML简单的动态配置
- 驱动: oops
- PHP 文件操作类(创建文件并写入) 生成日志
- php session 读写锁
- Android中调用文件管理器并返回选中文件的路径
- Android studio导入eclipse项目(亲测)
- Centos7快速部署CloudStack服务器
- MySQL查询表的所有列名,用逗号拼接
- URL地址重写例子(Helicon)
- spring-mvc注解配置小记
- Mysql数据库安装与配置