Cesium加载Supermap的wmts服务

2023-10-27

最近使用cesium 加载supermap的wmts 服务,多次遇到加载异常与白页面问题,纠结好久最后才搞定[特此记录]

1、首先找到方法加载wmts 的api 文档

官方提示使用WebMapTileServiceImageryProvider加载wmts
官方加载方法

2、然后编辑加载代码

			//1.新建ImageryProvider
				let wmtsImageryProvider = new Cesium.WebMapTileServiceImageryProvider({
					url: 'http://localhost:8080/iserver/services/agscachev-Layers/wmts', //服务地址,如:'http://localhost:8080/geoserver/gwc/service/wmts'
					layer: 'Layers', //图层名称,如:'tasmania'
					style: 'default',
					format: 'image/png',
					tileMatrixSetID: 'ChinaPublicServices_Layers',
					 tileMatrixLabels: ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23"],
					tilingScheme: new Cesium.GeographicTilingScheme({ 
						numberOfLevelZeroTilesX: 2,
						numberOfLevelZeroTilesY: 1
					}),
				});

				viewer.imageryLayers.addImageryProvider(wmtsImageryProvider);

【重点】其中查找layer 、tileMatrixSetID、format相当关键,当初就是因为这个参数没对一直400

还有一个是tilingScheme一定要给,否则加载后一直白页面

手动查找方法:网页打开http://localhost:8080/iserver/services/agscachev-Layers/wmts如下分别找到layer 、tileMatrixSetID、format值填入以上方法中
查找layer

3、测试加载结果

测试加载结果
测试wmts 已经加载成功,但是手动查找wmts 参数的确不利于生产,那有没有自动获取参数的方法呢?答案时有的,我们可以使用大佬的 xml-js吧xml 解析为json 获取想要的参数即可

4、自动解析xml

我们参考这个博客将xml解析为json建一个util.js

const xmlContent = require("xml-js");
/**
 * 将xml转换为json
 */
const TransferXmlToJson = {
  // 把_text属性直接改为值,见xml-js issue
  RemoveJsonTextAttribute(value, parentElement) {
    try {
      var keyNo = Object.keys(parentElement._parent).length;
      var keyName = Object.keys(parentElement._parent)[keyNo - 1];
      parentElement._parent[keyName] = value;
    } catch (e) {}
  },
  // 以文本方式获取xml文件
  getWMTSParamsFromUrl(xmlUrl) {
    var option = {
      ignoreDeclaration: true,
      compact: true,
      trim: true,
      ignoreInstruction: true,
      ignoreComment: true,
      ignoreCdata: true,
      ignoreDoctype: true,
    };
    return new Promise((resolve, reject) => {
      fetch(xmlUrl)
        .then((res) => res.text())
        .then((res) => {
          try {
            // 解析xml为JS对象
            var xmlObj = xmlContent.xml2js(res, { ...option, textFn: this.RemoveJsonTextAttribute });
            var info = this.getWMTSInfo(xmlObj);
            resolve(info);
          } catch (e) {
            console.error(e);
            resolve(null);
          }
        })
        .catch((e) => {
          console.error(e);
          resolve(null);
        });
    });
  },
  // 获取服务需要的参数
  getWMTSInfo(obj) {
    const WMTSXML = "http://www.opengis.net/wmts/1.0";
    const wmstList = [];
    if (obj.Capabilities) {
      const { _attributes, Contents } = obj.Capabilities;
      if (_attributes?.xmlns !== WMTSXML) {
        return;
      }
      const { Layer, TileMatrixSet } = Contents;
      if (!Layer || !TileMatrixSet) {
        return;
      }
      const info = {
        url: null,
        layer: null,
        style: null,
        tileMatrixSetID: null,
        format: null,
        tileMatrixLabels: null,
        crs: null,
        center: null,
      };

      const tileSet = TileMatrixSet[0] || TileMatrixSet;
      info.tileMatrixSetID = tileSet["ows:Identifier"];
      info.crs = tileSet["ows:SupportedCRS"];
      info.tileMatrixLabels = tileSet.TileMatrix.map((s) => s["ows:Identifier"]);

      let LayerInfo = Layer;

      if (!Array.isArray(LayerInfo)) {
        LayerInfo = [LayerInfo];
      }

      LayerInfo.forEach((layer) => {
        let resourceURL = layer?.ResourceURL;
        if (!Array.isArray(resourceURL)) {
          resourceURL = [resourceURL];
        }
        info.format = "image/png" || layer?.Format;
        const resourceURLItem = resourceURL.filter((s) => s._attributes.resourceType === "tile");
        let pngResource = resourceURLItem.find((s) => s._attributes.format.endsWith("png")) || resourceURLItem[0];
        if (pngResource) {
          info.url = pngResource?._attributes?.template;
          info.format = pngResource?._attributes?.format;
        }
        info.layer = layer["ows:Identifier"];
        info.style = layer.Style["ows:Identifier"];

        const wgsBox = layer["ows:WGS84BoundingBox"];
        const lower = wgsBox["ows:LowerCorner"].split(" ").map((s) => Number(s));
        const upper = wgsBox["ows:UpperCorner"].split(" ").map((s) => Number(s));
        const center = [lower[0] + (upper[0] - lower[0]) / 2, lower[1] + (upper[1] - lower[1]) / 2];
        info.center = center;
        wmstList.push({ ...info });
      });

      return wmstList;
    }
  },
};

