Cesium加载Supermap的wmts服务

最近使用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);
            }
          });

🆗现在任何wmts服务都可以自动读取参数加载服务了

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【rust/egui】(三)看看template的app.rs:序列化、持久化存储

说在前面 rust新手,egui没啥找到啥教程,这里自己记录下学习过程环境:windows11 22H2rust版本:rustc 1.71.1egui版本:0.22.0eframe版本:0.22.0上一篇:这里 serde app.rs中首先定义了我们的Templ…

Three.js程序化3D城市建模【OpenStreetMap】

对于我在 Howest 的研究项目,我决定构建一个 3D 版本的 Lucas Bebber 的“交互式讲故事的动画地图路径”项目。 我将使用 OSM 中的矢量轮廓来挤出建筑物的形状并将它们添加到 3js 场景中,随后我将对其进行动画处理 推荐:用 NSDT编辑器 快速搭…

ARM-M0内核MCU,内置24bit ADC,采样率4KSPS,传感器、电子秤、体脂秤专用,国产IC

ARM-M0内核MCU 内置24bit ADC ,采样率4KSPS flash 64KB,SRAM 32KB 适用于传感器,电子秤,体脂秤等等

08 - 网络通信优化之IO模型:如何解决高并发下IO瓶颈?

提到 Java I/O,相信你一定不陌生。你可能使用 I/O 操作读写文件,也可能使用它实现 Socket 的信息传输…这些都是我们在系统中最常遇到的和 I/O 有关的操作。 我们都知道,I/O 的速度要比内存速度慢,尤其是在现在这个大数据时代背景…

postgresql 的递归查询

postgresql 的递归查询功能很强大,可以实现传统 sql 无法实现的事情。那递归查询的执行逻辑是什么呢?在递归查询中,我们一般会用到 union 或者 union all,他们两者之间的区别是什么呢? 递归查询的执行逻辑 递归查询的…

leetcode中常用的 C++函数和 STL容器

C函数和 STL容器 输入输出C排序sortC翻转字符串reverseC截取字符串strsub哈希表的使用定义查询哈希表里是否有该key在哈希表里存放键值链式哈希 哈希集合定义一个哈希集合查找一个字符是否在set里面删除和添加 优先队列 最大堆优先队列的大顶堆定义方式插入存储数组对定义插入 …

idea使用docker生成镜像(打包镜像,导入镜像,导出镜像)

1:先下载安装dockerdesktop,安装成功后 2: 在cmd执行docker -v,查看安装的docker版本 C:\Users\dell>docker -v Docker version 24.0.5, build ced09963:需要启动 dockerdesktop应用,才算启动docker&a…

⛳ TCP 协议详解

目录 ⛳ TCP 协议详解🎨 一、TCP / IP 协议的分层模型🏓 1.1、应用层🧸 1.2、传输层🔮 1.3、网络层🎯 1.4、链路层 🏭 二、HTTP 报文传输原理🥅 2.1、HTTP 报文传输💎 2.2、封装和分…

计算机网络-物理层(三)编码与调制

计算机网络-物理层(三)编码与调制 在计算机网络中,计算机需要处理和传输用户的文字、图片、音频和视频,它们可以统称为消息 数据是运输信息的实体,计算机只能处理二进制数据,也就是比特0和比特1。计算机中…

aardio开发语言Excel数据表读取修改保存实例练习

import win.ui; /*DSG{{*/ var winform win.form(text"aardio form";right759;bottom479) winform.add( buttonEnd{cls"button";text"末页";left572;top442;right643;bottom473;z6}; buttonExcelRead{cls"button";text"读取Exce…

用 VB.net,VBA 两种方式 读取单元格内的 换行数据,并出力到 CSV文件

用 VB.net,VBA 两种方式 读取单元格内的 换行数据,并出力到 CSV文件 需求 如下图所示,为了生成csv文件导入数据库,需要将下图 的 1 和 2 拼接成 如下 3 所示的一行数据, 开头为 1 ,往后为 2 的换行数据 将换…

中国大学生服务外包创新创业大赛丨借 AI 之力,助“记账”难题

一、中国大学生服务外包创新创业大赛 赛事介绍 中国大学生服务外包创新创业大赛,是响应国家关于鼓励服务外包产业发展、加强服务外包人才培养的相关战略举措与号召,举办的每年一届的全国性竞赛。 大赛均由中华人民共和国教育部、中华人民共和国商务部…

selenium 选定ul-li下拉选项中某个指定选项

场景:selenium的下拉选项是ul-li模式,选定某个指定的选项。 from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 显示等待def select_li(self, text, *ul_locator):"…

对话音视频牛哥:开发RTSP|RTMP直播播放器难不难?难在哪?

我关注的播放器指标 好多开发者跟我交流音视频相关技术的时候,经常问我的问题是,多久可以开发个商业级别的RTMP或RTSP播放器?你们是怎样做到毫秒级延迟的?为什么一个播放器,会被你们做到那么复杂?带着这些…

Mac 使用 rar 命令行工具解压和压缩文件

在 Mac 中常遇到的压缩文件有 zip 和 rar 格式的,如果是 zip 格式的 Mac 系统默认双击一下文件就能直接解压了,但 rar 文件就不行。 需要额外下载 rar 工具了实现。 第一步:下载 rar 工具 工具网址:https://www.rarlab.com/dow…

Visual Studio 2022连接远程系统进行C/C++开发

Visual Studio被称为是宇宙最强IDE,以前开发Linux C/C服务器程序,基本上都是在Windows上使用VS编写跨平台的C/C代码,然后先在VS中编译、链接、调试,然后在Linux下编译、链接,再针对Linux下的特定代码进行调试。后面Vis…

“保姆级”考研下半年备考时间表

7月-8月 确定考研目标与备考计划 暑假期间是考研复习的关键时期,需要复习的主要内容有:重点关注重要的学科和专业课程,复习相关基础知识和核心概念。制定详细的复习计划并合理安排每天的学习时间,增加真题练习熟悉考试题型和答题技…

从源码分析常见集合的区别之List接口

说到Java集合,共有两大类分别是Collection和Map。今天就详细聊聊大家耳熟能详的List吧。 List接口实现自Collection接口,是Java的集合框架中的一员,List接口下又有ArrayList、LinkedList和线程安全的Vector,今天就简单分析一下Ar…

QCustomPlot的X轴是时间轴的曲线绘制

主要设置X轴的参数 SharedPointer<QCPAxisTickerTime> timeTicker(new QCPAxisTickerTime); timeTicker->setTimeFormat("%h:%m:%s");demo如下 Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);dataTimer …

java-集合

1. 接口继承关系和实现 集合类存放于 Java.util 包中&#xff0c;主要有 3 种&#xff1a;set(集&#xff09;、list(列表包含 Queue&#xff09;和 map(映射)。 Collection&#xff1a;Collection 是集合 List、Set、Queue 的最基本的接口。Iterator&#xff1a;迭代器&…