cesium常见操作:鼠标点击获取对象

这篇具有很好参考价值的文章主要介绍了cesium常见操作:鼠标点击获取对象。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  

目录

一、viewer.scene.pick(获取Cartesian2)

二、 viewer.scene.pickPosition(获取Cartesian3)

三、viewer.scene.drillPick(穿透拾取,获取所有对象)

四、viewer.scene.globe.pick(获取加载地形后的经纬度(弧度)和高程)

五、 viewer.scene.camera.pickEllipsoid

六、window.viewer.imageryLayers.pickImageryLayerFeatures 拾取图层


        在 Cesium 的场景组织中,有那么几个容器构成了三维世界:

Scene:包括了 Globe,除了 Globe 的元素外,还加上了 Primitive、Entity、DataSource 等三维物件
Globe:包括了 Ellipsoid,还包括了所有的影像图层、地形瓦片,可以算是椭球体上面的皮肤
Ellipsoid:一个数学公式所定义的旋转椭球体,代表一个纯粹的地球椭球形状

        鼠标点击获取对象,整体就是再scene的canvas对象上进行操作,不一样的就是根据不同的数据情况和场景情况,需要不同的操作,整体的操作流程如下:

var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
handler.setInputAction(function (event) {
    //不同场景的操作代码
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);  //大多数为左键点击事件操作

一、viewer.scene.pick(获取Cartesian2)

使用场景:通过坐标位置,拾取 Entity 实体、 Primitive(图元)3D-TilesCesium3DTileFeature)瓦片数据、数据源datasource对象。拾取后,可以用于改变对象的属性参数。

注意: scene.pick 只能获取一个对象,并且获取的是最顶部的对象。如果拾取点没有对象,则为undefined

示例代码

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)

二、 viewer.scene.pickPosition(获取Cartesian3)

使用场景:拾取对应位置的世界坐标,适用于模型表面位置的选取,拾取三维物体的坐标等。

注意: 一定要开启深度检测viewer.scene.globe.depthTestAgainstTerrain = true;),否则在没有3dTile模型的情况下,会出现空间坐标不准的问题,如果不开启深度检测,只能在3dTile模型上获取准确的空间坐标。

与globe.pick区别:见下面globe.pick

示例代码

var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
handler.setInputAction(function (event) {
     var position = viewer.scene.pickPosition(event.position);
     console.log("三维空间坐标:", positionposition);
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);


//获取坐标转经纬度
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);

三、viewer.scene.drillPick(穿透拾取,获取所有对象)

使用场景:穿透拾取,是从当前拾取位置获取所有对象的对象列表(entity的集合),列表按其在场景中的视觉顺序(从前到后)排序(通过for循环可以获取当前坐标下的所有entity)。

注意: drillPick 和 Pick 不同,Pick 只能拾取一个对象,而 drillPick 可以拾取多个对象,并且 drillPick 可以设置 limit 参数,limit 参数可以控制获取几个对象,超出的就不获取了。

示例代码

