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

时间:2025-02-17 18:19:51

  

目录

一、(获取Cartesian2)

二、 (获取Cartesian3)

三、(穿透拾取,获取所有对象)

四、(获取加载地形后的经纬度(弧度)和高程)

五、 

六、 拾取图层


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

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

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

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

一、(获取Cartesian2

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

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

示例代码

let handler = new ();
      (function (event) {
        let pickedObject = ();
        if (!(pickedObject)) {
          ("没有拾取到空间对象")
          return;
        }
        (pickedObject)
      }, .LEFT_CLICK)

二、 (获取Cartesian3

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

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

与区别:见下面

示例代码

var handler = new ();
(function (event) {
     var position = ();
     ("三维空间坐标:", positionposition);
}, .LEFT_CLICK);


//获取坐标转经纬度
let handler = new ();
      (function (event) {
        let earthPosition = ();
        if ((earthPosition)) {
          let cartographic = (earthPosition);
          let lon = ().toFixed(5);
          let lat = ().toFixed(5);
          let height = (2);
          (earthPosition, {
            lon: lon,
            lat: lat,
            height: height,
          });
        }
      }, .LEFT_CLICK);

三、穿透拾取,获取所有对象

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

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

示例代码

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

四、(获取加载地形后的经纬度(弧度)和高程)

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

注意: 最好也开启深度检测( = true;)。

区别:

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

示例代码

var handler = new ();
(function (event) {
     var myray = ();
     var myposition = (myray, );
     ("当前场景坐标:", myposition);
}, .LEFT_CLICK);

五、 

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

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

示例代码

var handler = new ();
(function (event) {
     var position = (, );
     ("获取到的坐标:", position);
}, .LEFT_CLICK);

六、 拾取图层

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

注意: 

 (ray,scene)→Promise.<Array.<ImageryLayerFeatureInfo >>

示例代码

let handler = new ();
      ((event) => {
        let pickRay = ();
        let ImageryLayerFeatures = (pickRay, );
        if (!(ImageryLayerFeatures)) {
          ('没有影像图层要素信息选中');
        } else {
          (ImageryLayerFeatures, function (LayerFeatures) {
            //获取到图层数据
            if ( > 0) {
              (LayerFeatures)
            }
          });
        }
      }, .LEFT_CLICK);