Cesium定位专题

3,620 阅读5分钟

三维定位专题

可定位的对象包括:坐标点、矩形范围、entities、3dtiles、gltf、kml、geojson、影像、地形geometry

定位思维导图.png 在三维场景中,可以通过以下几种方式进行定位。 viewer.flyto():将相机飞到提供的实体、实体或数据源。 viewer.zoomTo():异步设置相机以查看提供的实体、实体或数据源。 Camare.flyTo():创建从当前相机位置到新位置的动画相机飞行 Camera.flytoBoundingSphere():将相机飞到当前视图包含提供的边界球的位置。 Camera.setView():设定相机在特定的位置和方向 Camera.lookAt():定位并定位摄象机已给定偏移量瞄准目标点 Camera.lookAtTransform(): 使用目标和变换矩阵设置相机位置和方向 Camera.flyHome():将相机飞到主视图。 Camera.viewBoundingSphere(): 设置相机,以便当前视图包含提供的边界球。

1. flyTo() 、flytoBoundingSphere()

1.1 viewer.flyto(target,options)

target 要查看的实体、实体数组、实体集合、数据源、Cesium3DTileset、点云或图像层。还可传递一个解析为已提到类型之一的Promise。
Entity、EntityCollection、DataSource、ImageLayer、Cesium3DTileset...
options duration number 以秒为单位的飞行持续时间,默认 3
maximumHeightnumber 飞行高峰时的最大高度
offset航向间距范围 在以目标为中心的本地东西北上参考系中与目标的偏移量

将相机飞到提供的实体或数据源。如果数据源仍在加载过沉重或可视化仍在加载中,则此方法在执行飞行之前等待数据准备好。

 viewer.flyTo(plygonEntity, {
        duration: 6,
        maximumHeight: 5000000,
        offset: new Cesium.HeadingPitchRange(1.1,0.5,100),//(heading,pich,range)
      });

1.2 Camera.flyto(options)

optionsobject
destination摄像机在 WGS84(世界)坐标中的最终位置,或从自上而下视图可见的矩形。
orientation包含方向和向上属性或航向、俯仰和滚动属性的对象
duration以秒为单位的飞行持续时间。如果省略,Cesium 会尝试根据飞行的距离计算理想的持续时间。
complete飞行完成时执行的函数。
cancel航班取消时执行的功能。
endTransform飞行完成时相机所在的参考帧。
maximumHeight飞行高峰时的最大高度。
pitchAdjustHeight如果相机飞行的高度高于该值,则在飞行过程中调整俯仰以向下看,并将地球保持在视口中。
flyOverLongitude地球上的两点之间总是有两种方式。此选项强制相​​机选择战斗方向以飞越该经度。
flyOverLongitudeWeight仅当该方式不长于短途时间 flyOverLongitudeWeight 时,才飞越通过 flyOverLongitude 指定的 lon。
convert是否将目的地从世界坐标转换为场景坐标(仅在不使用 3D 时相关)。默认为 true 。
easingFunction控制如何在飞行期间内插时间。

使用camera.flyto进行定位,定位到给定的位置点或面

document.getElementById("CameraFlyTo").onclick = function (event) {
      viewer.camera.flyTo({
        destination: Cesium.Rectangle.fromDegrees(107.62, 35.5, 108.1, 35.9), //(xmin, ymin, xmax, ymax)飞到某个点,注意是世界坐标
        //飞完之后设置相机的角度
        // complete: function () {
        //   viewer.scene.camera.setView({
        //     //初始化相机经纬度
        //     destination: new Cesium.Cartesian3.fromDegrees(107.62, 35.9, 5000), //通过最后一个参数可以调节视角高度(初始页面地球大小调节)
        //     orientation: {
        //       heading: Cesium.Math.toRadians(0),
        //       pitch: Cesium.Math.toRadians(-20.0), //从上往下看
        //       roll: 0,
        //     },
        //   });
        // },
      });

1.3 viewer.flyto和Camera.flyTo的区别

view.flyto.png 图 viewer.flyto(plygonEntity)

camera.flyto.png 图 camera.flyto(plygonEntity)

由图可见,使用camera.flyto进行定位,定位视觉是90度俯视;而viewer的定位方法内部是调用Camera的相关定位方法,针对不同的定位对象,通过计算得出传入实体的合适定位方位和摄象机视角,然后定位。viewer的定位zoomTo,flyTo等方法是较高级别的函数,可以定位到Entity、3dtile、DataSource等添加到三维球上显示的实体,而camera定位是定位到具体位置。

通常使用camera来定位,但当需要加上一个倾斜角的时候,可能定位的结果就和预想的区别很大。 当相机的pitch不是默认值得时候,就会出现,camera定位的位置并不在屏幕中心位置,这时候使用viewer来定位就能解决问题

参考:blog.csdn.net/pyx6119822/…

1.4 camera.flytoBoundingSphere(boundingSphere, options)

boundingSphere:要查看的边界球体。 options:一些可选属性,包括飞行时间duration等 将相机移到当前视图包含所提供的包围球的位置。

  const boundingSphere = new Cesium.BoundingSphere(
    new Cesium.Cartesian3.fromDegrees(107.82, 36),
    100000
  );//(center,radius)边界球中心点,边界球半径
  viewer.camera.flyToBoundingSphere(boundingSphere, { duration: 3 });

2. viewer.zoomTo(target,offset)

target:定位到的实体、实体集合、数据源等。 offset:从本地东西北上参考框架中实体中心的偏移量。 此方法,相机立即定位到某个位置。

  viewer.zoomTo(pointEntity, new Cesium.Cartesian3(0.0, -4790000.0, 3930000.0));

3. lookAt 、lookAtTransform

3.1 camera.lookAt(target, offset)

target:世界坐标中的目标位置。 offset:在以目标为中心的本地东西北上参考系中与目标的偏移。 相机立即定位到某个位置,且相机锁住在此位置,即lookAt这种方法会将定位中心点锁定为视图中心点。

  viewer.camera.lookAt(
    point,
    new Cesium.Cartesian3(0.0, -4790000.0, 3930000.0)
  );

3.1 camera.lookAtTransform(transform, offset)

transform:定义参考系的变换矩阵。 offset:在以目标为中心的参考框架中与目标的偏移量。 使用目标和变换矩阵设置相机位置和方向。

  const transform = Cesium.Transforms.eastNorthUpToFixedFrame(point);
  viewer.camera.lookAtTransform(
    transform,
    new Cesium.Cartesian3(0.0, -4790000.0, 3930000.0)
  );

4. Camera.flyHome(duration)

duration:以秒为单位的飞行持续时间。若省略,Cesium会尝试根据飞行的距离计算理想的持续时间 将相机飞到主视图。使用 Camera#.DEFAULT_VIEW_RECTANGLE 设置 3D 场景的默认视图。 2D 和哥伦布视图的主视图显示整个地图。

    viewer.camera.flyHome();

5. setView(options)

设置相机位置、方向和变换。

  viewer.camera.setView({
    //初始化相机经纬度
    destination: new Cesium.Cartesian3.fromDegrees(107.62, 35.9, 50000000), //通过最后一个参数可以调节视角高度(初始页面地球大小调节)
    orientation: {
      heading: Cesium.Math.toRadians(175.0),
      pitch: Cesium.Math.toRadians(-90.0), //从上往下看
      roll: 0,
    },
  });