var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
handler.setInputAction(function (event) {
	var pickedObjectArrays = scene.drillPick(event.position,5);   //最多获取前5个对象
	// pickedObjectArrays 是个数组,使用for循环 可以拿到所有entity
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);

四、viewer.scene.globe.pick(获取加载地形后的经纬度(弧度)和高程)

使用场景此方法无论是否存在地质,无论是否开启地质的深度测试,获取与地形的笛卡尔坐标都是准确的,因为此方法只是与地形的求交,不包括模型、倾斜摄影表面。一般用于获取点击处地球表面的世界坐标(有地形),注意:不包括模型、倾斜摄影表面。找到射线与渲染的地球表面之间的交点(射线必须以世界坐标给出)返回的是世界坐标。一般用来获取加载地形后的经纬度和高程。

注意: 最好也开启深度检测(viewer.scene.globe.depthTestAgainstTerrain = true;)。

与scene.pickPosition区别:

  • globe.pick只能求交地形,结果相对稳定准确,不论地形深度检测开启与否,不论加载的是默认地形还是别的地形数据
  • scene.pickPosition不仅可以求交地形,还可以求交除地形以外其他所有写深度的物体。只有在开启地形深度检测,且不使用默认地形时是准确的

示例代码

var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
handler.setInputAction(function (event) {
     var myray = viewer.camera.getPickRay(event.position);
     var myposition = viewer.scene.globe.pick(myray, viewer.scene);
     console.log("当前场景坐标:", myposition);
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);

五、 viewer.scene.camera.pickEllipsoid

使用场景获取相机视角下鼠标点的对应椭球面位置。接受一个必选的屏幕坐标,返回一个三维世界坐标 Cartesian3。主要用于获取椭球面的位置。通过一个必选的屏幕坐标,获取椭圆球体表面的一个Cartesian3坐标。适用于裸球表面的选取,是基于数学模型的椭圆球体。

注意: pickEllipsoid在加载地形的情况下有误差,地形凹凸程度越大,误差越大,所以不要用来获取有地形的坐标。使用此方法,关掉深度测试

示例代码

var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
handler.setInputAction(function (event) {
     var position = viewer.scene.camera.pickEllipsoid(event.position, viewer.scene.globe.ellipsoid);
     console.log("获取到的坐标:", position);
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);

六、window.viewer.imageryLayers.pickImageryLayerFeatures 拾取图层

使用场景:获取影像图层信息。

注意: 

window.viewer.imageryLayers.pickImageryLayerFeatures (ray,scene)→Promise.<Array.<ImageryLayerFeatureInfo >>

示例代码文章来源地址https://www.toymoban.com/news/detail-500757.html

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常见操作:鼠标点击获取对象的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • powershell 获取鼠标位置 与 鼠标点击

    2024年02月11日
    浏览(53)
  • JS javascript 点击鼠标 鼠标事件 获取元素 获取元素Xpath

    js代码,鼠标在页面点击时,记录元素的Xpath 代码:  

    2024年02月15日
    浏览(49)
  • Python模拟鼠标点击与实时获取鼠标位置

    鼠标点击会用到pymouse库。 在cmd中运行,使用镜像下载 编译器在运行时可能会报错,会出现No module named win32api问题,这是由于Python是没有自带访问windows系统API的库的,需要下载。 在cmd中运行,使用镜像下载pywin32。 time.sleep(num),num值可以自己进行设置,单位为秒。 程序运行

    2024年02月11日
    浏览(55)
  • C++ 鼠标点击的获取

    首先一个比较常用的宏定义如下: 使用KEY_DOWN(鼠标事件),可以方便获取很多鼠标的事件。 如果获取左键的点击,可以使用如下的代码:KEY_DOWN(MOUSE_MOVED) 如果获取滚轮的点击,可以使用如下的代码:KEY_DOWN(MOUSE_WHEELED) 如果获取右键的点击,可以使用如下的代码:KEY_DOWN(MOUSE

    2024年02月12日
    浏览(52)
  • threejs点击获取三维坐标(Three.js获取鼠标点击的三维坐标)

    绑定点击事件,通过 THREE.Raycaster 光线投射,用于确定鼠标点击位置上有哪些物体, raycaster.intersectObjects(scene.children) 返回点击位置上所有的物体的数组;我们用 var selected = intersects[0] 取第一个,也就是最前面的那个物体;在通过 selected.point 取点坐标

    2024年02月11日
    浏览(128)
  • UE获取当前鼠标点击位置坐标

    获取当前 鼠标点击位置的UE世界坐标 (x,y,z),效果如下图所示(为便于演示,下图显示了碰撞点位)。 2.1 蓝图代码 (1) 核心函数 的蓝图代码如下: (2)当鼠标左键按下时,调用函数,当前鼠标点击位置将会被打印在屏幕上。

    2024年02月09日
    浏览(64)
  • C++实现【获取鼠标位置】以及控制鼠标【打开窗口并点击】

    获取鼠标位置的函数源代码来自:C++【认知系列】实时获取鼠标坐标_c++ 获取鼠标坐标_Zalamp的博客-CSDN博客 鼠标点击操作代码来自: C++控制鼠标移动到指定位置并且左键点击_c++鼠标移动_蜚语77的博客-CSDN博客 在特定程序中实现鼠标点击操作分为两步,第一步就是在任务栏点

    2024年02月12日
    浏览(45)
  • pyautogui获取鼠标位置及循环点击指定位置按钮

    pip install pyautogui可能会安装失败,需要先下载包再按照。 由于本机利用的是anconda里的python环境,所以下载后的安装步骤为: 下载包至本地:PyAutoGUI-0.9.53.tar.gz 下载地址 cd 至包下载目录下 执行命令 conda install --use-local PyAutoGUI-0.9.53.tar.gz -n base 对应含义: conda install --use-local 包文

    2024年02月11日
    浏览(103)
  • OpenCV学习(三)——响应鼠标事件(获取点击点坐标和颜色,利用鼠标进行绘图)

    使用OpenCV读取图像,可以在读取图像的窗口通过鼠标点击可以实现:获取鼠标点击像素点的坐标、获取鼠标点击像素点的颜色和在鼠标点击的像素点生成圆等等。 winname:窗口的名字 callback:回调函数 userdata:给回调函数的参数 enent:鼠标事件 x:横坐标 y:纵坐标 flags:事件

    2024年02月08日
    浏览(91)
  • selenium+python:点击元素、alert弹框、鼠标操作(左键点击、右键点击、双击、鼠标悬浮)、下拉选项框、窗口切换等操作的处

    driver=webdriver.Chrome() driver.maximize_window() driver.get(\\\"https://www.baidu.com/\\\") 在进行页面操作时,需要用鼠标进行左键点击、右键点击、双击、鼠标悬浮(比如鼠标移到某个位置就会出现一些元素)、鼠标拖动等操作,这时需要导入ActionChains模块 perform() 执行所有ActionChains 中存储的行为

    2024年02月05日
    浏览(68)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包