Cesium 之加载ArcGIS Server 4490切片服务(含orgin -400 400)

2023-11-13

        对于ArcGIS Server发布的切片服务,在地理坐标系中Cesium默认只支持wgs84的4326坐标系,无法通过ArcGisMapServerImageryProvider直接加载CGCS2000的4490坐标系,虽然可以使用WebMapTileServiceImageryProvider加载符合OGC标准的WMTS类型,但只能针对于原点在orgin X: -180.0Y: 90.0的情况,对于原点在orgin X: -400.0Y: 400.0时还是无法正常加载,为了能够实现加载,以下通过修改源码方式来达到目的。

笔者以Cesium 1.91版本为例。

目录

1、修改ArcGisMapServerImageryProvider类

2、修改GeographicTilingScheme类

 3、定义2000椭球参数

4、底图调用实现


1、修改ArcGisMapServerImageryProvider类

在metadataSuccess方法中修改

(1)读取切片模式时增加支持wkid 4490坐标系的判断,同时将切片信息也传入,目的是为了后面在获取行列号xy时,可以通过读取切片信息,使用自定义方法改写行列号的获取方式。

else if (data.fullExtent.spatialReference.wkid === 4490) {
          that._tilingScheme = new GeographicTilingScheme({
            ellipsoid: options.ellipsoid,
            tileInfo: data.tileInfo,
            rectangle: that._rectangle
          });
          that._tilingScheme._tileInfo = data.tileInfo;//附加自定义属性
        } 

如截图所示:

(2)增加最大层级定义(用来限制最大可缩放多少层级,达到一定层级后不显示,根据项目需要为可选修改项)

 //修改最大层级定义

        that._maximumLevel = defaultValue(options.maximumLevel, data.tileInfo.lods.length - 1);

(3)矩阵范围定义中 增加wkid 4490坐标系判断。

2、修改GeographicTilingScheme类

(1)增加4490坐标系的椭球、矩阵范围等定义,4490坐标系默认椭球为CGCS2000,矩阵范围为(-180,-90,180,90),开放矩阵范围的目的就是为了支持自定义的origin原点。

    if (defined(options.tileInfo)
      && defined(options.tileInfo.spatialReference)
      && defined(options.tileInfo.spatialReference.wkid)
      && options.tileInfo.spatialReference.wkid == 4490) {
      this._tileInfo = options.tileInfo;
      this._ellipsoid = defaultValue(options.ellipsoid, Ellipsoid.CGCS2000);
      this._rectangle = defaultValue(options.rectangle, Rectangle.fromDegrees(-180, -90, 180, 90));
      this._numberOfLevelZeroTilesX = defaultValue(options.numberOfLevelZeroTilesX, 4);
      this._numberOfLevelZeroTilesY = defaultValue(options.numberOfLevelZeroTilesY, 2);
    }
    else {
      this._ellipsoid = defaultValue(options.ellipsoid, Ellipsoid.WGS84);
      this._rectangle = defaultValue(options.rectangle, Rectangle.MAX_VALUE);
      this._numberOfLevelZeroTilesX = defaultValue(options.numberOfLevelZeroTilesX, 2);
      this._numberOfLevelZeroTilesY = defaultValue(options.numberOfLevelZeroTilesY, 1);
    }

(2)修改切片矩阵计算获取行列号xy值的原型方法getNumberOfXTilesAtLevel和getNumberOfYTilesAtLevel

