Cesium离线部署影像+地形:从0到1

news2025/2/23 22:27:07

Cesium加载本地影像+地形

本教程记录的是小白从0-1搭建本地cesium服务的过程,踩的各种坑通过查找资料都一一填补,最终达到的效果是在本地上能够跑官网飞机航线的例子。效果如下:
在这里插入图片描述

主要流程如下:

  • 1、下载离线地图和地形
  • 2、nginx部署静态文件
  • 3、cesium调用本地影像和地形

1、下载离线地图和地形

全网各种影像、地形下载器要么是收费,要么不好用,要么下载下来带水印。在github上大海捞针,找到了珍贵的,免费的!!完整的!!全球影像地图!!直接上链接。

感谢这位同性交友网名为sunhongyue4500的博主:影像地形下载链接

2、nginx部署静态文件

官网上下载nginx,然后把下载好的离线影像和地形放在html文件夹里面。在这里插入图片描述
顺着nginx的目录文件,我在html里面新建了一个static文件夹,然后放在里面。
在这里插入图片描述
然后配置./nginx/conf/nginx.conf文件

server {
        listen       666;
        server_name  localhost;
        #charset koi8-r;
        #access_log  logs/host.access.log  main;
        location / {
            root   html;
	    	index  index.html index.htm;
        }
		location /static/ {
		alias E:/Tools/nginx-1.24.0/html/static/;
		add_header Access-Control-Allow-Origin *;
		#autoindex on;
        #autoindex_localtime on;
		#index 0.png;
	}

实际上这里不需要配置/static/ 也可以,直接按照文件夹的目录来寻址也可。能按照如下地址访问得到,说明已经发布成功^ ~ ^
在这里插入图片描述

3、cesium调用

  • cesium支持的坐标系有两个,分别是WGS64(EPSG:4326)和墨卡托(EPSG:3785),而瓦片服务有TMS和TWMS两种,
  • 需要注意的是,cesiums默认TWMS服务,默认的是Mercator坐标系切片,至于这两者的切片区别参考:https://blog.csdn.net/weixin_43336525/article/details/134926608WMS
  • 在Cesium中,如果你使用的坐标系为EPSG:4326(即WGS84经纬度坐标系),而瓦片服务遵循TMS(Tile Map Service)规范,确实需要注意瓦片的行列坐标与Cesium默认的Web Mercator投影下的瓦片坐标不一致。TMS规范中,y坐标是从南向北递增的,而Web Mercator下是从北向南递增的,这通常会导致瓦片显示混乱。
  • 所以需要reverseY,这样就ok了。所以本质上还是要探索坐标系(EPSG:4326、EPSG:3758)、瓦片服务(TMS、WMTS)这两者,就可以对其进行修改。
    总之这里使用reverseY而不是y,原因是我的地图瓦片服务是WMS
    其次后台我使用了nginx部署静态资源
    参考1
    参考2

完整代码:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>cesium第一课</title>
    <script src="../lib/Cesium/Cesium.js"></script>
    <link href="../lib/Cesium/Widgets/widgets.css" rel="stylesheet" />
    <style>
      html,
      body {
        margin: 0px;
        padding: 0px;
      }
    </style>
  </head>
  <body>
    <div id="zk-cesiumContainer"></div>
    <script>
      // 影像图
      const custom = new Cesium.UrlTemplateImageryProvider({
        // url: "http://127.0.0.1:666/static/image_data/{z}/{x}/{y}.png",
        url: "http://127.0.0.1:666/static/map/{z}/{x}/{reverseY}.jpg",
        
        tilingScheme: new Cesium.GeographicTilingScheme(),
      });
      // 地形
      const terrainLayer = new Cesium.CesiumTerrainProvider({
        url: "http://127.0.0.1:666/static/terrain/",
        requestVertexNormals: true, // 请求照明
        requestWaterMask: true, // 请求水波纹效果
      });

      // 下一步:部署离线地形!!
      var viewer = new Cesium.Viewer("zk-cesiumContainer", {
        // imageryProvider: custom,
        // terrainProvider: terrainLayer,
        baseLayerPicker: false,
        geocoder: false,
      });

      // 整合资源
      viewer.imageryLayers.addImageryProvider(custom);
      // viewer.terrainProvider = terrainLayer
      // viewer.terrainExaggeration = 1

      fetch("../resources/radar_airline.json")
        .then((response) => {
          // 首先检查响应是否成功
          if (!response.ok) {
            throw new Error("Network response was not ok");
          }
          return response.json(); // 解析 JSON 数据
        })
        .then((data) => {
          // 此时 data 就是解析后的 JSON 数据

          const flightData = data;
          console.log(flightData);

          const timeStepInSeconds = 30; // 每隔30s取一个radar点
          const totalSeconds = timeStepInSeconds * (flightData.length - 1);
          const start = Cesium.JulianDate.fromIso8601("2020-03-09T23:10:00Z");
          const stop = Cesium.JulianDate.addSeconds(
            start,
            totalSeconds,
            new Cesium.JulianDate()
          );
          viewer.clock.startTime = start.clone();
          viewer.clock.stopTime = stop.clone();
          viewer.clock.currentTime = start.clone();
          viewer.timeline.zoomTo(start, stop);
          // Speed up the playback speed 50x.
          viewer.clock.multiplier = 50;
          // Start playing the scene.
          viewer.clock.shouldAnimate = true;

          // The SampledPositionedProperty stores the position and timestamp for each sample along the radar sample series.
          const positionProperty = new Cesium.SampledPositionProperty();

          for (let i = 0; i < flightData.length; i++) {
            const dataPoint = flightData[i];

            // Declare the time for this individual sample and store it in a new JulianDate instance.
            const time = Cesium.JulianDate.addSeconds(
              start,
              i * timeStepInSeconds,
              new Cesium.JulianDate()
            );
            const position = Cesium.Cartesian3.fromDegrees(
              dataPoint.longitude,
              dataPoint.latitude,
              dataPoint.height
            );
            // Store the position along with its timestamp.
            // Here we add the positions all upfront, but these can be added at run-time as samples are received from a server.
            positionProperty.addSample(time, position);

            viewer.entities.add({
              description: `Location: (${dataPoint.longitude}, ${dataPoint.latitude}, ${dataPoint.height})`,
              position: position,
              point: { pixelSize: 10, color: Cesium.Color.RED },
            });
          }

          // STEP 4 CODE (green circle entity)
          // Create an entity to both visualize the entire radar sample series with a line and add a point that moves along the samples.
          async function loadModel() {
            // Load the glTF model from Cesium ion.
            const airplaneEntity = viewer.entities.add({
              availability: new Cesium.TimeIntervalCollection([
                new Cesium.TimeInterval({ start: start, stop: stop }),
              ]),
              position: positionProperty,
              // Attach the 3D model instead of the green point.
              model: {
                uri: "../resources/CesiumDrone.glb",
                minimumPixelSize: 128,
                maximumScale: 20000,
              },
              // Automatically compute the orientation from the position.
              orientation: new Cesium.VelocityOrientationProperty(
                positionProperty
              ),
              path: new Cesium.PathGraphics({ width: 3 }),
            });
            viewer.trackedEntity = airplaneEntity;
          }

          loadModel();
        })
        .catch((error) => {
          // 处理任何在请求或解析过程中发生的错误
          console.error(
            "There has been a problem with your fetch operation:",
            error
          );
        });
    </script>
  </body>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1810902.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

工业机器人远程运维,增强智慧工厂运营管理

1、需求背景 随着工业自动化技术的普及和工业机器人应用的增加&#xff0c;制造业对于生产线稳定性和效率的要求不断提高。然而&#xff0c;传统的现场监控方式存在着地理位置限制、实时监控难度大以及诊断能力有限等问题&#xff0c;迫切需要一种更具灵活性和效率的监控方式。…

FFMpeg解复用流程

文章目录 解复用流程图复用器与解复用器小结 解复用流程图 流程图&#xff0c;如上图所示。 复用器与解复用器 复用器&#xff0c;就是视频流&#xff0c;音频流&#xff0c;字幕流&#xff0c;其他成分&#xff0c;按照一定规则组合成视频文件&#xff0c;视频文件可以是mp4…

“百变换装师”之证照之星

拍证件照是一件很麻烦的事吗&#xff1f;证件照编辑是一件复杂的事吗&#xff1f;只有专业人员才能对证件照进行编辑吗&#xff1f;以前可能是&#xff0c;但今天小编将给大家分享一个证件照编辑软件证照之星&#xff0c;它将使每一个人都能具备简单的证件照编辑技能。 证照之星…

cve_2017_12635-CouchDB垂直权限绕过

1.采用参考 https://www.cnblogs.com/mlxwl/p/16577781.html vulfocus&#xff1a;Vulfocus 漏洞威胁分析平台 2.产生原因 在2017年11月15日&#xff0c;CVE-2017-12635和CVE-2017-12636披露&#xff0c;CVE-2017-12635是由于Erlang和JavaScript对JSON解析方式的不同&#…

优优嗨聚集团:卤味市场新风向,创新融合与品质升级引领未来发展

卤味市场作为中国传统美食文化的重要组成部分&#xff0c;近年来呈现出蓬勃发展的态势。随着消费者口味的不断变化和市场的日益竞争&#xff0c;卤味行业正面临着前所未有的机遇与挑战。那么&#xff0c;卤味市场的未来发展将何去何从&#xff1f;本文将从创新融合和品质升级两…

Python 深度学习和机器学习的模型评估库之torchmetrics使用详解

概要 在深度学习和机器学习项目中,模型评估是一个至关重要的环节。为了准确地评估模型的性能,开发者通常需要计算各种指标(metrics),如准确率、精确率、召回率、F1 分数等。torchmetrics 是一个用于 PyTorch 的开源库,提供了一组方便且高效的评估指标计算工具。本文将详…

第26讲:Ceph集群OSD扩缩容中Reblanceing数据重分布

文章目录 1.Reblanceing数据重分布的概念2.验证Reblanceing触发的过程3.Reblanceing细节4.临时关闭Reblanceing机制 1.Reblanceing数据重分布的概念 当集群中OSD进行扩缩容操作后&#xff0c;会触发一个Reblanceing数据重分布的机制&#xff0c;简单的理解就是将扩缩容前后OSD…

2_1 Linux基础操作

2_1 Linux基础操作 文章目录 2_1 Linux基础操作0. 参考1. 装机后的一些小命令查看系统的信息2. 基础命令2.1 初识基本命令2.2 日期和时间 3. 帮助命令4. 关机、重启5. 设置主机名6. rm删除7. 软件包的管理RPM、 YUM8. IP知识9. 查看一些linux的信息10. 命令行快捷键11. 光盘挂载…

配置响应拦截器,全局前置导航守卫

1&#xff1a;配置响应拦截器 响应拦截器&#xff0c;统一处理接口的错误 问题&#xff1a;每次请求&#xff0c;都会有可能会错误&#xff0c;就都需要错误提示 说明&#xff1a;响应拦截器是咱们拿到数据的 第一个 数据流转站&#xff0c;可以在里面统一处理错误。 // 添…

Lua搭建网站后台教程

本文讲解如何使用二进制发布包和FastWeb网站管理工具搭建站点 FastWeb网站管理工具 使用该工具可快速在Windows平台部署。支持官方或三方模块的自动安装、日志调试、版本更新等。 1、下载最新版本压缩包 2、解压到任意目录(建议英文) 3、运行 ①点击 [设置]->[安装] 部…

微信小程序使用 “云函数“ 获取 “openid“

文章目录 1.前期准备2.具体操作步骤 1.前期准备 必须使用云开发已经配置好云开发 2.具体操作步骤 1.进入小程序开发工具→在云函数目录上右键→选中新建云函数 创建结束&#xff0c;自动上传&#xff08;必须确认已经上传才生效&#xff09; 2.进入对应页面的js文件&#…

【qt】坐标系变换

坐标系变换 一.物理坐标二.逻辑坐标1.平移2.旋转3.扭转4.缩放 三.案例结合画一个五角星四.总结 一.物理坐标 物理坐标系&#xff0c;就是我们上节课说的&#xff0c;坐标的原点在窗口的左上角。这节课我们可以通过改变原点的位置来达到我们想姚的逻辑坐标。 二.逻辑坐标 1.平…

Java程序设计————从控制台输入

向控制台输入信息可以借助Scanner扫描器类来实现 语法&#xff1a; Scanner input new Scanner(System.in); 提示 &#xff08;1&#xff09;在使用Scanner类型之前&#xff0c;需要首先指明Scanner类所在的位置&#xff0c;既通过代码 import java.util.Scanner; &…

利用 HTML5 Canvas 实现在线签字功能

目录 前言 一、HTML5 Canvas 简介 二、签字功能的实现 效果演示 完整代码 前言 在现代互联网应用中&#xff0c;有时我们需要让用户在网页上进行签字操作&#xff0c;比如确认文件、填写电子表格或者签署合同。利用 HTML5 的 canvas 画布&#xff0c;我们可以轻松地实现这一…

一、【源码】实现一个简单的Bean容器

实现一个简单的Bean容器 实现流程&#xff1a; 1.创建一个BeanFactory容器&#xff0c;用于管理bean 2.定义一个BeanDefinition&#xff0c;指定UserService类 3.将BeanDefinition注册到BeanFactory中 4.从工厂中获取bean实例&#xff0c;执行方法 注意&#xff1a; BeanDefin…

orbslam2代码解读(3):localmapping局部建图线程

书接上回&#xff0c;介绍完了跟踪线程&#xff0c;已经得到了当前帧相机的位姿&#xff0c;并且当判断需要产生关键帧的时候&#xff0c;tracking线程把新创建的关键帧插入到mpLocalMapper这个线程的mlNewKeyFrames容器中。所以这时候局部线程就根据这个新的关键帧来进行局部建…

三星系统因何而成?或许是因为吞噬了第四颗恒星

相比于其他的类似星体&#xff0c;这个特殊的三星系统拥有更大更紧密的星体。 三星 天文学家发现了前所未见的三星系统。相比于其他典型的三星系统&#xff0c;这一三星系统拥有更大的体积&#xff0c;并且排列也更加紧密&#xff0c;这也使得这一系统更加特别。科学家推测&am…

8、项目目录结构创建

项目目录结构创建 8.1 三层架构 在spring-boot 的web项目中大都是按照这个思路来的: controller层 —> service层(serviceImpl实现service接口)—> mapper层—> mapper.xml文件 创建目录 commen:存放公共代码的 config:存放配置代码的 controller:后端控制器,…

[office] excel表格中双击鼠标左键有什么快捷作用- #经验分享#媒体

excel表格中双击鼠标左键有什么快捷作用? excel表格中双击鼠标左键有什么快捷作用&#xff1f;不要小看鼠标左键双击的作用&#xff0c;在excel中双击鼠标左键可以实现六个功能&#xff0c;提高工作效率&#xff0c;到底是那六个功能呢&#xff1f;请看下文详细介绍 在表格中…

MAVEN仓库和Nexus私服

仓库 仓库的类型 本地&#xff08;local&#xff09; Maven 的本地仓库&#xff0c;在安装 Maven 后并不会创建&#xff0c;它是在第一次执行 maven 命令的时候才被创建 中央&#xff08;central&#xff09; Maven 中央仓库是由 Maven 社区提供的仓库&#xff0c;其中包含了大…