Cesium获取视野边界的方法

Cesium.js获取视野边界坐标

本文没有太多需要手写的逻辑,只是对Cesium理解不够深、没有中文文档的情况下,查询起来比较费时,下面就是总结出来的方法。转载需注明出处。

1. 利用屏幕坐标转换

用百度搜索到的大部分雷同的博文(都是抄同一个人的)都是基于这个方法,这个方法适用于屏幕坐标落在球体上的情况,如果屏幕坐标落在球体之外,屏幕坐标转世界坐标会出错算出undefined。以下代码示例引自Super洛伽博客。

// 屏幕坐标转世界坐标
var pick= new Cesium.Cartesian2(window.innerWidth,window.innerHeight);
var cartesian = scene.globe.pick(viewer.camera.getPickRay(pick), scene);

// 世界坐标转地理坐标(弧度)
var cartographic = scene.globe.ellipsoid.cartesianToCartographic(cartesian);
// 或
var cartographic = Cesium.Cartographic.fromCartesian(cartesian);

//地理坐标(弧度)转经纬度坐标
var point=[ cartographic.longitude / Math.PI * 180, cartographic.latitude / Math.PI * 180];

2. 利用方法viewer.camera.computeViewRectangle

因为要考虑屏幕点落在球体外的情况,我选择了google…然后找到了这个方法computeViewRectangle:计算视野矩形四条边界的地理坐标(弧度)。
得到的返回值示例:

result = {
    west: 2.024049072178046,
    south: 0.6802243852966677,
    east: 2.025114792449733,
    north: 0.681132284488564
}

然后通过弧度转经纬度,即可获取视野边界的经纬度坐标。
代码示例如下:

var rectangle = viewer.camera.computeViewRectangle();
// 弧度转为经纬度,west为左(西)侧边界的经度,以下类推
var west =rectangle.west / Math.PI * 180;
var north = rectangle.north / Math.PI * 180;
var east = rectangle.east / Math.PI * 180;
var south = rectangle.south / Math.PI * 180;
// 鉴于高德、leaflet获取的边界都是southwest和northeast字段来表示,本例保持一致性
var bounds = {
    southwest: {
        lng: west,
        lat: south
    },
    northeast: {
        lng: east,
        lat: north
    }
}
return bounds;

这个故事告诉我们善用google…

本文榕树岛原创,转载需注明出处。

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明
要在Cesium中动态获取圆的边界点,您可以使用Cesium的插值方法。以下是一个示例代码,展示如何使用插值方法获取圆的边界点: ```javascript // 创建一个Cesium Viewer var viewer = new Cesium.Viewer('cesiumContainer'); // 圆的参数 var center = Cesium.Cartesian3.fromDegrees(lon, lat); // 圆心经纬度坐标 var radius = 10000; // 圆的半径,单位为米 // 定义圆的边界点数量 var numberOfPoints = 360; // 圆周上的点数 // 创建圆的实体 var circleEntity = viewer.entities.add({ position: center, ellipse: { semiMinorAxis: radius, semiMajorAxis: radius, material: Cesium.Color.RED.withAlpha(0.5) } }); // 获取圆周的边界点 var circlePositions = []; for (var i = 0; i < numberOfPoints; i++) { var longitude = Cesium.Math.toRadians(i * 360 / numberOfPoints); var latitude = 0; var cartesian3Position = Cesium.Cartesian3.fromRadians(longitude, latitude, 0); var cartesian3PositionScaled = Cesium.Cartesian3.multiplyByScalar(cartesian3Position, radius, new Cesium.Cartesian3()); var cartesian3PositionTranslated = Cesium.Cartesian3.add(center, cartesian3PositionScaled, new Cesium.Cartesian3()); var cartographic = Cesium.Cartographic.fromCartesian(cartesian3PositionTranslated); var longitudeDegrees = Cesium.Math.toDegrees(cartographic.longitude); var latitudeDegrees = Cesium.Math.toDegrees(cartographic.latitude); circlePositions.push(longitudeDegrees, latitudeDegrees); } console.log(circlePositions); ``` 此代码将生成一个以给定经纬度为圆心,给定半径的圆,并使用插值方法获取圆周上的边界点坐标。在这个示例中,我们通过计算每个角度对应的经纬度,并将其转换为笛卡尔坐标,然后再将其转换为经纬度坐标。最终,我们将所有边界点的经纬度坐标存储在`circlePositions`数组中。 请注意,此示例假设您已经有一个包含Cesium库的HTML页面,并且'id'为'cesiumContainer'的div元素用于显示地球。您需要根据您的实际情况进行适当的调整。 这样,您就可以动态获取圆的边界点坐标了。根据需要,您可以进一步处理或使用这些坐标。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值