代码编织梦想

Google Maps、Virtual Earth等网络地理所使用的地图投影,常被称作Web Mercator或Spherical Mercator,它与常规墨卡托投影的主要区别就是把地球模拟为球体而非椭球体。建议先对地图投影知识做一个基本的了解,《 地图投影为什么》。
什么是墨卡托投影?
墨卡托(Mercator)投影,又名“等角正轴圆柱投影”,荷兰地图学家墨卡托(Mercator)在1569年拟定,假设地球被围在一个中空的圆柱里,其赤道与圆柱相接触,然后再假想地球中心有一盏灯,把球面上的图形投影到圆柱体上,再把圆柱体展开,这就是一幅标准纬线为零度(即赤道)的“墨卡托投影”绘制出的世界地图。从球到平面,有个转换公式,这里就不再罗列。
Google们为什么选择墨卡托投影?
墨卡托投影的“等角”特性,保证了对象的形状的不变行,正方形的物体投影后不会变为长方形。“等角”也保证了方向和相互位置的正确性,因此在航海和航空中常常应用,而Google们在计算人们查询地物的方向时不会出错。
墨卡托投影的“圆柱”特性,保证了南北(纬线)和东西(经线)都是平行直线,并且相互垂直。而且经线间隔是相同的,纬线间隔从标准纬线(此处是赤道,也可能是其他纬线)向两级逐渐增大。
但是,“等角”不可避免的带来的面积的巨大变形,特别是两极地区,明显的如格陵兰岛比实际面积扩大了N倍。不过要是去两极地区探险或科考的同志们,一般有更详细的资料,不会来查看网络地图的,这个不要紧。

为什么是圆形球体,而非椭球体?
这说来简单,仅仅是由于实现的方便,和计算上的简单,精度理论上差别0.33%之内,特别是比例尺越大,地物更详细的时候,差别基本可以忽略。
Web墨卡托投影坐标系:

  以整个世界范围,赤道作为标准纬线,本初子午线作为中央经线,两者交点为坐标原点,向东向北为正,向西向南为负。

  X轴:由于赤道半径为6378137米,则赤道周长为2*PI*r = 40075016.0019724,因此X轴的取值范围:[-20037508.3427892,20037508.3427892]。

  Y轴:由墨卡托投影的公式可知,同时上图也有示意,当纬度φ接近两极,即90°时,y值趋向于无穷。这是那些"懒惰的工程师"就把Y轴的取值范围也限定在[-20037508.3427892,20037508.3427892]之间,搞个正方形。

  懒人的好处,众所周知,事先切好静态图片,提高访问效率云云。俺只是告诉你为什么会是这样子。因此在投影坐标系(米)下的范围是:最小(-20037508.3427892, -20037508.3427892 )到最大 (20037508.3427892, 20037508.3427892)。

  对应的地理坐标系:

  按道理,先讲地理坐标系才是,比如球体还是椭球体是地理坐标系的事情,和墨卡托投影本关联不大。简单来说,投影坐标系(PROJCS)是平面坐标系,以米为单位;而地理坐标系(GEOGCS)是椭球面坐标系,以经纬度为单位。具体可参考《坐标系、坐标参照系、坐标变换、投影变换》。

经度:这边没问题,可取全球范围:[-180,180]。
纬度:上面已知,纬度不可能到达90°,懒人们为了正方形而取的-20037508.3427892,经过反计算,可得到纬度85.05112877980659。因此纬度取值范围是[-85.05112877980659,85.05112877980659]。其余的地区怎么办?没事,企鹅们不在乎。
因此,地理坐标系(经纬度)对应的范围是:最小(-180,-85.05112877980659),最大(180, 85.05112877980659)。至于其中的Datum、坐标转换等就不再多言。
如果想知道坐标怎么计算的,请看全解析第2季《 相关坐标计算》;更深入的和GIS相关的第3季《 WKT 形式表示》


墨卡托坐标转经纬度
//经纬度转墨卡托

 public Vector2D lonLat2Mercator(Vector2D lonLat)
        {
            Vector2D mercator = new Vector2D();
            double x = lonLat.X * 20037508.34 / 180;
            double y = Math.Log(Math.Tan((90 + lonLat.Y) * Math.PI / 360)) / (Math.PI / 180);
            y = y * 20037508.34 / 180;
            mercator.X = x;
            mercator.Y = y;
            return mercator;
        }
        //墨卡托转经纬度
        public Vector2D Mercator2lonLat(Vector2D mercator)
        {
            Vector2D lonLat = new Vector2D();
            double x = mercator.X / 20037508.34 * 180;
            double y = mercator.Y / 20037508.34 * 180;
            y = 180 / Math.PI * (2 * Math.Atan(Math.Exp(y * Math.PI / 180)) - Math.PI / 2);
            lonLat.X = x;
            lonLat.Y = y;
            return lonLat;
        }

