vue中使用Cesium加载shp文件、wms服务、WMTS服务问题

 更新时间:2023年05月19日 10:25:26   作者:愿为浪漫渡此劫  
这篇文章主要介绍了vue中使用Cesium加载shp文件、wms服务、WMTS服务问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

如何在vue中使用Cesium加载shp文件或者说是wms服务

背景:企业项目在管理界面可以上传shp数据文件集合,需要在用户界面可视化展示

注意: Cesium是不能直接加载shp数文件的

所以需要后端将上传的shp数据转成WMS服务,这样Cesium就可以加载WMS服务来可视化shp数据了

注意后端接口必须返回以下关于WMS服务的参数

  1. 工作空间 share:xxxx,用于Cesium加载wms服务的图层
  2. srs : 用于Cesium加载wms服务的srs属性
  3. wms服务地址 : 类似 http://localhost:8080/geoServer/wms
  4. 四个坐标xmin,ymin和xmax,ymax : 用于定位WMS地图的位置

Vue初始化Cesium

前提: Vue使用Cesium处理npm,还需要在Webpack文件配置,详情可看上期文章

基于Vue的Cesium配置

// 初始化
<template>
   // 地图容器 
  <div class="img-box" id="cesiumContainer"></div>
</template>
<script>
export default {
  props: ["fileUrl","srs","workspace","zb"],
  data() {
    return {
      viewer: {},
      Cesium: {},
      highlightColor: null,
      normalColor: null,
      wmsLayer : null // wms 地图服务图层
    };
  },
  methods: {
    // init : 初始化Cesium
    init() {
      const Cesium = this.cesium;
      this.highlightColor = Cesium.Color.GREEN.withAlpha(0.6);
      this.normalColor = Cesium.Color.YELLOW.withAlpha(0.6);
      this.viewer = new Cesium.Viewer("cesiumContainer", {
        //先行禁止infoBox弹出
        selectionIndicator: false,
        infoBox: false,
        //baseLayerPicker : false,
        geocoder: false,
        homeButton: false,
        sceneModePicker: false,
        fullscreenButton: false,
        navigationHelpButton: false,
        animation: false,
        timeline: false,
        fulllscreenButtond: false,
        vrButton: false,
        // getImageryProviderArr和getTerrainProviderViewModelsArr  可根据项目需求进行实现
        //获取或设置可用于图像选择的ProviderViewModel实例数组。
        imageryProviderViewModels: this.getImageryProviderArr(),
        // //获取或设置可用于地形选择的ProviderViewModel实例数组。
        terrainProviderViewModels: this.getTerrainProviderViewModelsArr(),
      });
      this.viewer._cesiumWidget._creditContainer.style.display = "none"; // 隐藏版权
    },
    getImageryProviderArr() {
      const Cesium = this.cesium;
      return [
        new Cesium.ProviderViewModel({
          //图层的名称。
          name: "影像底图",
          //显示项目被隐藏的工具提示
          tooltip: "影像底图",
          //代表图层的图标
          iconUrl: require("@/assets/img/yxdt.png"),
          //一个函数或命令,用于创建一个或多个提供程序,这些提供程序将在选择此项目时添加到地球仪中。
          creationFunction: function () {
            return new Cesium.ArcGisMapServerImageryProvider({
              url: "https://services.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer",
            });
          },
        }),
        new Cesium.ProviderViewModel({
          //图层的名称
          name: "电子地图",
          //显示项目被隐藏的工具提示
          tooltip: "电子地图",
          //代表图层的图标
          iconUrl: require("@/assets/img/sldt.png"),
          //一个函数或命令,用于创建一个或多个提供程序,这些提供程序将在选择此项目时添加到地球仪中
          creationFunction: function () {
            return new Cesium.ArcGisMapServerImageryProvider({
              url: "https://services.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer",
            });
          },
        }),
      ];
    },
    getTerrainProviderViewModelsArr() {
      const Cesium = this.cesium;
      return [
        new Cesium.ProviderViewModel({
          //图层的名称
          name: "无地形",
          //显示项目被隐藏的工具提示
          tooltip: "WGS84标准球体",
          //代表图层的图标
          iconUrl: require("@/assets/img/WGS84.png"),
          //一个函数或命令,用于创建一个或多个提供程序,这些提供程序将在选择此项目时添加到地球仪中
          creationFunction: function () {
            return new Cesium.EllipsoidTerrainProvider({
              ellipsoid: Cesium.Ellipsoid.WGS84,
            });
          },
        }),
        new Cesium.ProviderViewModel({
          //图层的名称
          name: "地形",
          //显示项目被隐藏的工具提示
          tooltip: "STK在线地形",
          //代表图层的图标
          iconUrl: require("@/assets/img/STK在线地形.png"),
          //一个函数或命令,用于创建一个或多个提供程序,这些提供程序将在选择此项目时添加到地球仪中
          creationFunction: function () {
            return new Cesium.CesiumTerrainProvider({
              url: Cesium.IonResource.fromAssetId(1),
              requestWaterMask: !0,
              requestVertexNormals: !0,
            });
          },
        }),
      ];
    },
  },
};
</script>

