UTM(Universal Transverse Mercator Grid System, 通用横墨卡托网格系统)
1、UTM坐标系是投影坐标系
如何投影:墨卡托投影
这个投影简单来说就是从地心发出一条射线,经地表一点,在向外,与地球的外切圆柱体(南北方向交于一点),这个交点就是地表的这个点的墨卡托投影点。
显然极点附近的点在无穷远,因此不会取完整的纬度,而是只取中间的纬度。
这个视频说的比较明白:
UTM的好处之一是,在这个UTM地图上连接两点画一条直线,再投影回地球上,如果有一条船在这两点之间航行,那么它不需要动罗盘就可以直达(墨卡托投影是等角投影,也就是地图上的两条直线的夹角投影回去仍然是这个夹角)。
2、UTM坐标系在经度方向分为60个区,每个区6度,一共360度
编号1-60
纬度分区:编号C-X(不含I,O,共20个区),每个区的南北跨度为 8°
3、UTM坐标的表示
在每个UTM坐标的分区内,UTM坐标以正东,正北的米值单位来表示位置(由于地球的投影畸变,实际的UTM坐标与米值单位之间还有一个0.9996的倍数关系,在高精度场合需要考虑),UTM的东向坐标的计算方式是,先取所在区域的经度中心线,令经度中心线的X0为500000,再取距离经度中心线向东的偏移量,如果在经度中心线东边,X坐标就大于X0,如果在经度中心线西边,X坐标就小于X0,但仍然是一个正数。
北向坐标的计算方式是,取距离赤道的向东的偏移量,在北半球一般取向东为X轴,向北为Y轴,向上为Z轴,这样也符合东北天的习惯,当然也可以取北东地。
这里看一个实际的UTM坐标的结构体定义例子:
struct UTMCoordinate {
UTMCoordinate() = default;
explicit UTMCoordinate(int zone, const Vec2d& xy = Vec2d::Zero(), bool north = true)
: zone_(zone), xy_(xy), north_(north) {}
int zone_ = 0; // utm 区域
Vec2d xy_ = Vec2d::Zero(); // utm xy
double z_ = 0; // z 高度
bool north_ = true; // 是否在北半球
};
这里的XYZ即上述东北天定义的XYZ坐标