参考了网上的一系列知识以及自己亲自测试的代码,记录总结如下

目录

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系列(拾取坐标和对象)相关推荐

  1. VTK修炼之道79:交互与拾取_单位拾取

    1.单位拾取 示例代码: #include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL) VTK_MODULE_INIT(vtkI ...

  2. VTK_Learning_交互与拾取_单位拾取

    1.单位拾取 示例代码: #include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL) VTK_MODULE_INIT(vtkI ...

  3. Cesium中的几种坐标和相互转换(2)

    Cesium中的几种坐标和相互转换 1.平面坐标系(Cartesian2) new Cesium.Cartesian2(x, y) 2.笛卡尔空间直角坐标系-世界坐标(Cartesian3) new ...

  4. oracle怎么删除lob对象,Oracle系列:LOB大对象处理

    Oracle系列:LOB大对象处理 Oracle系列:LOB大对象处理 主要是用来存储大量数据的数据库字段,最大可以存储4G字节的非结构化数据. 主要介绍字符类型和二进制文件类型LOB数据的存储,单独 ...

  5. cesium 入门开发系列矢量瓦片加载展示(附源码下载)

    前言 cesium 入门开发系列环境知识点了解: cesium api文档介绍,详细介绍 cesium 每个类的函数以及属性等等 cesium 在线例子 内容概览 cesium 实现矢量瓦片加载效果 ...

  6. CodeMonkey过关学习笔记系列:11-20关 对象

    CodeMonkey过关学习笔记系列:11-20关 •对象和朋友(OBJECTS AND FRIENDS) 11~20 知识点 turnTo,turtle.step 做题之前,解决事情之前我们先列好计 ...

  7. Cesium:地心地固坐标(ECEF)转东北天坐标(ENU)

    Cesium中地心地固坐标(ECEF)转东北天坐标(ENU) Cesium 中常用的坐标是以椭球中心为原点的地心地固坐标系,在地学问题中,我们常常使用的坐标系为三个坐标轴分别指向东方.北方.地表垂直向 ...

  8. VTK修炼之道78:交互与拾取_点拾取

    1.拾取 选择拾取是人机交互过程的一个重要功能. 一个最经典的例子就是,在玩3D游戏时,场景中可能会存在多个角色,有时需要用鼠标来选择所要控制的角色,这就要用到拾取功能. 另外,在某些三维图形的编辑软 ...

  9. VTK_Learning_交互与拾取_点拾取

    1.拾取 选择拾取是人机交互过程的一个重要功能. 一个最经典的例子就是,在玩3D游戏时,场景中可能会存在多个角色,有时需要用鼠标来选择所要控制的角色,这就要用到拾取功能. 另外,在某些三维图形的编辑软 ...

  10. 鼠标拾取(光线拾取)

    作者:桑榆 QQ:934440653 有问题,评论留言,或qq联系 案例效果 鼠标拾取 主要代码 1.创建矩形 (1)6-8行限制随机产生的矩形的长.宽.纵深不超过20: (2)14-16行限制随机产 ...

最新文章

  1. groovy怎样从sql语句中截取表名_SQL常用的基础查询语句
  2. Python学习笔记:类
  3. 浅析C#中构建多线程应用程序
  4. 手机站点击商务通无轨迹解决方法
  5. 创建一个Hello World的Confluence宏
  6. (C/C++) string / *char / int 基本轉換
  7. jquery ajax 方法及各参数详解
  8. 计算机中的各种字符编码
  9. 游戏公司架构和游戏开发流程概述
  10. 联想 M7600d 激光一体机清零方法
  11. C语言图形库——easyx的使用
  12. 硕士期间两篇计算机sci二区,我院青年教师陈新华今年连续两篇论文在中科院二区SCI期刊见刊...
  13. excel 链接sql server数据库,并使用sql语句导出自己想要的数据
  14. 【计算机网络】计算机网络总结
  15. matlab中均线交易策略,高胜率交易策略,期货双向网格交易法
  16. 电脑格式化后文件还能恢复吗?好用方法分享
  17. Centos8(Liunx) 中安装PHP7.4 的三种方法和删除它的三种方法
  18. Android 控件 RecyclerView
  19. 如何防止其它用户登录计算机,如何防止别人用其他用户名进入自己的私人电脑?...
  20. 数据可视化知识点汇总

热门文章

  1. Yunxion资产监测设备中DCDC芯片选择
  2. java静态链表_Java数据结构——静态链表实现
  3. 轻量级网络——ShuffleNetV2
  4. 怎么设置电脑防火墙ping启用_如何通过windows防火墙启用和禁用ping命令
  5. Kvaser、C++、Qt编写监控界面(一)
  6. Linux系统如何测试无线网卡的信号强度,如何用wifi-linux检测AP信号强度
  7. nanomsg安装和测试
  8. 使用JavaScript获取设备屏幕的宽度
  9. 数学对数 log lg ln 简介
  10. python多线程爬取音标