cesium拾取pick系列(拾取坐标和对象)
参考了网上的一系列知识以及自己亲自测试的代码,记录总结如下
目录
1 window.viewer.scene拾取
1.1 window.viewer.scene.pick
1.2 window.viewer.scene.pickPosition
1.3 window.viewer.scene.drillPick
2 window.viewer.scene.camera拾取
3 window.viewer.scene.globe拾取
4 window.viewer.imageryLayers.pickImageryLayerFeatures 拾取
在 Cesium 的场景组织中,有那么几个容器构成了三维世界:
Scene:包括了 Globe,除了 Globe 的元素外,还加上了 Primitive、Entity、DataSource 等三维物件
Globe:包括了 Ellipsoid,还包括了所有的影像图层、地形瓦片,可以算是椭球体上面的皮肤
Ellipsoid:一个数学公式所定义的旋转椭球体,代表一个纯粹的地球椭球形状
1 window.viewer.scene拾取
1.1 window.viewer.scene.pick
window.viewer.scene.pick (windowPosition,width , height ) →0bject
拾取cesium场景中的空间对象,且返回最前面的一个空间对象,可以拾取entity实体,primitive图元,数据源datasource,3dtiles瓦片数据。
let handler = new Cesium.ScreenSpaceEventHandler(window.viewer.canvas);handler.setInputAction(function (event) {let pickedObject = window.viewer.scene.pick(event.position);if (!Cesium.defined(pickedObject)) {console.log("没有拾取到空间对象")return;}console.log(pickedObject)}, Cesium.ScreenSpaceEventType.LEFT_CLICK)
1.2 window.viewer.scene.pickPosition
window.viewer.scene.pickPosition (windowPosition,result)→Cartesian3
拾取cesium场景中的笛卡尔坐标,并返回笛卡尔坐标值。
注意:获取到笛卡尔坐标存在不准确性:
1.在没有地质的情况下,不开启深度测试,在地球上拾取是准确的;
2.在有地质的情况下,不开启深度测试,在地球上拾取是不准确的;因为存在深度问题,必须开启深度测试。
let handler = new Cesium.ScreenSpaceEventHandler(window.viewer.canvas);handler.setInputAction(function (event) {let earthPosition = window.viewer.scene.pickPosition(event.position);if (Cesium.defined(earthPosition)) {let cartographic = Cesium.Cartographic.fromCartesian(earthPosition);let lon = Cesium.Math.toDegrees(cartographic.longitude).toFixed(5);let lat = Cesium.Math.toDegrees(cartographic.latitude).toFixed(5);let height = cartographic.height.toFixed(2);console.log(earthPosition, {lon: lon,lat: lat,height: height,});}}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
深度测试开启
window.viewer.scene.globe.depthTestAgainstTerrain = true;
1.3 window.viewer.scene.drillPick
window.viewer.scene.drillPick (windowPosition,limit ,width,height ) →Array.<*>
拾取场景中的对象,并返回对象数组且limit限定的最多数量,可以拾取entity实体,primitive图元,数据源datasource,3dtiles瓦片数据。
let handler = new Cesium.ScreenSpaceEventHandler(window.viewer.canvas);handler.setInputAction(function (event) {//event包含坐标信息,3是返回的数量,大于三则为最前面3个,否则实际获取的数量let pickedObject = viewer.scene.drillPick(event.position, 3);console.log(pickedObject)}, Cesium.ScreenSpaceEventType.LEFT_CLICK)
2 window.viewer.scene.camera拾取
window.viewer.scene.camera.pickEllipsoid (windowPosition,ellipsoid , result ) →Cartesian3
获取相机视角下鼠标点的对应椭球面位置
注意:此方法是用于获取椭球面的笛卡尔坐标信息,且不用考虑地质的深度。
如果用该方法获取的坐标拾取点是存在不准确性的,因为该方法只获取与球面相交的坐标点,不包含地形、模型、倾斜摄影表面带有高度的对象值。在有地质数据时,所以无论是否开启深度测试,获取的三维坐标数据都是不准确。反正记住,使用此方法,关掉深度测试。
3 window.viewer.scene.globe拾取
let ray = viewer.camera.getPickRay(event.position);
window.viewer.scene.globe.pick (ray,scene,result ) →Cartesian3
专门用于获取地形加载后,拾取地形上的经纬度(弧度)以及高程
let handler = new Cesium.ScreenSpaceEventHandler(window.viewer.canvas);handler.setInputAction(function (event) {//相机到鼠标点的射线let ray = viewer.camera.getPickRay(event.position);//相机到鼠标点的射线与地形场景相交let position = viewer.scene.globe.pick(ray, viewer.scene);console.log(position);//笛卡尔坐标转经纬度(弧度)let cartesian = Cesium.Cartographic.fromCartesian(position);console.log(cartesian)}, Cesium.ScreenSpaceEventType.LEFT_CLICK)
注意:此方法无论是否存在地质,无论是否开启地质的深度测试,获取与地形的笛卡尔坐标都是准确的,因为此方法只是与地形的求交,不包括模型、倾斜摄影表面。
4 window.viewer.imageryLayers.pickImageryLayerFeatures 拾取
window.viewer.imageryLayers.pickImageryLayerFeatures (ray,scene)→Promise.<Array.<ImageryLayerFeatureInfo >>
用于获取影像图层信息
let handler = new Cesium.ScreenSpaceEventHandler(window.viewer.canvas);handler.setInputAction((event) => {let pickRay = window.viewer.camera.getPickRay(event.position);let ImageryLayerFeatures = window.viewer.imageryLayers.pickImageryLayerFeatures(pickRay, window.viewer.scene);if (!Cesium.defined(ImageryLayerFeatures)) {console.log('没有影像图层要素信息选中');} else {Cesium.when(ImageryLayerFeatures, function (LayerFeatures) {//获取到图层数据if (LayerFeatures.length > 0) {console.log(LayerFeatures)}});}}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
cesium拾取pick系列(拾取坐标和对象)相关推荐
- VTK修炼之道79:交互与拾取_单位拾取
1.单位拾取 示例代码: #include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL) VTK_MODULE_INIT(vtkI ...
- VTK_Learning_交互与拾取_单位拾取
1.单位拾取 示例代码: #include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL) VTK_MODULE_INIT(vtkI ...
- Cesium中的几种坐标和相互转换(2)
Cesium中的几种坐标和相互转换 1.平面坐标系(Cartesian2) new Cesium.Cartesian2(x, y) 2.笛卡尔空间直角坐标系-世界坐标(Cartesian3) new ...
- oracle怎么删除lob对象,Oracle系列:LOB大对象处理
Oracle系列:LOB大对象处理 Oracle系列:LOB大对象处理 主要是用来存储大量数据的数据库字段,最大可以存储4G字节的非结构化数据. 主要介绍字符类型和二进制文件类型LOB数据的存储,单独 ...
- cesium 入门开发系列矢量瓦片加载展示(附源码下载)
前言 cesium 入门开发系列环境知识点了解: cesium api文档介绍,详细介绍 cesium 每个类的函数以及属性等等 cesium 在线例子 内容概览 cesium 实现矢量瓦片加载效果 ...
- CodeMonkey过关学习笔记系列:11-20关 对象
CodeMonkey过关学习笔记系列:11-20关 •对象和朋友(OBJECTS AND FRIENDS) 11~20 知识点 turnTo,turtle.step 做题之前,解决事情之前我们先列好计 ...
- Cesium:地心地固坐标(ECEF)转东北天坐标(ENU)
Cesium中地心地固坐标(ECEF)转东北天坐标(ENU) Cesium 中常用的坐标是以椭球中心为原点的地心地固坐标系,在地学问题中,我们常常使用的坐标系为三个坐标轴分别指向东方.北方.地表垂直向 ...
- VTK修炼之道78:交互与拾取_点拾取
1.拾取 选择拾取是人机交互过程的一个重要功能. 一个最经典的例子就是,在玩3D游戏时,场景中可能会存在多个角色,有时需要用鼠标来选择所要控制的角色,这就要用到拾取功能. 另外,在某些三维图形的编辑软 ...
- VTK_Learning_交互与拾取_点拾取
1.拾取 选择拾取是人机交互过程的一个重要功能. 一个最经典的例子就是,在玩3D游戏时,场景中可能会存在多个角色,有时需要用鼠标来选择所要控制的角色,这就要用到拾取功能. 另外,在某些三维图形的编辑软 ...
- 鼠标拾取(光线拾取)
作者:桑榆 QQ:934440653 有问题,评论留言,或qq联系 案例效果 鼠标拾取 主要代码 1.创建矩形 (1)6-8行限制随机产生的矩形的长.宽.纵深不超过20: (2)14-16行限制随机产 ...
最新文章
- groovy怎样从sql语句中截取表名_SQL常用的基础查询语句
- Python学习笔记:类
- 浅析C#中构建多线程应用程序
- 手机站点击商务通无轨迹解决方法
- 创建一个Hello World的Confluence宏
- (C/C++) string / *char / int 基本轉換
- jquery ajax 方法及各参数详解
- 计算机中的各种字符编码
- 游戏公司架构和游戏开发流程概述
- 联想 M7600d 激光一体机清零方法
- C语言图形库——easyx的使用
- 硕士期间两篇计算机sci二区,我院青年教师陈新华今年连续两篇论文在中科院二区SCI期刊见刊...
- excel 链接sql server数据库,并使用sql语句导出自己想要的数据
- 【计算机网络】计算机网络总结
- matlab中均线交易策略,高胜率交易策略,期货双向网格交易法
- 电脑格式化后文件还能恢复吗?好用方法分享
- Centos8(Liunx) 中安装PHP7.4 的三种方法和删除它的三种方法
- Android 控件 RecyclerView
- 如何防止其它用户登录计算机,如何防止别人用其他用户名进入自己的私人电脑?...
- 数据可视化知识点汇总