Cesium 点击获取/拾取(PICK)的不同用法

Cesium 拾取有多个方法,下面就分别说明一下几种常用方法都是做什么用的,在什么场景下使用。

1. viewer.scene.pick

通过坐标位置,拾取 EntityPrimitive3D-TilesCesium3DTileFeature)对象。

例如获取 Entity ,通过position(坐标位置)获取到 pick 对象,通过pick.id即可拾取当前的entity对象。

var pick = viewer.scene.pick(position);

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

使用场景: viewer.scene.pick 主要是用来拾取 EntityPrimitive、3D-Tiles。拾取后,可以用于改变对象的属性参数。

示例代码: 点击获取图标,修改图标的图片

var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
// 设置左键点击事件
handler.setInputAction(function (event) {
  // 获取 pick 拾取对象
  var pick = viewer.scene.pick(event.position);
  // 判断是否获取到了 pick 
  if (Cesium.defined(pick)) {
    // 修改拾取到的entity的样式
    pick.id.billboard.image = "xxx.png"
  }
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);

2. viewer.scene.pickPosition

主要是用于拾取对应位置的世界坐标,例如:拾取点击模型表面的坐标。

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

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

示例

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

3. viewer.scene.drillPick

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

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

使用场景: 适用于多个对象重叠在一个位置,并且要获取到多个对象的情况。

示例

var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
handler.setInputAction(function (event) {
	var pickedObjects = scene.drillPick(event.position);
	// pickedObjects 使用for循环 可以拿到所有entity
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);

4. viewer.scene.globe.pick

找到射线与渲染的地球表面之间的交点(射线必须以世界坐标给出),返回的是世界坐标。一般用来获取加载地形后的经纬度和高程。

注意: 一定要开启深度检测(viewer.scene.globe.depthTestAgainstTerrain = true;

使用场景: 一般用于获取点击处地球表面的世界坐标(有地形),注意:不包括模型、倾斜摄影表面。

示例

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

5. viewer.scene.camera.pickEllipsoid

通过一个必选的屏幕坐标,获取椭圆球体表面的一个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);

本文在后续遇到详细场景的时候会继续补充

  • 12
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Cesium是一个基于Web的三维地图平台,可以通过点击获取tileset。 首先,tileset是一种用于展示和存储地理数据的方式。在Cesium中,地理数据被分成了小的瓦片(tiles),每个瓦片都包含了一部分地理信息。 要通过点击获取tileset,首先需要在Cesium地图中加载并显示tileset。可以使用Cesium的load方法来加载tileset文件,例如: ```javascript var viewer = new Cesium.Viewer('cesiumContainer'); var tilesetUrl = 'path/to/tileset.json'; var tileset = viewer.scene.primitives.add( new Cesium.Cesium3DTileset({ url: tilesetUrl }) ); ``` 其中,`path/to/tileset.json`是tileset文件的路径,可以是本地路径或者网络路径。 加载并显示tileset后,可以使用Cesium的鼠标点击事件来获取点击的瓦片信息。在Cesium中,可以通过添加`MouseEvent`监听器来监听鼠标点击事件,例如: ```javascript viewer.canvas.addEventListener('click', function(event) { var pick = viewer.scene.pick(event.position); if (Cesium.defined(pick) && Cesium.defined(pick.primitive)) { var tile = pick.primitive; // 在这里可以获取点击的瓦片信息,进行相应的操作 } }); ``` 在上面的代码中,`event.position`包含了点击事件的鼠标位置信息,`viewer.scene.pick`方法可以根据鼠标位置来获取点击的瓦片信息。 通过获取到的瓦片信息,可以根据需要进行相应的操作,比如获取瓦片的位置、属性、几何形状等等。 总之,要通过点击获取tileset,在Cesium中需要先加载并显示tileset,然后通过鼠标点击事件来获取瓦片信息,并进行后续的处理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值