Cesium 获取屏幕窗口经纬度范围(2D和3D)

本文介绍了一种在Cesium中优化大量地理数据加载的方法,通过后台聚合减少数据请求量,提升加载速度。文章详细解释了如何获取当前屏幕的地理范围,并将此信息用于后台的数据聚合处理。

背景:

由于entity实体过多,而又要一次性加载,所以用聚合(后台聚合),前端cesium也可以聚合,cesium前端渲染大量点很快很快的,但是由于请求后台时数据量太大,光请求时间都很长。不能忍受,所以改为后台聚合。后台聚合用的是pg的空间函数。前端去后台请求时  需要要携带当前屏幕所在地理范围参数(经纬度格式) 

获取当前屏幕所在地理范围

getViewExtend() {
      let params = {};
      let extend = viewer.camera.computeViewRectangle();
      if (typeof extend === "undefined") {
        //2D下会可能拾取不到坐标,extend返回undefined,所以做以下转换
        let canvas = viewer.scene.canvas;
        let upperLeft = new Cesium.Cartesian2(0, 0);//canvas左上角坐标转2d坐标
        let lowerRight = new Cesium.Cartesian2(
          canvas.clientWidth,
          canvas.clientHeight
        );//canvas右下角坐标转2d坐标

        let ellipsoid = viewer.scene.globe.ellipsoid;
        let upperLeft3 = viewer.camera.pickEllipsoid(
          upperLeft,
          ellipsoid
        );//2D转3D世界坐标

        let lowerRight3 = viewer.camera.pickEllipsoid(
          lowerRight,
          ellipsoid
        );//2D转3D世界坐标

        let upperLeftCartographic = viewer.scene.globe.ellipsoid.cartesianToCartographic(
          upperLeft3
        );//3D世界坐标转弧度
        let lowerRightCartographic= viewer.scene.globe.ellipsoid.cartesianToCartographic(
          lowerRight3
        );//3D世界坐标转弧度

        let minx = Cesium.Math.toDegrees(upperLeftCartographic.longitude);//弧度转经纬度
        let maxx = Cesium.Math.toDegrees(lowerRightCartographic.longitude);//弧度转经纬度

        let miny = Cesium.Math.toDegrees(lowerRightCartographic.latitude);//弧度转经纬度
        let maxy = Cesium.Math.toDegrees(upperLeftCartographic.latitude);//弧度转经纬度

        console.log("经度:" + minx + "----" + maxx);
        console.log("纬度:" + miny + "----" + maxy);

        params.minx = minx;
        params.maxx = maxx;
        params.miny = miny;
        params.maxy = maxy;
      } else {
        //3D获取方式
        params.maxx = Cesium.Math.toDegrees(extend.east);
        params.maxy = Cesium.Math.toDegrees(extend.north);

        params.minx = Cesium.Math.toDegrees(extend.west);
        params.miny = Cesium.Math.toDegrees(extend.south);
      }
      return params;//返回屏幕所在经纬度范围
    }

<think>嗯,用户想知道在Cesium中如何获取当前视角的经纬度范围。首先,我需要回忆一下Cesium的相关API。Cesium的视图是由相机(Camera)控制的,所以可能需要通过相机的位置方向来计算可见范围。 我记得Cesium中有一个Camera类,可能包含视锥体的信息。视锥体的范围决定了当前可见的区域。不过直接获取经纬度范围可能需要计算视锥体的四个角或者使用某些工具函数。 另外,Cesium的视图是三维的,可能要考虑地球曲率的影响。所以简单的矩形范围可能不够准确,特别是当视角倾斜或者高度较高的时候。这时候可能需要使用视锥体与地球表面的交集来获取精确的范围。 可能还需要用到Scene类的computeViewRectangle方法。这个方法可以计算当前视图在椭球体上的矩形范围,返回的是西经、南纬、东经、北纬的值。这个方法应该能直接得到经纬度范围,但要注意椭球体的参数,默认是WGS84。 不过这个方法可能会有误差,特别是在视角接近两极或者视图倾斜的情况下。所以需要验证在不同情况下的准确性。此外,如果场景中有地形,地形的高低起伏也会影响可见范围,这时候可能需要考虑地形的影响,但computeViewRectangle可能已经考虑了这些因素。 步骤大概是这样的:首先获取当前的Scene实例,然后调用computeViewRectangle方法,传入椭球体参数(默认是Ellipsoid.WGS84),返回的Rectangle对象就包含了当前的经纬度范围。然后可以从Rectangle中提取west、south、east、north属性,转换成度数。 另外,这个方法可能在渲染循环中调用,比如使用PostRender事件来实时获取变化的视角范围。或者在用户交互后触发获取当前的范围。 需要注意处理可能的null返回值,比如当视口不在地球上时,computeViewRectangle可能返回null,这时候需要做错误处理。 然后,用户可能需要代码示例。所以我要提供一个JavaScript的示例,演示如何获取并打印当前的经纬度范围。同时提醒用户关于异步渲染的问题,可能需要使用setTimeout或者在PostRender事件中处理。 最后,相关问题可以涉及如何监听视角变化、如何将范围应用于空间索引或者可视化,比如与GeoWave相关的应用,可能需要将范围参数传递给后端进行数据查询。</think>在Cesium获取当前视角的经纬度范围可通过以下步骤实现: ### 1. 核心方法:使用Scene.computeViewRectangle() Cesium的$scene.computeViewRectangle()$方法可以计算当前视口在WGS84椭球体上的经纬度范围矩形[^1]。该方法会返回一个$Rectangle$对象,包含以下属性: - **west**:西侧经度(弧度) - **south**:南侧纬度(弧度) - **east**:东侧经度(弧度) - **north**:北侧纬度(弧度) ### 2. 代码实现 ```javascript const viewer = new Cesium.Viewer('cesiumContainer'); // 获取当前视图范围 const rectangle = viewer.scene.computeViewRectangle(Cesium.Ellipsoid.WGS84); // 将弧度转换为角度 const westDeg = Cesium.Math.toDegrees(rectangle.west); const southDeg = Cesium.Math.toDegrees(rectangle.south); const eastDeg = Cesium.Math.toDegrees(rectangle.east); const northDeg = Cesium.Math.toDegrees(rectangle.north); console.log(`经度范围: ${westDeg}° ~ ${eastDeg}°`); console.log(`纬度范围: ${southDeg}° ~ ${northDeg}°`); ``` ### 3. 注意事项 - **异步渲染问题**:建议在$setTimeout$或$viewer.scene.postRender$事件中调用,确保摄像机位置更新完成 - **地形影响**:若开启地形,实际可见范围可能小于计算结果 - **极端视角**:当摄像机垂直向下时精度最高,倾斜视角下范围计算可能存在误差 ### 4. 扩展应用 此经纬度范围可用于: - 动态加载该区域的地理数据(如通过GeoWave进行时空索引查询) - 与GeoServer服务结合实现瓦片地图的按需加载 - 空间分析时限定计算范围
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值