运行天地图Cesium.js三维服务案例

news2025/2/10 22:20:40

零、技术选型及相关网址

技术选型:Vue2、VueCli5、Cesium.js、天地图
相关网址:三维服务 - 天地图 帮助文档

一、cesium 初始化参数解析

initializeCesium() {
  this.viewer = new Cesium.Map("cesiumContainer", {
    shouldAnimate: true, // 是否启用动画效果。
    selectionIndicator: false, // 是否显示选中指示器。
    baseLayerPicker: false, // 是否显示底图选择器。
    fullscreenButton: false, // 是否显示全屏按钮。
    geocoder: false, // 是否显示地理编码器(用于地址搜索)。
    homeButton: false, // 是否显示“回到初始视角”的按钮。
    infoBox: false, // 是否显示信息框。
    sceneModePicker: false, // 是否显示场景模式选择器(2D、3D、哥伦布视图)。
    timeline: false, // 是否显示时间线。
    navigationHelpButton: false, // 是否显示导航帮助按钮。
    navigationInstructionsInitiallyVisible: false, // 是否初始显示导航指示。
    showRenderLoopErrors: false, // 是否显示渲染循环错误。
    shadows: false, // 是否渲染阴影。
  });
}

二、配置相关属性

setupConfigProp() {
  // 抗锯齿。
  this.viewer.scene.fxaa = false;
  // 禁用快速近似抗锯齿(FXAA)后处理阶段。
  this.viewer.scene.postProcessStages.fxaa.enabled = false;

  if (Cesium.FeatureDetection.supportsImageRenderingPixelated()) {
    // 判断是否支持图像渲染像素化处理
    this.viewer.resolutionScale = window.devicePixelRatio;
  }

  // 启用地球大气层效果(如地平线上的光晕)。
  this.viewer.scene.globe.showGroundAtmosphere = true;

  // 设置相机的最大俯仰角度,这里设置为-20度(弧度制)。
  this.viewer.scene.screenSpaceCameraController.constrainedPitch =
    Cesium.Math.toRadians(-20);

  // 禁用相机在视角重置时自动调整俯仰和方向。
  this.viewer.scene.screenSpaceCameraController.autoResetHeadingPitch = false;

  // 设置相机缩放的惯性,0.5 表示中等惯性。
  this.viewer.scene.screenSpaceCameraController.inertiaZoom = 0.5;

  // 设置相机允许的最小缩放距离,单位米。
  this.viewer.scene.screenSpaceCameraController.minimumZoomDistance = 50;

  // 设置相机允许的最大缩放距离,单位米。
  this.viewer.scene.screenSpaceCameraController.maximumZoomDistance = 20000000;

  // 定义相机缩放的触发事件类型。
  this.viewer.scene.screenSpaceCameraController.zoomEventTypes = [
    Cesium.CameraEventType.RIGHT_DRAG, // 右键拖拽
    Cesium.CameraEventType.WHEEL, // 鼠标滚轮
    Cesium.CameraEventType.PINCH, // 触摸屏捏合
  ];

  // 定义相机倾斜的触发事件类型。
  this.viewer.scene.screenSpaceCameraController.tiltEventTypes = [
    Cesium.CameraEventType.MIDDLE_DRAG, // 中键拖拽
    Cesium.CameraEventType.PINCH, // 触摸屏捏合
    {
      eventType: Cesium.CameraEventType.LEFT_DRAG,
      modifier: Cesium.KeyboardEventModifier.CTRL,
    }, // 按住 CTRL 键的同时左键拖拽
    {
      eventType: Cesium.CameraEventType.RIGHT_DRAG,
      modifier: Cesium.KeyboardEventModifier.CTRL,
    }, // 按住 CTRL 键的同时右键拖拽
  ];
}

三、叠加影像服务

setupImageryLayers() {
  // 叠加影像服务(通过使用指定的URL模板请求图块来提供图像)
  const imgMap = new Cesium.UrlTemplateImageryProvider({
    url: tdtUrl + "DataServer?T=img_w&x={x}&y={y}&l={z}&tk=" + token,
    subdomains: subdomains,
    tilingScheme: new Cesium.WebMercatorTilingScheme(),
    maximumLevel: 18,
  });
  this.viewer.imageryLayers.addImageryProvider(imgMap);

  // 叠加国界服务
  const iboMap = new Cesium.UrlTemplateImageryProvider({
    url: tdtUrl + "DataServer?T=ibo_w&x={x}&y={y}&l={z}&tk=" + token,
    subdomains: subdomains,
    tilingScheme: new Cesium.WebMercatorTilingScheme(),
    maximumLevel: 10,
  });
  this.viewer.imageryLayers.addImageryProvider(iboMap);
},
叠加了影像服务、国界服务