本文转自:墨卡托坐标以及 墨卡托坐标转经纬度_flowerspring的博客-CSDN博客_墨卡托坐标

墨卡托坐标和经纬度坐标相互转换-爱代码爱编程

//墨卡托转经纬度 function webMercator2lonLat(mercator) { var lonlat={x:0,y:0}; var x=mercator.x/20037508.34*180; var y=mercator.y/20037508.34*180; y=

百度墨卡托坐标转百度经纬度坐标python_john_doe.的博客-爱代码爱编程

本文参考 https://blog.csdn.net/qq_16664325/article/details/67639684 原文用的是java语言,我只是把它转成Python语言。 xu = 6370996.81 S

墨卡托坐标转经纬度-爱代码爱编程

墨卡托坐标转经纬度 3857坐标系转4326坐标系 mercatorTolonlat(lon,lat){ let x = lon/20037508.34*180; let y = lat/20037508.34*180; y= 180/Math.PI*(2*Math.atan(Math.exp(y*Ma

java 墨卡托转经纬度_经纬度,墨卡托等坐标转换-爱代码爱编程

1.经纬度转墨卡托 1.1Java: public static double[] lngLat2Mercator(double lng, double lat) { double[] xy = new double[2]; double x = lng * 20037508.342789 / 180; double y = Math.log

python经纬度转换为平面坐标的算法_百度墨卡托平面坐标转经纬度坐标-爱代码爱编程

本文原创作者:鲲之鹏(http://www.site-digger.com) 本文原始链接:http://www.site-digger.com/html/articles/20150831/98.html 以”钟楼”为例,在百度地图中搜索(结果如上图所示),返回的是12128773.43,4040249.00这种形式的坐标。这是什么坐标呢?这

百度墨卡托平面坐标转经纬度坐标--查表法 唯一有效!!!-爱代码爱编程

转自http://www.site-digger.com/html/articles/20150831/98.html。 百度墨卡托平面坐标转经纬度坐标 发布时间:2015-08-31 以”钟楼”为例,在百度地图中搜索(结果如上图所示),返回的是12128773.43,4040249.00这种形式的坐标。这是什么坐标呢?这是墨卡托平面坐标(htt

java 墨卡托转经纬度,坐标转换:墨卡托 & 经纬度-爱代码爱编程

坐标转换:墨卡托 & 经纬度 var lonlat={x:114.514864,y:38.04232}; var mercator={x:12747736.346966475,y:4585405.935084799}; //经纬度转墨卡托 function lonlat2mercator(lonlat){ var mercator={

PHP墨卡托坐标转经纬度,墨卡托坐标与经纬度相互转换的方法-爱代码爱编程

最近用到了墨卡托坐标转换经纬度的需求,原理什么的不想多说,需要的可以查看这里: 麦卡托投影法 Web Mercator 经纬度转Wev墨卡托 版本1 dvec3 CMathEngine::lonLat2WebMercator(dvec3 lonLat) { dvec3  mercator; double x = lonLat.x

墨卡托影像 转 等经纬度影像,墨卡托图片 转 等经纬度图片-爱代码爱编程

之前写了等经纬度影像 转 墨卡托影像的代码,后来有朋友问墨卡托影像 转 等经纬度影像要怎么做,于是今天花了点时间写了这个转换代码。 package main; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import jav

大地经纬度坐标系与Web墨卡托坐标系的转换-爱代码爱编程

文章目录 1. 概述2. 实现3. 参考 1. 概述 我在《大地经纬度坐标与地心地固坐标的的转换》这篇文章中已经论述了大地坐标系/地理坐标系的概念,简单来说就是由经度、纬度以及高程(BLH)确定的坐标系,它是一种曲面坐标。 然而,在实际使用过程中我们用的最多的还是平面坐标,并且单位最好与常用的长度单位(米)一致。所以就产生了从曲面到平面的转

百度与墨卡托坐标互转_墨卡托坐标于百度经纬度坐标相互转换c++-爱代码爱编程

//经纬度转墨卡托 static wgs842mercator(poi) {//[114.32894, 30.585748] var mercator = {}; var earthRad = 6378137.0; // c