加载WMS服务

// 加载geoserver wms服务
addWMS(fileUrl) {
    // 删除之前的wms 图层 
    // 这块移除图层 需要指出图层变量名
   this.viewer.imageryLayers.remove(this.wmsLayer);
   this.wmsLayer = null;
  const Cesium = this.cesium;
  if(this.zb.xmin) {
    var provider = new Cesium.WebMapServiceImageryProvider({
        url : fileUrl, // wms服务地址
        // layers 必须参数,不写会报错;
        // layers写的不对会报如下错误: An error occered in "WebMapServiceImageryProvider":
        // Failed to obtain image tile X : 425y    (有的博客说这是跨域????)
        // 后端API接口返回
        layers: this.workspace,  
        // 必须参数rectangle : 用来定位加载的WMS位置  后端API接口返回
        rectangle: Cesium.Rectangle.fromDegrees(
          +this.zb.xmin, +this.zb.ymin, +this.zb.xmax, +this.zb.ymax),   // 必须有
        parameters: {
            service : 'WMS',
            format: 'image/png',
            transparent: true,
            // 后端API接口返回的
            srs: this.srs,
        }  
    });
    // 加载WMS服务到viewer
    this.wmsLayer = this.viewer.imageryLayers.addImageryProvider(provider);
    // 飞入动画
    this.viewer.flyTo(this.wmsLayer, {
        duration: 2
    });
  } else {
    this.$message.warning('该地图服务没有坐标可以定位')
  }

加载WMTS服务

对与url 属性: 很多博客都说要进行 如下拼接:

后端返回的wmts/rest/{layer}/{style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}?format=image/png

其实不用拼接 只需要后端返回的/wtms路径即可

// 加载geoserver wmts服务
addWMTS(fileUrl) {
      const Cesium = this.cesium;
      let provider = new Cesium.WebMapTileServiceImageryProvider({
        //  对与url  很多博客都说要进行 如下拼接
        // 后端返回的wmts/rest/{layer}/{style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}?format=image/png
        // 其实不用拼接  只需要后端返回的/wtms路径即可
        url: fileUrl, //服务地址 服务地址只需要后端返回的 /WMTS   不需要给后面拼接任何东西,  
        layer: this.workspace, //图层名称 : "pucheng:satellite"
        style: '',
        format: 'image/png',
        tileMatrixSetID: this.srs,  // "EPSG:900913"
        // 地图飞入  定位的坐标  后端返回的数据
        rectangle: Cesium.Rectangle.fromDegrees(
            +this.zb.xmin, +this.zb.ymin, +this.zb.xmax, +this.zb.ymax),
        // 必须加  不然地图出不来
        //之所以要在这里提出这个tileMatrixLabels参数,是因为GeoServer在缓冲切分瓦片时对每一个缩放级别的存储目录没有使用相应的数字,而使用了网格+级别的方式来命名,如“EPSG:9100913:10”表示的是使用“EPSG:9100913”网格切分的第10级瓦片。
        tileMatrixLabels : [`${this.srs}:0`,`${this.srs}:1`, `${this.srs}:2`,`${this.srs}:3`,`${this.srs}:4`,`${this.srs}:5`,`${this.srs}:6`,
        `${this.srs}:7`,`${this.srs}:8`,`${this.srs}:9`,`${this.srs}:10`,`${this.srs}:11`,`${this.srs}:12`,`${this.srs}:13`,`${this.srs}:14`,
        `${this.srs}:15`,`${this.srs}:16`,`${this.srs}:17`,`${this.srs}:18`,
        ],
        // 必须加  不然地图出不来
        tilingScheme: new Cesium.GeographicTilingScheme({//此处很重要,很重要。。。
          numberOfLevelZeroTilesX: 2,
          numberOfLevelZeroTilesY: 1
        }),
        // tilematrixset: this.srs,
        // maximumLevel: 18,
      });
      let layer = this.viewer.imageryLayers.addImageryProvider(provider);
      //控制图层显示
      this.viewer.flyTo(layer, {
          duration: 2
        });
    },

cesium加载shp格式的白模建筑

ceisum加载shp格式的建筑。有两种思路,目前推荐第二种。

方法一

将shp格式转换为geojson格式,然后采用cesium提供的接口加载到ceisum中。

严重缺陷:在面对大场景问题,即数据量较大时,非常容易卡死、崩溃

方法二

将shp转换为3dtiles,然后加载到ceiusm中。

3dtiles是ceisum解决大场景问题专门提供的一种数据格式。

关键:转换工具,我使用的是cesiumLab,比较好用,工具中需要加载dem,目测是用来与地形贴合的。

推荐方法:方法二。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 基于vue.js快速搭建图书管理平台

    基于vue.js快速搭建图书管理平台

    Vue.js是当下很火的一个JavaScript MVVM(Model-View-ViewModel)库.这篇文章主要介绍了基于vue.js快速搭建图书管理平台 ,需要的朋友可以参考下
    2017-10-10
  • Vue 组件(component)教程之实现精美的日历方法示例

    Vue 组件(component)教程之实现精美的日历方法示例

    组件是我们学习vue必须会的一部分,下面这篇文章主要给大家介绍了关于Vue 组件(component)教程之实现精美的日历的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-01-01
  • Vue使用font-face自定义字体的案例详解

    Vue使用font-face自定义字体的案例详解

    @font-face 是 CSS 中的一个规则,它允许你加载服务器上的字体文件(远程或者本地),并在网页中使用这些字体,本文给大家介绍了Vue使用font-face自定义字体的案例,并通过代码讲解的非常详细,需要的朋友可以参考下
    2024-03-03
  • vue里的data要用return返回的原因浅析

    vue里的data要用return返回的原因浅析

    这篇文章主要介绍了vue里的data要用return返回的原因浅析,需要的朋友可以参考下
    2019-05-05
  • vite构建项目并支持微前端

    vite构建项目并支持微前端

    本文主要介绍了vite构建项目并支持微前端,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • Vue 获取数组键名的方法

    Vue 获取数组键名的方法

    本篇文章主要介绍了Vue 获取数组键名的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-06-06
  • vue package.json文件的使用及说明

    vue package.json文件的使用及说明

    `package.json`是Node.js和npm项目的核心配置文件,定义了项目的元数据和依赖项,在Vue项目中,它管理依赖、提供脚本命令、存储项目信息,并通过语义化版本控制确保项目稳定
    2025-01-01
  • vue3无config文件夹打包后页面空白问题及解决

    vue3无config文件夹打包后页面空白问题及解决

    这篇文章主要介绍了vue3无config文件夹打包后页面空白问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • VUE写一个简单的表格实例

    VUE写一个简单的表格实例

    在本篇文章里小编给大家整理的是关于VUE中表格的写法实例以及相关知识点内容,需要的朋友们可以参考下。
    2019-08-08
  • vue.js实现日历插件使用方法详解

    vue.js实现日历插件使用方法详解

    这篇文章主要为大家详细介绍了vue.js模拟日历插件的使用方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09

最新评论