四、点击事件、双击事件

setupEventHandlers() {
  // 取消默认的双击事件
  this.viewer.cesiumWidget.screenSpaceEventHandler.removeInputAction(
    Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK
  );

  // 添加鼠标点击事件监听器
  const handler = new Cesium.ScreenSpaceEventHandler(
    this.viewer.scene.canvas
  );

  handler.setInputAction((click) => {
    const earthPosition = this.viewer.scene.pickPosition(click.position);

    if (Cesium.defined(earthPosition)) {
      const cartographic = Cesium.Cartographic.fromCartesian(earthPosition);
      const longitude = Cesium.Math.toDegrees(cartographic.longitude);
      const latitude = Cesium.Math.toDegrees(cartographic.latitude);
      const height = cartographic.height; // 获取高度信息

      console.log(`经度: ${longitude}, 纬度: ${latitude}, 高度: ${height}`);
      // 在这里可以根据经纬度进行进一步的处理
    }
  }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
},

鼠标点击事件输入为:

五、相机飞行位置

flyToPosition() {
  // 将三维球定位到中国
  this.viewer.camera.flyTo({
    destination: Cesium.Cartesian3.fromDegrees( 121.28148939885521, 30.702808303473166, 700 ),
    orientation: {
      heading: Cesium.Math.toRadians(334.8202942851978),
      pitch: Cesium.Math.toRadians(-45),
      roll: Cesium.Math.toRadians(0),
    },
    complete: function callback() {
      // 定位完成之后的回调函数
    },
  });
}

六、叠加三维地名服务

// 叠加三维地名服务
addGeoWTFS() {
  // 叠加三维地名服务
  const wtfs = new Cesium.GeoWTFS({
    viewer: this.viewer,
    //三维地名服务,使用wtfs服务
    subdomains: cesiumConfig.subdomains,
    metadata: {
      boundBox: {
        minX: -180,
        minY: -90,
        maxX: 180,
        maxY: 90,
      },
      minLevel: 1,
      maxLevel: 20,
    },
    depthTestOptimization: true,
    dTOElevation: 15000,
    dTOPitch: Cesium.Math.toRadians(-70),
    aotuCollide: true, //是否开启避让
    collisionPadding: [5, 10, 8, 5], //开启避让时,标注碰撞增加内边距,上、右、下、左
    serverFirstStyle: true, //服务端样式优先
    labelGraphics: {
      font: "28px sans-serif",
      fontSize: 28,
      fillColor: Cesium.Color.WHITE,
      scale: 0.5,
      outlineColor: Cesium.Color.BLACK,
      outlineWidth: 2,
      style: Cesium.LabelStyle.FILL_AND_OUTLINE,
      showBackground: false,
      backgroundColor: Cesium.Color.RED,
      backgroundPadding: new Cesium.Cartesian2(10, 10),
      horizontalOrigin: Cesium.HorizontalOrigin.LEFT,
      verticalOrigin: Cesium.VerticalOrigin.TOP,
      eyeOffset: Cesium.Cartesian3.ZERO,
      pixelOffset: new Cesium.Cartesian2(5, 5),
      disableDepthTestDistance: undefined,
    },
    billboardGraphics: {
      horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
      verticalOrigin: Cesium.VerticalOrigin.CENTER,
      eyeOffset: Cesium.Cartesian3.ZERO,
      pixelOffset: Cesium.Cartesian2.ZERO,
      alignedAxis: Cesium.Cartesian3.ZERO,
      color: Cesium.Color.WHITE,
      rotation: 0,
      scale: 1,
      width: 18,
      height: 18,
      disableDepthTestDistance: undefined,
    },
  });

  // 三维地名服务,使用wtfs服务
  wtfs.getTileUrl = function () {
    return (
      cesiumConfig.tdtUrl +
      "mapservice/GetTiles?lxys={z},{x},{y}&tk=" +
      cesiumConfig.token
    );
  };

  // 三维图标服务
  wtfs.getIcoUrl = function () {
    return (
      cesiumConfig.tdtUrl +
      "mapservice/GetIcon?id={id}&tk=" +
      cesiumConfig.token
    );
  };

  wtfs.initTDT([
    {
      x: 6,
      y: 1,
      level: 2,
      boundBox: { minX: 90, minY: 0, maxX: 135, maxY: 45 },
    },
    {
      x: 7,
      y: 1,
      level: 2,
      boundBox: { minX: 135, minY: 0, maxX: 180, maxY: 45 },
    },
    {
      x: 6,
      y: 0,
      level: 2,
      boundBox: { minX: 90, minY: 45, maxX: 135, maxY: 90 },
    },
    {
      x: 7,
      y: 0,
      level: 2,
      boundBox: { minX: 135, minY: 45, maxX: 180, maxY: 90 },
    },
    {
      x: 5,
      y: 1,
      level: 2,
      boundBox: { minX: 45, minY: 0, maxX: 90, maxY: 45 },
    },
    {
      x: 4,
      y: 1,
      level: 2,
      boundBox: { minX: 0, minY: 0, maxX: 45, maxY: 45 },
    },
    {
      x: 5,
      y: 0,
      level: 2,
      boundBox: { minX: 45, minY: 45, maxX: 90, maxY: 90 },
    },
    {
      x: 4,
      y: 0,
      level: 2,
      boundBox: { minX: 0, minY: 45, maxX: 45, maxY: 90 },
    },
    {
      x: 6,
      y: 2,
      level: 2,
      boundBox: { minX: 90, minY: -45, maxX: 135, maxY: 0 },
    },
    {
      x: 6,
      y: 3,
      level: 2,
      boundBox: { minX: 90, minY: -90, maxX: 135, maxY: -45 },
    },
    {
      x: 7,
      y: 2,
      level: 2,
      boundBox: { minX: 135, minY: -45, maxX: 180, maxY: 0 },
    },
    {
      x: 5,
      y: 2,
      level: 2,
      boundBox: { minX: 45, minY: -45, maxX: 90, maxY: 0 },
    },
    {
      x: 4,
      y: 2,
      level: 2,
      boundBox: { minX: 0, minY: -45, maxX: 45, maxY: 0 },
    },
    {
      x: 3,
      y: 1,
      level: 2,
      boundBox: { minX: -45, minY: 0, maxX: 0, maxY: 45 },
    },
    {
      x: 3,
      y: 0,
      level: 2,
      boundBox: { minX: -45, minY: 45, maxX: 0, maxY: 90 },
    },
    {
      x: 2,
      y: 0,
      level: 2,
      boundBox: { minX: -90, minY: 45, maxX: -45, maxY: 90 },
    },
    {
      x: 0,
      y: 1,
      level: 2,
      boundBox: { minX: -180, minY: 0, maxX: -135, maxY: 45 },
    },
    {
      x: 1,
      y: 0,
      level: 2,
      boundBox: { minX: -135, minY: 45, maxX: -90, maxY: 90 },
    },
    {
      x: 0,
      y: 0,
      level: 2,
      boundBox: { minX: -180, minY: 45, maxX: -135, maxY: 90 },
    },
  ]);
}

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

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

相关文章

MATLAB中确定峰宽

创建由钟形曲线之和组成的信号。指定每条曲线的位置、高度和宽度。 x linspace(0,1,1000);Pos [1 2 3 5 7 8]/10; Hgt [4 4 2 2 2 3]; Wdt [3 8 4 3 4 6]/100;for n 1:length(Pos)Gauss(n,:) Hgt(n)*exp(-((x - Pos(n))/Wdt(n)).^2); endPeakSig sum(Gauss); 绘制各单…

工具系列:TensorFlow决策森林_(7)检查和调试决策森林模型

文章目录 设置训练一个简单的随机森林绘制模型检查模型结构手动创建模型结束树写作 在本文中,您将学习如何直接检查和创建模型的结构。我们假设您已经熟悉了在初级和中级介绍的概念。 在本文中,您将: 训练一个随机森林模型并以编程方式访问其…

如何通过内网穿透实现远程访问本地Linux SVN服务

文章目录 前言1. Ubuntu安装SVN服务2. 修改配置文件2.1 修改svnserve.conf文件2.2 修改passwd文件2.3 修改authz文件 3. 启动svn服务4. 内网穿透4.1 安装cpolar内网穿透4.2 创建隧道映射本地端口 5. 测试公网访问6. 配置固定公网TCP端口地址6.1 保留一个固定的公网TCP端口地址6…

HBase基础知识(五):HBase 对接 Hadoop 的 MapReduce

通过 HBase 的相关 JavaAPI,我们可以实现伴随 HBase 操作的 MapReduce 过程,比如使用 MapReduce 将数据从本地文件系统导入到 HBase 的表中,比如我们从 HBase 中读取一些原 始数据后使用 MapReduce 做数据分析。 1 官方 HBase-MapReduce 1&am…

vscode中默认shell选择

terminal.integrated.defaultProfile.linux在vs的Preference的Settings里面搜索terminal.integrated.defaultProfile.linux,默认的应该是null,将其修改为bash即可。 linux———/bin/sh、 /bin/bash、 /bin/dash的区别

微信使用证书退款时候报”请求被中止: 未能创建 SSL/TLS 安全通道

解决方法:IIS-》应用程序池-》高级设置-》进程模块-》加载用户配置文件,设置为True就可以了。

【Filament】立方体贴图(6张图)

1 前言 本文通过一个立方体贴图的例子,讲解三维纹理贴图(子网格贴图)的应用,案例中使用 6 张不同的图片给立方体贴图,图片如下。 读者如果对 Filament 不太熟悉,请回顾以下内容。 Filament环境搭建绘制三角…

科技云报道:开源才是大模型的未来?

科技云报道原创。 一年前,ChatGPT横空出世;7个多月后,Meta宣布开源LLaMA 2,并且可免费商用。 这一天,也成为大模型发展的分水岭。短时间内,LLaMA 2对一些闭源的大模型厂商造成了致命性的打击。 随后&…

FL Studio 21最新版本for mac 21.2.2.3470中文解锁版

FL Studio 21最新版本for mac 21.2.2.3470中文解锁版是最新强大的音乐制作工具。它可以与所有类型的音乐一起创作出令人惊叹的音乐。它提供了一个非常简单且用户友好的集成开发环境(IDE)来工作。这个完整的音乐工作站是由比利时公司 Image-Line 开发的。…

k8s实战之ELK日志管理

首先查看总体流程 首先创建namespace apiVersion: v1 kind: Namespace metadata:name: kube-logging 一、首先创建es.yaml --- apiVersion: v1 #kubernetes API版本,采用最新版本v1 kind: Service #资源类型定义为Service metadata: name: elasticsearch-logging # …

11.1Linux串口应用程序开发

UART简介 UART的全称是Universal Asynchronous Receiver and Transmitter,即异步发送和接收。 串口在嵌入式中用途非常的广泛,主要的用途有: 打印调试信息;外接各种模块:GPS、蓝牙; 串口因为结构简单、稳…

Angular 进阶之五: Signals到底用不用?

Angular 在V16的时候推出了Signals,在17正式作为主打功能之一强烈推荐,看过了各种博主的各种科普文章也没说明白,到底这东西值不值得用?毕竟项目大了,重构代码也不是闹着玩儿的。各种科普文章主要在说两点:…

自定义注解 - java文档生成、结合SpringBoot使用

参考资料: 参考视频 拦截器自定义注解 AOP自定义注解 通过AOP获取属性 拦截器、过滤器、AOP的区别和联系 个人学习笔记及源码 注:这里仅讲怎么使用,具体原理请参考个人学习笔记 自定义注解源码介绍: 其中视频例子2为上述参…

智能优化算法应用:基于减法平均算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于减法平均算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于减法平均算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.减法平均算法4.实验参数设定5.算法结果6.…

[C/C++]数据结构 希尔排序

🥦前言: 希尔排序也称 “缩小增量排序”,它也是一种插入类排序的方法,在学习希尔排序之前我们首先了解一下直接插入排序. 一: 🚩直接插入排序 1.1 🌟排序思路 直接插入排序的基本原理是将一条记录插入到已排好的有序表中&#x…

微信小程序开发系列-01创建一个最小的小程序项目

本文讲述了通过微信开发者工具,创建一个新的小程序项目,完全从零开始,不依赖开发者工具的模板。目的是为了更好的理解小程序工程项目的构成。 文章目录 创建一个空项目app.json全局配置pagessitemapLocation app.js 创建一个空项目 打开微信…

Android 11.0 系统默认打开OEM解锁开关功能实现

1.前言 在11.0的系统rom定制化开发中,在9.0系统以后为了设备的安装,系统开始启用oem机制,所以在adb push文件就需要先oem解锁,然后才可以 进行相关操作,所以就需要默认打开oem解锁的开关,来方便oem解锁功能的实现 如图: 2.系统默认打开OEM解锁开关功能实现的核心类 pac…

大数据Doris(四十一):物化视图简单介绍

文章目录 物化视图简单介绍 一、适用场景

Apache Commons Math: 面向Java的数学和统计库

第1章:引言 大家好,我是小黑,咱们今天要聊的是Apache Commons Math这个宝藏级的Java库。为啥说它是宝藏呢?因为它简直就是处理数学问题的瑞士军刀,无论你是要搞统计分析、数值计算,还是解决优化问题&#…

微信小程序备案流程整理

一、备案流程 [找备案入口]–[填主体信息]–[填小程序信息]–[初审]–[短信核验]–[通管局审核] 1,在小程序后台找到备案入口 (1)新的未上架小程序,可以在小程序首页点击【去备案】进入。 (2)已上架小程…