然后直接调用即可

import { TransferXmlToJson } from '@/utils/index'


const serviceUrl ='http://localhost:8080/iserver/services/agscachev-Layers/wmts';

  TransferXmlToJson.getWMTSParamsFromUrl(serviceUrl).then((rxml) => {
            if (rxml) {
             console.log("获取解析结果:",rxml);
            }
          });

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Cesium加载Supermap的wmts服务 的相关文章

随机推荐

  • RuntimeError: cuda runtime error (30)解决

    程序出错如上 而且总是伴随着黑屏 一开始以为是cuda跑出问题 而且该问题必须重启才能解决 但是一直很好奇我的电脑Ubuntu18 04设置了黑白屏从不 还是出现该错误 最后为了复现该错误就强制锁屏 果然错误复现 找到原因之后就可以比较好解
  • vue前端使用Docker部署

    在上一篇文章中 我们介绍了如果在CentOS上安装docker环境 本文则是介绍docker的具体项目实践 主要介绍如果通过docker容器来部署vue前端项目 本文需要基于vue项目已经开发完成 并且docker环境已经准备好 思路是Do
  • SQL基础(1)

    1 Where条件语句 使用Were语句指定搜索条件过滤返回的数据 用于提取满足指定条件 语法 select b Sid b Sname a score from sc a join Student b on a Sid b Sid whe
  • ChatGPT和智能化能源:如何应用于能源领域的智能化生产和能源管理?

    Chatgpt Chat Gpt 小智Ai Chat小智 Gpt小智 ChatGPT小智Ai GPT小智 GPT小智Ai Chat小智Ai 丨 随着社会的发展和工业化的进程 能源需求不断增加 如何实现能源的高效 低碳 安全 可持续发展成为了
  • python数据分析绘图

    ROC AUC曲线 分类模型 混淆矩阵 混淆矩阵中所包含的信息 True negative TN 称为真阴率 表明实际是负样本预测成负样本的样本数 预测是负样本 预测对了 False positive FP 称为假阳率 表明实际是负样本预测
  • Qt:Drag-Drop操作在QGraphicsView及Model/View框架下的实现

    最近使用到Qt的Drag Drop功能 结合自己的例子写下来给大家分享一下 实现从QTreeView拖动Node到QGraphicsView上 以及QGraphicsView上item之间的拖动 先来说Model View中的实现 1 Mo
  • WPF的TChart控件使用---添加直线---标题勾选---提示

    TChart1 Aspect View3D false 控件3D效果 Steema TeeChart WPF Styles Line line1 new Steema TeeChart WPF Styles Line 直线 line1 Ti
  • 微信公众号 Jssdk调用错误码:63002, 获取access_token错误代码 errcode 40164的解决方法,如何解决,微信公众号的坑。

    今晚在开发公众号 需要调用到 Jssdk 结果配置好了 一运行就提示 Errmsg config fail Error 系统错误 错误码 63002 invalid signature 20200108 00 04 41 我的心突然就好慌
  • HTTPS理论基础

    目录 HTTPS原理 密码学基础 HTTPS通信过程 数字证书 本文链接 https blog csdn net iispring article details 51615631 HTTPS原理 我们知道 HTTP请求都是明文传输的 所谓
  • POSTGIS教程

    一 什么是PostgreSQL和PostGIS 1 1 什么是PostgreSQL 说起数据库 大家耳熟能详的商业数据库产品当推Oracle 微软的SqlServer和IBM的 DB2等 而开源数据库中则有两大产品MySQL和Postgre
  • 数据结构PTA 案例6-1.4 地下迷宫探索

    案例6 1 4 地下迷宫探索 题目 解法 题目 假设有一个地下通道迷宫 它的通道都是直的 而通道所有交叉点 包括通道的端点 上都有一盏灯和一个开关 请问你如何从某个起点开始在迷宫中点亮所有的灯并回到起点 输入格式 输入第一行给出三个正整数
  • Linux内核中断系统结构——软中断

    在 Linux异常 中断 处理体系结构 这篇文章 我们详细描写了内核如何进行中断 异常 向量表的初始化 如何初始化硬件中断 IRQ 的操作 在这篇文章中 我们将重心放在软件中断上 也就是 CPU 本身的中断 这篇文章包括五个内容 软中断 t
  • 当电桥为恒流源时惠斯通电桥电压的计算方法

    http wenku baidu com link url S55C CbY IQBl7oqgICODIz765KasqscVU2ACb6xV1OJB1zhLWwvryumayUWtB7V0b3 uHiclyhZtHHMfejUVFuYfd
  • 大数据毕设 - 校园卡数据分析与可视化(python 大数据)

    文章目录 0 前言 1 课题介绍 2 数据预处理 2 1 数据清洗 2 2 数据规约 3 模型建立和分析 3 1 不同专业 性别的学生与消费能力的关系 3 2 消费时间的特征分析 4 Web系统效果展示 5 最后 0 前言 Hi 大家好 这
  • python和opencv利用摄像头进行视频捕获

    python容易上手 利用opencv进行视频录制及后期的人脸识别 都是比较简单易上手的方案 工具 python3 10 opencv4 54 平台 win10 vscode 摄像头捕获程序 import cv2 as cv cap cv
  • Arduino从零开始(2)——控制舵机与步进电机

    0 前言 本文主要介绍通过Arduino控制舵机 步进电机以及循环的使用 目录 0 前言 1 介绍 2 Arduino控制舵机 2 1方法一 2 2方法二 3 Arduino控制步进电机 1 介绍 对于Arduino控制舵机的方法是通过其输
  • 做方差分析需要正态性检验吗_方差分析(SPSS版)

    方差分析 SPSS版 原创 Gently spss学习乐园 2019 10 15 文章同步于 微信公众号 SPSS学习乐园 方差分析 SPSS版 方差分析的基本思想 R A Fisher提出的统计理论基础 将总变异分解为由研究因素所产生的变
  • 计算机系统结构:流水线技术总结

    文章目录 什么是流水线 流水线的分类 流水线的性能指标 流水线设计中的若干问题 非线性流水线的调度 单功能非线性流水线的最优调度 多功能非线性流水线的调度 一条经典的5段流水线 相关与流水线冲突 结构冲突 因硬件资源满足不了指令重叠执行的要
  • 基于Pytorch实现LSTM(多层LSTM,双向LSTM)进行文本分类

    LSTM原理请看这 点击进入 LSTM nn LSTM input size hidden size num layers 1 nonlinearity tanh bias True batch first False dropout 0
  • Cesium加载Supermap的wmts服务

    最近使用cesium 加载supermap的wmts 服务 多次遇到加载异常与白页面问题 纠结好久最后才搞定 特此记录 1 首先找到方法加载wmts 的api 文档 官方提示使用WebMapTileServiceImageryProvide