SuperMap iClient3D 11i (2023) SP1 for Cesium之移动实体对象

这篇具有很好参考价值的文章主要介绍了SuperMap iClient3D 11i (2023) SP1 for Cesium之移动实体对象。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 作者:nannan

目录

前言

一、代码思路

1.1 绘制面实体对象

1.2 鼠标左键按下事件

1.3 鼠标移动事件

1.4 鼠标左键抬起事件

二、运行效果

三、注意事项


前言

       SuperMap 官网三维前端范例 编辑线面,可以对面实体对象的节点进行增加、删除以及修改位置。那可不可以整个线/面对象选中后鼠标拖动,使该面对象的整体位置随着鼠标的移动而移动呢?目前客户这种需求是为了项目上可以实时调整面的区域,方便后端出图。下面和小编一起来看看该功能实现的过程及效果。

一、代码思路

1.1 绘制面实体对象

var polygon = viewer.entities.add({
	polygon: {
		hierarchy: {
			positions: [new Cesium.Cartesian3(290254.5148736448, 5637924.074937166, 2971777.4768239637),
			new Cesium.Cartesian3(286432.14053509803, 5640804.651089405, 2966391.9275969476),
			new Cesium.Cartesian3(283512.2666752818, 5640502.494127799, 2969385.3689191523),
			new Cesium.Cartesian3(287036.36797237827, 5636827.146248645, 2974105.8904601005)
		     ]
	    },
		material: Cesium.Color.BLUE.withAlpha(0.5),//面颜色
		outline: true,//边框是否显示
		outlineWidth: 5,//边框线宽度
		outlineColor: Cesium.Color.YELLOW,//面边框线颜色
		perPositionHeight:true//是否使用每个位置的高度
	}
});
viewer.zoomTo(polygon);//定位

1.2 鼠标左键按下事件

       鼠标左键按下接口为 Cesium.ScreenSpaceEventType.LEFT_DOWN,具体代码如下:

viewer.screenSpaceEventHandler.setInputAction(function(e) {
   leftDownAction(e, viewer)
}, Cesium.ScreenSpaceEventType.LEFT_DOWN);

       鼠标左键按下需要获取选中的实体对象,选择(单击选择一个对象)是我们需要与基本API进行短暂交互的领域之一。使用 scene.pick 和 scene.drillpick 检索实体。小编这里采用scene.drillPick。那 scene.drillPick 和 scene.pick 的区别是什么呢?

       如果把 scene.drillPick(click.position) 中 drillPick 改成 pick,那么当鼠标点击或滑过时该位置存在多个 entity,哪怕点线面不在同一高度,面 entity 都可能会盖住点线 entity,从而使得被遮盖的点或线无法响应点击和滑过事件。

let entity = ''
let positions = null // 记录选中实体的位置信息
let newPosition = null // 记录鼠标移动的位置
let diff = [] // 记录选中实体与鼠标位置信息的差异
// 拖拽实体对象-左键按下
function leftDownAction(e, viewer) {
	entity = viewer.scene.drillPick(e.position, 1)[0];
	var position = changeToThree(e.position, viewer);
	if(entity) {
	    // 锁定相机
		if(entity.id.polygon) {
			if(!entity.id.polygon.hierarchy._value) {
				return ''
			}
			positions = entity.id.polygon.hierarchy._value.positions;
		} else if(entity.id.polyline) {
		if(!entity.id.polyline.positions._value)
			return
			positions = entity.id.polyline.positions._value;
		};
		// 记录选中实体与鼠标位置信息的差异
		positions.forEach(function(item) {
			diff.push({
				x: item.x - position.x,
				y: item.y - position.y,
				z: item.z - position.z
			})
		});
	    viewer.scene.screenSpaceCameraController.enableRotate = false;
	}
}

定义一个将经纬度格式转为世界坐标格式的方法

// 定义一个将经纬度格式转为世界坐标格式的方法
function changeToThree(position, viewer) {
	if(!position) return [];
	return viewer.scene.globe.pick(viewer.camera.getPickRay(position), viewer.scene);
}