/**
   * Gets the total number of tiles in the X direction at a specified level-of-detail.
   *
   * @param {Number} level The level-of-detail.
   * @returns {Number} The number of tiles in the X direction at the given level.
   */
  GeographicTilingScheme.prototype.getNumberOfXTilesAtLevel = function (level) {
    if (!defined(this._tileInfo)) {
      return this._numberOfLevelZeroTilesX << level
    } else { // 使用切片矩阵计算
      var currentMatrix = this._tileInfo.lods.filter(function (item) {
        return item.level === level
      })
      var currentResolution = currentMatrix[0].resolution
      // return Math.round(360 / (this._tileInfo.rows * currentResolution))
      return Math.round(CesiumMath.toDegrees(CesiumMath.TWO_PI) / (this._tileInfo.rows * currentResolution));
    }
  };

  /**
   * Gets the total number of tiles in the Y direction at a specified level-of-detail.
   *
   * @param {Number} level The level-of-detail.
   * @returns {Number} The number of tiles in the Y direction at the given level.
   */
  GeographicTilingScheme.prototype.getNumberOfYTilesAtLevel = function (level) {
    if (!defined(this._tileInfo)) {
      return this._numberOfLevelZeroTilesY << level
    } else { // 使用切片矩阵计算
      var currentMatrix = this._tileInfo.lods.filter(function (item) {
        return item.level === level
      })
      var currentResolution = currentMatrix[0].resolution
      // return Math.round(180 / (this._tileInfo.cols * currentResolution))
      return Math.round(CesiumMath.toDegrees(CesiumMath.TWO_PI / 2) / (this._tileInfo.cols * currentResolution));
    }
  };

 3、定义2000椭球参数

  Ellipsoid.CGCS2000 = Object.freeze(
    new Ellipsoid(6378137.0, 6378137.0, 6356752.31414035585)
  );

 

4、底图调用实现

 以上修改完后,接下来就是如何调用的问题了。

调用方式比一般的调用相对更复杂些,具体如下:

(1)确定椭球参数

如 CGCS2000椭球如下

 var cgs2000Ellipsolid = new Cesium.Ellipsoid(6378137.0, 6378137.0, 6356752.31414035585)

或者直接用源码中已修改过的Ellipsoid.CGCS2000

var cgs2000Ellipsolid=Cesium.Ellipsoid.CGCS2000

(2) 定义切片模式

如orgin 为-400 400时

var myGeographicTilingScheme = new Cesium.GeographicTilingScheme({
    ellipsoid: cgs2000Ellipsolid,
    rectangle: Cesium.Rectangle.fromDegrees(-400, -399.9999999999998, 400, 399.9999999999998),
    numberOfLevelZeroTilesX: 2,
    numberOfLevelZeroTilesY: 1
})

orgin -180 90时 等等

var myGeographicTilingScheme = new Cesium.GeographicTilingScheme({
    ellipsoid: cgs2000Ellipsolid,
    rectangle: Cesium.Rectangle.fromDegrees(-180, -90, 180, 90),
    numberOfLevelZeroTilesX: 4,
    numberOfLevelZeroTilesY: 2
})

(3)创建ArcGisMapServerImageryProvider

url为MapServer地址

layer的名称可在wmts下找到,这个大家应该都知道,我就不截图了,

具体参数设置如下:

生成的provider赋值到Viewer参数的imageryProvider下

 (4)初始化地图投影

var cgs2000GeographicProj = new Cesium.GeographicProjection(cgs2000Ellipsolid)

将其赋值到Viewer参数的mapProjection下

(5)初始化生成三维球体

let viewer2 = new Cesium.Viewer('map3D', {
    animation: false,
    baseLayerPicker: false,
    fullscreenButton: false,
    geocoder: false,
    homeButton: false,
    sceneModePicker: false,
    selectionIndicator: false,
    timeline: false,
    navigationHelpButton: false,
    infoBox: false,
    navigationInstructionsInitiallyVisible: false,
    mapProjection: cgs2000GeographicProj,
    imageryProvider: esriWMTS,
    scene3DOnly: false,
    sceneMode: Cesium.SceneMode.SCENE2D,
    terrainExaggeration: 1,
    showRenderLoopErrors: false,

});

OK完成,效果图如下:

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

