当前位置: 首页 > news >正文

如何 在 Cesium 中选取特定经纬度区域,特定视角 ,渲染成图片

如何 在 Cesium 中选取特定经纬度区域,特定视角 ,渲染成图片

DeepSeek-R1满血版 回答完成
深度思考完成 用时23秒
在 Cesium 中选择特定经纬度区域和视角并渲染为图片,可以通过 ‌定义地理范围 + 调整相机参数 + 截图‌ 实现。以下是完整方案:

‌步骤 1:定义经纬度区域‌
使用 Cesium.Rectangle 设置目标区域的经纬度范围(单位:弧度)。

javascript
Copy Code

// 定义矩形区域(例如:北京市范围)
const rectangle = Cesium.Rectangle.fromDegrees(
  115.7,   // 西经(West)
  39.4,    // 南纬(South)
  117.4,   // 东经(East)
  41.6     // 北纬(North)
);

‌步骤 2:调整相机到指定视角‌
通过 camera.setView 或 camera.flyTo 设置相机位置、俯仰角(Pitch)和航向角(Heading)。

javascript
Copy Code

// 直接设置视角(无动画)
viewer.camera.setView({
  destination: rectangle,  // 目标区域
  orientation: {
    heading: Cesium.Math.toRadians(0),   // 0度正北(方位角)
    pitch: Cesium.Math.toRadians(-45),    // -45度俯视
    roll: 0                              // 无旋转
  }
});

// 或使用动画飞行到目标视角
viewer.camera.flyTo({
  destination: rectangle,
  orientation: {
    heading: Cesium.Math.toRadians(0),
    pitch: Cesium.Math.toRadians(-45),
    roll: 0
  },
  complete: () => {
    // 确保相机到位后截图
    setTimeout(() => saveAsImage(), 1000);
  }
});

‌步骤 3:渲染并保存图片‌
使用 canvas.toDataURL 将当前视图导出为 PNG 或 JPEG。

javascript
Copy Code

function saveAsImage() {
  // 获取 Canvas 元素
  const canvas = viewer.scene.canvas;

  // 提高分辨率(可选,2倍高清)
  const originalScale = viewer.resolutionScale;
  viewer.resolutionScale = 2;

  // 等待渲染完成
  viewer.render();

  // 转换为图片
  const image = canvas.toDataURL('image/png');

  // 恢复分辨率
  viewer.resolutionScale = originalScale;

  // 创建下载链接
  const link = document.createElement('a');
  link.download = 'cesium-snapshot.png';
  link.href = image;
  link.click();
}

‌完整代码示例‌
html
Copy Code

<!DOCTYPE html>
<html>
<head>
  <link href="https://cesium.com/downloads/cesiumjs/releases/1.95/Build/Cesium/Widgets/widgets.css" rel="stylesheet">
  <script src="https://cesium.com/downloads/cesiumjs/releases/1.95/Build/Cesium/Cesium.js"></script>
</head>
<body>
  <div id="cesiumContainer" style="width: 100%; height: 600px;"></div>
  <script>
    const viewer = new Cesium.Viewer('cesiumContainer', {
      terrainProvider: Cesium.createWorldTerrain(),
      animation: false,  // 隐藏动画控件
      timeline: false    // 隐藏时间轴
    });

    // 定义目标区域(北京市范围)
    const rectangle = Cesium.Rectangle.fromDegrees(115.7, 39.4, 117.4, 41.6);

    // 设置相机视角(正俯视)
    viewer.camera.setView({
      destination: rectangle,
      orientation: {
        heading: 0,
        pitch: -Cesium.Math.PI_OVER_TWO,  // -90度(正俯视)
        roll: 0
      }
    });

    // 渲染并保存图片
    function saveAsImage() {
      const canvas = viewer.scene.canvas;
      viewer.render(); // 强制渲染
      const image = canvas.toDataURL('image/png');
      const link = document.createElement('a');
      link.download = 'beijing-snapshot.png';
      link.href = image;
      link.click();
    }

    // 等待2秒确保加载完成
    setTimeout(saveAsImage, 2000);
  </script>