1.3 鼠标移动事件

viewer.screenSpaceEventHandler.setInputAction(function(e) {
	mouseMoveAction(e, viewer)
}, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
// 拖拽实体对象-鼠标移动
function mouseMoveAction(e, viewer) {
	if(entity) {
		// 获取移动点的位置,且将格式转为世界坐标
		const movePosition = changeToThree(e.endPosition, viewer);
		// 根据鼠标位置以及选中实体与鼠标位置信息的差异计算出移动后的实体位置
		newPosition = diff.map(item => ({
			x: item.x + movePosition.x,
			y: item.y + movePosition.y,
			z: item.z + movePosition.z
		}));
		if(entity.id.polygon) {
			// 动态改变面的位置信息
			entity.id.polygon.hierarchy = new Cesium.CallbackProperty(function() {
				return new Cesium.PolygonHierarchy(newPosition)
			}, false);
			entity.id.polygon.positions = new Cesium.CallbackProperty(function() {
				return newPosition
			}, false);
		} else {
			entity.id.polyline.positions = new Cesium.CallbackProperty(function() {
				return newPosition
		       }, false);
		};
	
	};
}

1.4 鼠标左键抬起事件

viewer.screenSpaceEventHandler.setInputAction(function(e) {
	leftUpAction(e, viewer)
}, Cesium.ScreenSpaceEventType.LEFT_UP);
// 拖拽实体对象-左键抬起
function leftUpAction(e, viewer) {
	if(entity.id.polygon) {
		entity.id.polygon.hierarchy = newPosition;
		entity.id.polygon.positions = newPosition;
	} else {
		entity.id.polyline.positions = newPosition;
	};
	positions = null; // 记录选中实体的位置信息
	newPosition = null; // 记录鼠标移动的位置
	diff = []; // 记录选中实体与鼠标位置信息的差异
	entity = null;

	// 解除相机锁定
	viewer.scene.screenSpaceCameraController.enableRotate = true;
}

二、运行效果

三、注意事项

       构建面实体对象需要用到 perPositionHeight参数,该参数用于指定是否使用每个位置的高度。这里需要设置为 true,否则默认 false 贴地,面边框不会和面一起跟随鼠标移动而移动,会是以下图 3.1 的效果。文章来源地址https://www.toymoban.com/news/detail-707329.html

SuperMap iClient3D 11i (2023) SP1 for Cesium之移动实体对象,三维GIS,SuperMap,实体,Cesium
图3.1 面边框不会和面一起跟随鼠标移动而移动

到了这里,关于SuperMap iClient3D 11i (2023) SP1 for Cesium之移动实体对象的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • SuperMap iClient3D for WebGL/Cesium端性能优化

    SuperMap iClient3D for WebGL/Cesium端性能优化

        目录 一、请求优化 1.1 多子域 1.1.1 scene.open()打开场景 1.1.2 加载地形 1.1.3 加载影像 1.1.4 加载S3M 1.1.5 加载MVT 1.2 批量请求 1.2.1 地形 1.2.2 影像 二、内存优化 2.1 根节点驻留内存 2.2 自动释放缓存 2.3 内存管理 三、图层优化 3.1 LOD 3.2 空间索引 3.3 控制图层显示范围 3.4 控制图层

    2024年01月25日
    浏览(10)
  • SuperMap iClient3D for Cesium 实现图层下钻功能

    SuperMap iClient3D for Cesium 实现图层下钻功能

    目录 前言 一、所需数据及发布服务 1、数据准备  2、地图展示 二、Cesium.SuperMapImageryProvider 接口 三、相关代码         实现地图下钻功能可以提供更详细的地理信息、支持交互式探索、展示层级关联的数据和提供数据分析决策支持等优势。通过点击地图上的区域或点,用

    2024年02月03日
    浏览(10)
  • vue3+SuperMap iClient3D for Cesium实现可视域分析功能

    vue3+SuperMap iClient3D for Cesium实现可视域分析功能

    本人小白一枚,文章如有问题还请各位大神评论区指出。整体实现是参考SuperMap iClient3D for Cesium的可视域分析功能源码~ 文章目录 前言 一、主要功能 二、使用步骤 1.HTML主要结构 2.javascript SuperMap iClient3D for Cesium中的ViewShed3D类提供了可视域分析,设置观察点、目标的位置,水平

    2024年02月15日
    浏览(11)
  • 【超图】SuperMap iClient3D for WebGL/WebGPU —— 坐标系&位置 —— Cartesian2

    【超图】SuperMap iClient3D for WebGL/WebGPU —— 坐标系&位置 —— Cartesian2

    作者:taco         说到关于地理必然逃不开位置的关系。借用百度百科的内容来说 地理学(geography) ,是研究地球表层 空间地理 要素或者地理综合体 空间分布规律 、时间演变过程和 区域 特征的一门学科。 所以 位置坐标系 必然逃不掉了。那么在SuperMap iClient3D for Web

    2024年01月16日
    浏览(11)
  • iClient3D for Cesium&WebGL入门之使用vscode以服务方式运行调试

    iClient3D for Cesium&WebGL入门之使用vscode以服务方式运行调试

    作者:超图研究院技术支持中心-于丁 iClient3D for CesiumWebGL入门之使用vscode以服务方式运行调试 相信大家第一次使用SuperMap iClient3D for Cesium或SuperMap iClient3D for WebGL的时候,都遇到过和我一样的事情: 在文件夹中直接打开html的示例代码文件于浏览器中; 或者使用vscode安装open

    2024年02月04日
    浏览(8)
  • 超图iClient3DforCesium地形、影像、模型、在线影像交互示例

    数据源:基于iserver发布的三维场景(地形、影像、BIM模型) + 在线arcgis影像 应用:目录树展示源数据列表、目录树控制源数据可视化结果显隐、BIM模型点选查询关联属性

    2024年02月03日
    浏览(9)
  • kylinV10-SP1 安装 QT 5.12

    安装 qt 时编译出现 cstddef:50:10: fatal error: \\\'stddef.h\\\' file not found 可使用以下命令: 如果出现 Can‘t exec “aclocal“: 没有那个文件或目录 at /usr/share/autoconf/Autom4te/FileUtils.pm line 326. 可使用以下命令: -y : 这是一个选项,用于自动回答所有的提示为 “yes” 以减少用户交互。 libtool 是

    2024年01月17日
    浏览(9)
  • 麒麟操作V10SP1系统systemd目标单元

    通过命令列出当前系统中所有可用的  systemd 目标单元。 用于被控制系统启动时运行哪些服务和进程,以及系统在运行过程中的行为。  下面是各个目标单元的详细解释: basic.target: 系统启动时会首先启动该目标单元,包括文件系统和基本系统资源的启动。 cryptsetup.target:

    2024年02月05日
    浏览(14)
  • 麒麟V10sp1轻松设置开机自启动脚本

    麒麟V10sp1轻松设置开机自启动脚本

    大家有没有经常碰到每次开机都需要花费5分钟去手动运行某个脚本的情况,是不是偶尔懒的动手,想开机之后自动运行。比如开机自动新建文件,自动清垃圾,自动打开qq,自动打开微信,自动打开浏览器,自动发送邮件诸如此类。。。 现在有一种极其简单的办法,帮你去实

    2024年02月08日
    浏览(15)
  • 银河麒麟服务器v10 sp1 安装 nginx

    银河麒麟服务器v10 sp1 安装 nginx

    首先查询是否安装:  root@xxx-pc:~# ps -ef |grep nginx 或 root@xzx-pc:~# dpkg -list|grep nginx 如果安装请先卸载,或者直接使用,以下步骤你就可以忽略了,软件包的卸载方法: 1、APT方式 (1)移除式卸载:apt-get remove softname1 softname2 …;(移除软件包,当包尾部有+时,意为安装) (2)清

    2024年02月09日
    浏览(16)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包