Cesium 之加载ArcGIS Server 4490切片服务(含orgin -400 400) 的相关文章

  • Cesium入门(二):Viewer控件参数与外观定制

    本章主要介绍Cesium Viewer控件的选项参数 xff0c 以及如何对Viewer的外观进行定制 主要包括以下内容 xff1a Viewer控件Viewer选项参数定制Viewer外观界面 1 Viewer控件 Viewer是构建Ce
  • Cesium入门(七):设置影像图层的覆盖范围

    本章介绍Cesium JS库的Rectangle类 xff0c 并以GeoServer服务器为例演示了在加载EPSG 4326网格的瓦片地图时 xff0c 通过设置rectangle参数来限定图层的覆盖范围 主要包括以下内容 xff1a R
  • Cesium标注实体【Entity】增、删、改、查

    实体实例将多种形式的可视化聚合到一个高级对象中 它们可以手动创建并添加到 Viewer entities 或由数据源生成 xff0c 例如 CzmlDataSource 和 GeoJsonDataSource 一 Entity 增加 方法一
  • 在cesium中使用3D地形数据terrain builder的打开步骤

    本来题目名字叫做 大龄无经验程序员终成正果 纪念上班第三天 后加之后再 不行 必须把这篇博文发出去了 本篇用cesium terrain builder生成cesium可以使用的地形数据并用cesium terrain server发布 使
  • 《Cesium 进阶知识点》 - 加载天地图三维地名服务(无Cesium 版本依赖)

    一 解决依赖 天地图官网说只支持 1 52 1 58 1 63 1 这 3个版本 其它版本报错 但我只使用三维地名服务 所以做了如下修改 我在 1 80 版 和 1 84 版中测试有效 操作部署是 1 根据官网安装 cesium tdt 插
  • Cesium--一些实验过程中的效果记录

    1 一种反射效果 片元着色器代码 fragmentShaderSource in vec3 v positionMC in vec3 v positionEC in vec2 v st void main czm materialInput
  • 第52节:cesium 3DTiles模型特效+选中高亮(含源码+视频)

    结果示例 完整源码
  • Cesium加载天地图中文标注服务和谷歌影像服务

    Cesium加载天地图中文标注服务和谷歌影像服务 直接上代码 自从天地图使用token之后 之前写的Cesium添加天地图图层服务的就无法使用了 所以重新写一个可以使用的 直接上代码 关闭全球光照 默认为关闭 this viewer sce
  • Cesium教程(四):调用地形服务

    Cesium提供了多种现有地形数据服务接口 并且支持自定义地形数据 CesiumTerrainProvider 高精度全球地形数据 附有光照和水面效果 地形切片使用quantized mesh v1 0格式 Cesium使用CesiumTe
  • vue2.x,3.x安装使用cesium(不需配置文件,简单有效)

    踩坑之路 博主经多次踩坑之后 顿悟 初次接触cesium 去网上搜了很多vue中安装cesium的教程 大多方法都是使用npm i cesium save 然后配置文件vue config js 或者直接安装vue add vue cli
  • Cesium案列学习(Multi-partCZML.html)

    在学习这个案例之前 先花一点时间了解一下什么是CZML CZML Structure AnalyticalGraphicsInc czml writer Wiki github com Cesium Language CZML 入门1 CZ
  • 基于Cesium的实景三维模型动态更新-以3Dtiles为例(一)

    一 简介 Cesium众所周知 是一个前端的三维框架 本项目利用Cesium平台来实现实景三维模型的动态更新 不认识Cesium的同学戳这里 cesium中文网 学习cesiumjs 的好地方 伐罗密 实景三维模型 概括来讲就是倾斜摄影三维
  • Cesium Terrain Builder 非压缩瓦片

    Cesium Terrain Builder 输出瓦片默认是zib压缩后的 在业务中如果传输不是问题 反而增加浏览器的解压处理 希望能支持输出非压缩瓦片 针对此需求 修改代码并重新编译 一 代码分析 1 输出数据对象 文件格式 主要为hei
  • Cesium教程(十九):Cesium粒子系统

    Cesium教程 十九 Cesium粒子系统 1 粒子系统 1 1 什么是粒子系统 Cesium粒子系统是一种模拟复杂物理效应的图形技术 是由小图像组成的集合 当他们在一起形成更复杂的 模糊 对象时 会形成火 烟 云或烟火等 1 2 初始粒
  • cesium解决报错“DeveloperError: _workerName must be defined for asynchronous geometry”

    文章目录 1 报错问题 2 解决方法 Cesium实战系列文章总目录 传送门 1 报错问题 在使用Primitive方式加载Geojson数据时 报错An error occurred while rendering Rendering h
  • cesium的clock开始,结束,控制速率

    开始 viewer clock shouldAnimate true 结束 window viewer clock shouldAnimate false 速率调整 viewer clock multiplier 8
  • cesium设置token

    cesium使用需要token 1 登录cesium地址 https ion cesium com 没有账号的自己注册 注册流程 创建成功后 会显示刚创建的信息 然后选中后 右边即可看到token 复制即可使用 代码中使用方式 Cesium
  • 从材质到外观(待续)

    很多地方都只有材质 然后shader中 最终肯定是到片元着色器 也就是appearance 后处理是单独的poststage var appearance new Ceisum MaterialAppearance Cesium Mater
  • Cesium快速入门

    Cesium是全世界使用最广泛的3D WebGIS引擎 国内有若干个GIS厂家的3D GIS引擎也是基于Cesium进行开发 随着国家 新基建 数字化 战略的不断发展深化 越来越多的城市数字化项目需要用上3D GIS引擎 对Web端而言 C
  • cesium加载三维模型3dtiles

    1 将数据和代码放到一个目录下 目的 为避免跨域 输入cmd命令 python3 m http server 5500 2 三维服务地址 http 127 0 0 1 5500 data mars3d max shihua 3dtiles