</body>
</html>

‌关键参数说明‌
参数 说明
Cesium.Rectangle.fromDegrees() 定义矩形区域(经纬度转弧度)
camera.setView() 直接设置相机视角(无动画)
camera.flyTo() 飞行到目标视角(带动画)
orientation.pitch 俯仰角:-π/2 为垂直俯视,0 为水平视角
viewer.resolutionScale 提高截图分辨率(2倍更清晰)
‌高级功能‌
‌1. 自定义图片尺寸‌
通过 Cesium.Viewer 的 canvas 调整分辨率:

javascript
Copy Code
const canvas = viewer.scene.canvas;
canvas.width = 4096; // 4K分辨率
canvas.height = 4096;
viewer.forceResize(); // 强制重绘
‌2. 去除水印‌
隐藏 Cesium 版权信息:

javascript
Copy Code
viewer.cesiumWidget.creditContainer.style.display = ‘none’;
‌3. 透明背景‌
设置场景背景透明:

javascript
Copy Code
viewer.scene.backgroundColor = Cesium.Color.TRANSPARENT;
‌4. 批量截图‌
遍历多个区域自动截图:

javascript
Copy Code
const regions = [
{ name: ‘北京’, rect: Cesium.Rectangle.fromDegrees(115.7, 39.4, 117.4, 41.6) },
{ name: ‘上海’, rect: Cesium.Rectangle.fromDegrees(120.8, 30.7, 122.2, 31.8) }
];

regions.forEach((region, index) => {
viewer.camera.flyTo({
destination: region.rect,
complete: () => {
setTimeout(() => {
const image = viewer.scene.canvas.toDataURL(‘image/png’);
const link = document.createElement(‘a’);
link.download = ${region.name}-${index}.png;
link.href = image;
link.click();
}, 1000);
}
});
});
‌注意事项‌
‌跨域问题‌:如果加载的瓦片或模型来自其他域名,需配置服务器 CORS 支持。
‌渲染延迟‌:地形或 3D 模型加载可能需要等待 viewer.scene.render 事件。
‌内存限制‌:超高分辨率截图(如 8K)可能导致浏览器内存溢出。
通过此方案,您可以精确控制 Cesium 的视角和范围,并导出为高质量的图片。

相关文章:

  • 什么叫“架构”
  • 交通运输部4项网络与数据安全标准发布
  • Bash脚本编写基础指南
  • 对接印度尼西亚股票数据源API
  • Linux ELF文件格式
  • 【笔记ing】AI大模型-03深度学习基础理论
  • 深入剖析C++中 String 类的模拟实现
  • Java实现快速排序算法
  • Java 数据库访问工具 dbVisitor 的技术解析与同类工具比较
  • Kimi-VL 解读:高效 MoE 视觉语言模型VLM,兼顾长上下文与高分辨率
  • MySQL——学习InnoDB(1)
  • LabVIEW配电器自动测试系统
  • Xmind 2025 中文思维导图
  • MySQL表的使用(4)
  • 【3GPP核心网】【5G】精讲5G系统的策略和计费控制框架
  • 【口腔粘膜鳞状细胞癌】文献阅读
  • 《AI大模型应知应会100篇》第17篇:大模型的偏见与公平性问题
  • 多卡集群 - Docker命令来启动一个容器的实例
  • 【笔记ing】AI大模型-04逻辑回归模型
  • 【vue】class和styles绑定
  • 上海又现昆虫新物种:体长仅1.5毫米,却是凶猛的捕食者
  • 言短意长|把水搅浑的京东和美团
  • 用了半年的洗衣机竟比马桶还脏,别再这样洗衣服了
  • 广西出现今年首场超警洪水
  • 泽连斯基:俄军违反停火承诺,20日10时起前线俄炮击增加
  • 观察|中日航线加速扩容,航空公司如何抓住机会?