1. 为什么你的Cesium加载ArcGIS服务总是不对?从4326到4490的坐标“迷思”
很多刚开始用Cesium做三维GIS开发的朋友,尤其是结合国内常用的ArcGIS Server服务时,经常会遇到一个头疼的问题:明明在ArcGIS Desktop或者在线地图里看得好好的服务,一搬到Cesium里,位置就“飘”了,或者干脆加载不出来。我自己在带团队做国土调查和城市规划项目时,也踩过不少这个坑。问题的根源,十有八九出在坐标系上。
Cesium这个强大的三维地球引擎,它默认的“世界”是基于WGS84椭球体的,对应的地理坐标系是EPSG:4326。这就像我们默认说“北京时间”一样,是全球通用的一套标准。但是,咱们国内很多行业,特别是自然资源、测绘、国土、规划这些领域,出于历史沿革、数据精度和国家标准的要求,大量使用的其实是国家大地2000坐标系,也就是我们常说的CGCS2000,它的EPSG代码是4490。你从ArcGIS Server发布出来的服务,如果原始数据是4490坐标系的,那么服务本身也是基于这个坐标系的。
这就好比,你有一张用“本地独立坐标系”绘制的精密地图,却想把它贴到一个标准的“世界地图”球体上,如果不经过正确的坐标转换和参数配置,那肯定是“牛头不对马嘴”。直接拿Cesium默认的4326加载方式去加载4490的服务,结果就是影像错位、偏移,甚至因为瓦片索引规则不同而请求失败。所以,理解并解决这个坐标系的差异,是实现精准加载的第一步,也是最重要的一步。
2. 核心原理拆解:WMTS、切片方案与坐标系的三角关系
要搞定Cesium加载ArcGIS的4490服务,我们不能只停留在“复制粘贴代码”的层面,得稍微理解一下背后几个核心概念是怎么拧在一起的。这样出了问题你才知道往哪儿排查。
首先,服务类型是WMTS。 你可能会问,ArcGIS Server不是有自家的“ArcGIS动态地图服务”吗?没错,但那种服务是动态出图的,性能在三维场景中往往不够理想。对于Cesium这种需要海量、快速加载影像底图的应用,我们通常使用的是经过预切片的缓存服务。ArcGIS Server在发布服务时,如果选择了创建缓存,它就会按照一定的规则(比例尺级别、切片原点、图片格式等)预先生成好一堆图片瓦片。而WMTS(Web Map Tile Service)正是OGC制定的、用于获取这些预切片地图瓦片的标准协议。所以,我们其实是通过Cesium去调用ArcGIS Server提供的这个标准WMTS接口,来获取一张张已经切好的图片,再贴到三维地球上。
其次,关键在于“切片方案”。 这是连接坐标系和瓦片索引的桥梁。一个切片方案(Tiling Scheme)定义了:1)瓦片从哪个原点开始编号(通常是左上角或左下角);2)每个缩放级别(Level)下,地球被划分成多少行多少列的瓦片;3)每个瓦片对应的地理范围是多少。Cesium内置了两种主要的切片方案:GeographicTilingScheme(基于经纬度的地理坐标系)和WebMercatorTilingScheme(基于Web墨卡托投影,EPSG:3857)。这里有个巨大的误区:很多人一看是地理坐标系4490,就下意识地使用 new Cesium.GeographicTilingScheme()。对于ArcGIS Server为4490坐标系创建的缓存,这样做大概率是错的!
因为ArcGIS Server在为4490坐标系创建缓存时,其内置的切片方案虽然基于地理坐标,但其瓦片原点、层级划分与Cesium默认的GeographicTilingScheme并不相同。如果你用错了,就会导致Cesium计算的瓦片索引(TileMatrix, TileRow, TileCol)和服务器上存储的瓦片文件名对不上,自然就加载不到图片。所以,我们需要从ArcGIS Server那里获取它生成缓存时使用的精确切片方案参数,并在Cesium中复现这个方案。
最后,坐标系是基石。 EPSG:4490定义了坐标的基准面、椭球体等大地测量参数。Cesium本身是支持多种椭球体的,包括CGCS2000椭球体(与WGS84参数极其接近但略有不同)。当我们正确配置了切片方案后,Cesium就能将4490坐标下的经纬度,正确地映射到对应的瓦片请求上。
简单来说,这个过程就是:Cesium根据相机位置计算4490坐标系下的经纬度 -> 根据我们配置的、与ArcGIS Server一致的切片方案,将经纬度转换为具体的瓦片行列号和层级号 -> 将这些参数拼接到WMTS的URL模板中 -> 向服务器发起请求获取正确的瓦片图片。


2278

被折叠的 条评论
为什么被折叠?



