Cesium数据根据经纬度下载

Cesium数据按经纬度下载参数解析
了解Cesium数据根据经纬度下载时所需的参数,包括左上角和右下角经纬度、层级。经纬度差和层级号用于确定影像分辨率和下载范围,通过计算行列号实现精确下载。

Cesium数据根据经纬度下载我们需要知道哪些参数:左上角经纬度、右下角经纬度和层级

我们假如说左上角的经度纬度分别为_dLon1、_dLat1,右下角的经度纬度分别为_dLon2、_dLat2,层级为_nLev;

Question 1:为什么是左上角和右下角呢?

                       因为bingmap是以左上角为行列号起点,google也是以左上角为行列号起点的,而readymap是以左下角为起点的。影像数据也是以左上角为下载标识。

Question  2:为什么还需要层级号呢?

                       如果没有层级号,我们不知道对方需要下载的影像分辨率,从而导致下载数据不明确,有了层级号,我们可以下载对应层级的影像数据。


根据层级号,我们可以计算出经度差和纬度差。

经度差double lon_dlt = 360.0/pow(2.0,_nLev);

纬度差 double lat_dlt = 180.0/pow(2.0,lev);

根据经纬度差,我们可以计算出左上角和右下角的行列号

    row_lon1 = (lon1+180.0)/lon_dlt;
    row_lon2 = (lon2+180.0)/lon_dlt;
    col_lat1 =  pow(2.0,lev) - (lat1+90.0)/lat_dlt; // lat1大  -> 编号小(这个地方需要注意),因为Cesium的行列号起点在左上角,经纬度原点在中间,所以在计算纬度列号时需要将最大列号减去(lat1+90.0)/lat_dlt。
    col_lat2 = pow(2.0,lev) - (lat2+90.0)/lat_dlt;   


得到指定区域的行列号,我们就可以很方便的去下载了。


Cesium 中,`WebMapTileServiceImageryProvider`、`WebMercatorTilingScheme`、`GeographicTilingScheme` 等类常用于根据**经纬度范围**(`Rectangle`)和**层级**(`level`)计算出对应的 **XY 瓦片编**,这在实现自定义影像或地形瓦片加载时非常有用。 --- ## ✅ 核心原理 Cesium 使用 `TilingScheme` 来管理瓦片坐标系统,常见的有两种: - `Cesium.WebMercatorTilingScheme`:墨卡托投影(Web 墨卡托,常用于网络地图) - `Cesium.GeographicTilingScheme`:经纬度投影(WGS84) 瓦片编规则如下: - 每一级(level)瓦片数为 $2^{\text{level}} \times 2^{\text{level}}$ - 左上角为 `(0, 0)`,右下角为 $(2^{\text{level}} - 1, 2^{\text{level}} - 1)$ --- ## ✅ 示例代码:根据经纬度矩形和层级计算 XY 瓦片编 ```javascript function getTileXYFromRectangle(rectangle, level, tilingScheme = new Cesium.WebMercatorTilingScheme()) { const ellipsoid = tilingScheme.ellipsoid; const northEastCartographic = Cesium.Rectangle.northeast(rectangle); const southWestCartographic = Cesium.Rectangle.southwest(rectangle); const xTiles = 1 << level; // 2^level const yTiles = xTiles; const swXy = tilingScheme.positionToTileXY( ellipsoid.cartographicToCartesian(southWestCartographic), level ); const neXy = tilingScheme.positionToTileXY( ellipsoid.cartographicToCartesian(northEastCartographic), level ); const minX = Math.max(0, Math.min(xTiles - 1, swXy.x)); const maxX = Math.max(0, Math.min(xTiles - 1, neXy.x)); const minY = Math.max(0, Math.min(yTiles - 1, neXy.y)); const maxY = Math.max(0, Math.min(yTiles - 1, swXy.y)); return { minX, maxX, minY, maxY, level }; } ``` --- ## 🧪 使用示例 ```javascript const viewer = new Cesium.Viewer('cesiumContainer'); const rectangle = Cesium.Rectangle.fromDegrees(-120, 30, -60, 60); // 经纬度矩形 const level = 5; const tileRange = getTileXYFromRectangle(rectangle, level); console.log('Tile range:', tileRange); // 输出类似: { minX: 12, maxX: 18, minY: 9, maxY: 14, level: 5 } // 可用于加载对应范围的瓦片 for (let y = tileRange.minY; y <= tileRange.maxY; y++) { for (let x = tileRange.minX; x <= tileRange.maxX; x++) { console.log(`Load tile x=${x}, y=${y}, level=${level}`); } } ``` --- ## 🧠 原理解释 | 方法 | 说明 | |------|------| | `Cesium.Rectangle.northeast()` | 获取矩形的东北角点 | | `Cesium.Rectangle.southwest()` | 获取矩形的西南角点 | | `tilingScheme.positionToTileXY(cartesian, level)` | 将坐标转换为该层级下的瓦片编 | | `1 << level` | 快速计算 $2^{\text{level}}$ | | `Math.min(..., xTiles - 1)` | 保证不越界 | --- ## ✅ 支持两种投影方式 ### 1. Web Mercator(推荐用于网络地图) ```javascript const tilingScheme = new Cesium.WebMercatorTilingScheme(); ``` ### 2. WGS84(经纬度) ```javascript const tilingScheme = new Cesium.GeographicTilingScheme(); ``` --- ## ✅ 实际应用场景 | 应用场景 | 说明 | |----------|------| | 自定义影像瓦片加载 | 根据视图范围加载对应的瓦片图像 | | 地形瓦片加载 | 用于 `CustomHeightmapTerrainProvider` 加载地形数据 | | 瓦片缓存 | 预加载或缓存特定区域的瓦片数据 | | 多级 LOD(细节层次) | 根据相机高度自动切换层级和瓦片范围 | | 瓦片范围可视化 | 在地图上高亮显示请求的瓦片区域 | --- ##
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值