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 >>

示例代码

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);

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
CESIUM EPSG::900913 是指Cesium中常用的投影坐标系,也被称为Web墨卡托投影(Web Mercator)。该投影使用了EPSG:3857的代码。它是一种等距投影,用于在Web地图中显示经纬度坐标。Web墨卡托投影将地球表面投影到一个平面上,使得在地图上的距离与实际距离近似相等,从而方便进行地理数据的可视化和分析。 要在Cesium中使用EPSG::900913投影,您可以在代码中使用相应的坐标系转换库(例如proj4)来将其他坐标系转换为EPSG::900913。您还可以查找提供的地理数据文件(如geojson或json文件)中的"crs"字段,查找与EPSG::900913或EPSG::3857相关的字段名称。 请注意,虽然EPSG::900913常用于Web地图应用程序中,但它实际上是一个非正式的投影代码,因此更推荐使用EPSG::3857来表示Web墨卡托投影。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Cesium出现Unknown crs name: urn:ogc:def:crs:EPSG:xxxx](https://blog.csdn.net/weixin_43972992/article/details/127066824)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [ol-cesium:OpenLayers-Cesium集成](https://download.csdn.net/download/weixin_42121086/14949890)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值