随机推荐

  • discuz二级、三级导航高亮,文章内容页跟随三级导航高亮的方法

    查找 改成
  • Flutter运行过程(一):一文搞懂Widget更新机制

    本系列将从Flutter框架runApp 运行开始 结合框架源码 分析flutter UI渲染 更新机制 布局 绘制过程 以及解析flutter主要的生命周期过程 认真读完本系列 读者一定会对Flutter运行过程了如指掌 胸有成竹 本系列
  • mysql数据库权限控制(权限级别 、用户管理)

    权限级别 Global level 系统级 所有库 所有表 的权限 Database level 某个数据库中的所有表 的权限 able level 库中的某个表 的权限 Column level 表中的某个字段 的权限 procs lev
  • Basic Level 1082 射击比赛 (20分)

    题目 本题目给出的射击比赛的规则非常简单 谁打的弹洞距离靶心最近 谁就是冠军 谁差得最远 谁就是菜鸟 本题给出一系列弹洞的平面坐标 x y 请你编写程序找出冠军和菜鸟 我们假设靶心在原点 0 0 输入格式 输入在第一行中给出一个正整数 N
  • ant-design中textArea组件获取光标位置,插入表情之后自动将光标移至文本的最后

    目前的需求是要设置一段文本 但是文本里可以插入微信表情 需要实现在插入表情之后光标位置自动移到当前文本的最后 效果图 实现代码 textArea组件
  • es查询列表如何去重?

    SearchSourceBuilder builder new SearchSourceBuilder builder collapse new CollapseBuilder name keyword 在Elasticsearch中 bu
  • python面试总结

    python面试题 python中is和 的区别 Python中对象包含的三个基本要素 分别是 id 身份标识 type 数据类型 和value 值 比较的是value值 is 比较的是id 简述read readline readline
  • 解决pip._vendor.urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool

    解决pip vendor urllib3 exceptions ReadTimeoutError HTTPSConnectionPool host files pythonhosted org port 443 Read timed out
  • 公众号(服务号)模板消息(个人通知)开发方案

    公众号消息通知 微信公众号开发文档 公众号是以微信用户的一个联系人形式存在的 消息会话是公众号与用户交互的基础 目前公众号内主要有这样几类消息服务的类型 分别用于不同的场景 1 群发消息 公众号可以以一定频次 订阅号为每天1次 服务号为每月
  • windows下启动mysql服务的命令行启动和手动启动方法

    今天遇到mysql服务无法启动 上网一查很多人也遇到mysql服务器启动不了的问题 所以就索性整理了windows下启动mysql服务的命令行启动和手动启动方法的文章 以便各位遇到同类问题的朋友进行参考 1 图形界面下启动mysql服务 在
  • Hugging Face开源库accelerate详解

    官网 https huggingface co docs accelerate package reference accelerator Accelerate使用步骤 初始化accelerate对象accelerator Accelera
  • java基础案例教程黑马程序员案例答案,真香

    掌握核心知识 1 90 几率面试被问 吃透原理 面试不慌 Spring原理 2 大厂必问Redis 赶紧码起来 Redis核心原理 3 MySQL从入门到实战都在这篇 面试笑谈优化 当然核心知识不止这三点 这只是一部分 吃透源码 1 面试源
  • 默认路由(详细解析)

    一 默认路由 1 全球最大的网段 子网掩码越短 子网掩码写成二进制形式后1的个数越少 主机位越多 该网段的地址数量就越大 因此如果想让一个网段包括全部的IP地址 就要求子网掩码短到极限 最短就是0 子网掩码变成了0 0 0 0 这也意味着该
  • Scrapy框架之Crawlspider的使用

    Scrapy存在多种爬虫类 最常用的有两种 第一种是基于basic模版创建的普通爬虫类Scrapy spider 另一种是基于crawl的规则性爬虫类scrapy spider crawlspider 一 crawlspider 经常用于数
  • 记一次应用破解——脱壳修改后重打包

    样本是在某个群里下载的 当时是有人发出来找人帮忙修改下 我是想练练手就下载下来开始修改 首先拿到应用先看了下是加壳了 腾讯的壳 然后安装看了下需要修改的地方 需求就是改一下qq群 开始动手 一 脱壳拿到dex文件 我这里直接使用脱壳机脱壳拿
  • 称重传感器HX711的驱动。适用于arduino、ESP32

    github链接 YukiTbst trust measurer 基于HX711的旋翼推力测量实验台 包含了HX711的驱动 Propeller trust measurer based on HX711 including a drive
  • Ubuntu下ftp服务器配置方法 (高级配置)

    Ubuntu下ftp服务器配置方法 Ubuntu自 带的FTP服务器是vsftpd 1 安装vsftpd Ubuntu安装软件倒不是件困难的事 输入 sudo apt get install vsftpd 安装了之后会在 home 下建立一
  • 《啥是佩奇》,python程序员眼中的佩琦

    啥是佩奇 从前天晚上开始 朋友圈就被这条广告刷屏 也许很多人 看完这个短片也有这样的想法 没错 佩奇是容易被忽略的亲情 明明是一个广告 都能这么吸引人 让人笑中带泪 泪中含笑的 告诉爷爷 你需要什么东西 爷爷给你准备 佩奇 什么是佩奇呀 这
  • Neo4j:入门基础(二)之导入CSV文件

    CSV文件 1 csv文件推荐是utf 8编码 否则会造成中文乱码 2 csv文件默认需要放在import目录下 如需从远程或者其他本地目录导入 则需要修改conf neo4j conf load csv时文件路径 默认需要放在 NEO4J
  • Cesium 之加载ArcGIS Server 4490切片服务(含orgin -400 400)

    对于ArcGIS Server发布的切片服务 在地理坐标系中Cesium默认只支持wgs84的4326坐标系 无法通过ArcGisMapServerImageryProvider直接加载CGCS2000的4490坐标系 虽然可以使用WebM