大地经纬度坐标系与Web墨卡托坐标系的转换

简介: 大地经纬度坐标系与Web墨卡托坐标系的转换

大地经纬度坐标系与Web墨卡托坐标系的转换

目录

1. 概述

我在《大地经纬度坐标与地心地固坐标的的转换》这篇文章中已经论述了大地坐标系/地理坐标系的概念,简单来说就是由经度、纬度以及高程(BLH)确定的坐标系,它是一种曲面坐标。

然而,在实际使用过程中我们用的最多的还是平面坐标,并且单位最好与常用的长度单位(米)一致。所以就产生了从曲面到平面的转换,这个过程也叫做投影,转换的结果也就是投影平面坐标系。我在《GDAL坐标转换》这篇文章中详细论述了我们国内常用的三种投影平面坐标系:横轴墨卡托投影,高斯-克吕格投影和UTM投影。本质上来说,高斯-克吕格投影和UTM投影其实都是横轴墨卡托投影,横轴墨卡托投影也是用的最为广泛的地图投影方式。

但是在GIS,尤其是WebGIS领域中,横轴墨卡托投影的使用远没有Web墨卡托投影方式用的多。最重要的原因是Web墨卡托投影的转换算法比横轴墨卡托投影要简单很多,符合Web的轻量化的特点。

2. 实现

Web墨卡托投影是横轴墨卡托投影的特化版,要完全搞清楚Web墨卡托投影就必须得先搞清楚横轴墨卡托投影,不过横轴墨卡托投影实在太复杂了,但是我们可以定性地去理解。它的计算过程大概可以这样理解:

在X方向上,为了保证投影到平面后经线和纬线仍然垂直,那么每条纬线都会按照赤道周长展开,也就是2PIr=220037508.34278922∗PI∗r=2∗20037508.3427892。由于原点位于平面中心,那么可以算得X轴的取值范围:[-20037508.3427892,20037508.3427892]。经度与投影后X长是简单的线性关系。

在Y方向上,则需要借助于墨卡托投影公式。为了保证投影的结果是正方形,那么就把Y轴的取值范围也取值成[-20037508.3427892,20037508.3427892]之间。这样做没什么道理,纯粹是为了希望投影的结果是正方形,便于切片。最后,通过墨卡托投影公式进行反算,得到的经纬度范围就是[-85.05112877980659,85.05112877980659]。也就是这种投影方式,大于这个范围是失效的。

参考Cesium的具体实现如下:

#include <iostream>
//#include <eigen3/Eigen/Eigen>
//#include <osgEarth/GeoData>
using namespace std;
const double epsilon = 0.000000000000001;
const double pi = 3.14159265358979323846;
const double d2r = pi / 180;
const double r2d = 180 / pi;
const double a = 6378137.0;   //椭球长半轴
const double f_inverse = 298.257223563;     //扁率倒数
const double b = a - a / f_inverse;
//const double b = 6356752.314245;      //椭球短半轴
const double e = sqrt(a * a - b * b) / a;
//墨卡托范围[-PI, PI]->大地纬度范围[-PI/2, PI/2]
static double mercatorAngleToGeodeticLatitude(double mercatorAngle)
{
  return pi / 2.0 - (2.0 * atan(exp(-mercatorAngle)));
  //return 2.0 * atan(exp(mercatorAngle)) - pi / 2.0;
}
//Web墨卡托投影所支持的最大纬度(北和南)
static double maximumLatitude = mercatorAngleToGeodeticLatitude(pi);
//大地纬度范围[-PI/2, PI/2]->墨卡托范围[-PI, PI]
static double geodeticLatitudeToMercatorAngle(double latitude)
{
  // Clamp the latitude coordinate to the valid Mercator bounds.
  if (latitude > maximumLatitude)
  {
    latitude = maximumLatitude;
  }
  else if (latitude < -maximumLatitude)
  {
    latitude = -maximumLatitude;
  }
  double sinLatitude = sin(latitude);
  return 0.5 * log((1.0 + sinLatitude) / (1.0 - sinLatitude));
} 
void Blh2Wmc(double &x, double &y, double &z)
{
  x = x * d2r * a;
  y = geodeticLatitudeToMercatorAngle(y * d2r) * a;
}
void Wmc2Blh(double &x, double &y, double &z)
{
  //var oneOverEarthSemimajorAxis = this._oneOverSemimajorAxis;
  x = x / a * r2d;
  y = mercatorAngleToGeodeticLatitude(y / a) * r2d; 
}
int main()
{
  double x = 113.6;
  double y = 38.8;
  double z = 100;    
  printf("%.10lf\n", maximumLatitude * r2d);
  printf("原大地经纬度坐标:%.10lf\t%.10lf\t%.10lf\n", x, y, z);
  Blh2Wmc(x, y, z);
  printf("Web墨卡托坐标:%.10lf\t%.10lf\t%.10lf\n", x, y, z);
  Wmc2Blh(x, y, z);
  printf("转回大地经纬度坐标:%.10lf\t%.10lf\t%.10lf\n", x, y, z);
}

