使用Cesium做三维特别是房屋白模啥的,通常会用3DTiles,这种情况我通常用FME来生成,不管我的数据是什么坐标系,他都会自己处理好坐标系的问题。直到我需添加单个房屋模型时,glb模型文件就成了比较好的选择,但是在加的过程中遇到了很多问题,特别是建模的时候基础线框使用了比较通用的墨卡托投影坐标系的数据导致模型大小不对的问题,亏自己搞了十年GIS了,刚遇到的时候竟然没意识到这个问题,真是蠢透了。
Cesium的三维空间坐标系
首先记录一个跟标题没啥关系,但也是加载过程中遇到的问题。这跟Cesium的三维空间坐标轴有关,Cesium的三维空间坐标系是这样的
Cesium三维空间坐标轴但是建模软件,比如我用的Sketchup Pro的坐标轴却有所不同,蓝色是Z轴,红色是X轴,绿色是Y轴。
Sketchup三维空间坐标轴跟Cesium坐标轴相比,Sketchup的X轴和Y轴都得顺时针转个90°,因此导出的模型也会有差别,不同的建模软件可能会不同,记录这个事情就行。
墨卡托投影的变形
其实说明标题的问题很简单,因为墨卡托坐标系在长度上是会有变形的,越靠近赤道变形越少,越靠近两极变化越大
有大佬做了一个演示摩卡他投影的小游戏,下面也贴了游戏的演示动画。可以理解成有一个内切地球的圆柱,地球中心放一盏灯,将地球投影到圆柱上。
墨卡托投影演示动画通过演示可以看出,周长为2πR的球,投影出来的地图是一个变成变成为2πR的正方形。在赤道,长度为2πR投影距离也是2πR,实际长度和投影长度的比是1,没有变形,实际上我在想到这个问题之后真的跑去osm下了一点印度尼西亚的数据试了下。在维度为ϕ的地方,纬线周长为2πR*cos(ϕ),投影长度仍然是2πR,实际长度和投影长度的比是cos(ϕ)。
如果已经用墨卡托投影做了很多模型,在Cesium里面也不是不能用,根据模型所在的维度将变换比例算出来然后还原即可,不过得注意,高度不能还原。
高斯-克吕格投影的变形
不能用墨卡托投影,再一个比较常用的就是高斯-克吕格投影了,其实高斯投影与墨卡托投影类似,是一种横轴墨卡托投影。不同之处在于高斯-克吕格的圆柱体沿经线而不是赤道接触球体或椭圆体,且只正投影中央经线两侧一定范围的椭球面。
[图片上传失败...(image-285acd-1637145102447)]
高斯-克吕格投影的中央经线无变形,自中央经线向投影带边缘,变形逐渐增加,变形最大之处在投影带内赤道的两端。
其变形公式为:
其中μ是长度比,ϕ是纬度,λ是经度与中央经线经度差,,嗯,算起来挺麻烦的,好在查论文查到了别人算的数据
高斯克吕格投影变形可以看到,高斯-克吕格投影的长度和面积变形是很小的,到房屋模型这么大的比例尺,用三度带,最大经差1.5°,我国最南端北纬20°左右,变形量千分之三左右。
总结
三维GIS建模的时候不要随便使用墨卡托投影,除非在赤道附近,可以使用高斯-克吕格投影,我试验下来的效果也很好。
网友评论