Cesium 拾取有多个方法,下面就分别说明一下几种常用方法都是做什么用的,在什么场景下使用。
1.
通过坐标位置,拾取 Entity
、 Primitive
、3D-Tiles
(Cesium3DTileFeature
)对象。
例如获取 Entity
,通过position(坐标位置)
获取到 pick
对象,通过即可拾取当前的
entity
对象。
var pick = viewer.scene.pick(position);
注意: 只能获取一个对象,并且获取的是最顶部的对象。如果拾取点没有对象,则为
undefined
使用场景: 主要是用来拾取
Entity
、 Primitive
、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 = ""
}
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
2.
主要是用于拾取对应位置的世界坐标,例如:拾取点击模型表面的坐标。
注意: 一定要开启深度检测( = 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.
可以理解为穿透拾取,是从当前拾取位置获取所有对象的对象列表(entity的集合),列表按其在场景中的视觉顺序(从前到后)排序(通过for循环可以获取当前坐标下的所有entity)。
注意: drillPick
和 Pick
不同,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.
找到射线与渲染的地球表面之间的交点(射线必须以世界坐标给出),返回的是世界坐标。一般用来获取加载地形后的经纬度和高程。
注意: 一定要开启深度检测( = 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.
通过一个必选的屏幕坐标,获取椭圆球体表面的一个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);
本文在后续遇到详细场景的时候会继续补充