最终运行的结果:

通过GlobalMapper中的坐标转换工具对照的结果如下:

两者结果基本一致。

3. 参考

  1. Web Mercator 公开的小秘密
  2. GIS——各大地图厂商为什么偏爱web墨卡托投影
  3. 墨卡托及Web墨卡托投影

分类: GIS

标签: 坐标转换 , GIS


相关文章
Cesium系列:加载单个模型
Cesium如何加载单个三维模型数据
1244 0
|
安全 索引 算法
分布式唯一ID系列(2)——UUID适合做分布式ID吗
UUID的生成策略: UUID的方式能生成一串唯一随机32位长度数据,它是无序的一串数据,按照开放软件基金会(OSF)制定的标准计算,UUID的生成用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字。
6056 0
|
3月前
|
人工智能 自然语言处理 前端开发
一句话画出整张架构图?这款 2k star 开源 AI 画板,真能帮你告别熬夜改流程图吗?
小华同学推荐:Smart Excalidraw,用自然语言一键生成专业图表!基于AI+Excalidraw,支持20+图表类型,自动生成流程图、架构图等,告别手动排版。开源免费,可本地部署,适配团队协作与个人使用,让画图回归“说人话”。
508 0
|
存储 人工智能 自然语言处理
Lindorm作为AI搜索基础设施,助力Kimi智能助手升级搜索体验
月之暗面旗下的Kimi智能助手在PC网页、手机APP、小程序等全平台的月度活跃用户已超过3600万。Kimi发布一年多以来不断进化,在搜索场景推出的探索版引入了搜索意图增强、信源分析和链式思考等三大推理能力,可以帮助用户解决更复杂的搜索、调研问题。 Lindorm作为一站式数据平台,覆盖数据处理全链路,集成了离线批处理、在线分析、AI推理、融合检索(正排、倒排、全文、向量......)等多项服务,支持Kimi快速构建AI搜索基础设施,显著提升检索效果,并有效应对业务快速发展带来的数据规模膨胀和成本增长。
|
定位技术 开发工具 数据安全/隐私保护
GIS数据格式坐标转换(地球坐标WGS84、GCJ-02、火星坐标、百度坐标BD-09、国家大地坐标系CGCS2000)
GIS数据格式坐标转换(地球坐标WGS84、GCJ-02、火星坐标、百度坐标BD-09、国家大地坐标系CGCS2000)
4924 1
|
7月前
|
数据可视化 API 开发工具
构建高效需求池,这些需求池管理工具帮你提升需求管理的完成率
在产品开发中,需求来源多、变更频繁,易导致混乱。需求池管理工具通过统一收集、分类评估、优先级排序及任务流转,助力团队高效协同。它不仅提升跨部门协作效率,还确保需求从收集到落地的全流程可视化与可追踪,是现代产品团队不可或缺的利器。
|
定位技术
ArcGIS:如何对栅格图像进行地理配准和定义投影?
ArcGIS:如何对栅格图像进行地理配准和定义投影?
5874 1
|
开发者 容器
flex 布局属性在实际项目中的应用场景有哪些?
flex 布局属性在实际项目中的应用场景有哪些?
|
机器学习/深度学习 数据可视化 数据挖掘
Python数据分析工具有哪些
【7月更文挑战第3天】Python数据分析工具有哪些
638 58
|
Java 程序员 测试技术
【Qt底层之内存管理机制】Qt 对象 父子关系、运行时机制与高效编程技巧
【Qt底层之内存管理机制】Qt 对象 父子关系、运行时机制与高效编程技巧
830 2

热门文章

最新文章