精华内容
下载资源
问答
  • 这是一个计算墨卡托投影的非常简单的函数。 您不需要任何工具箱即可工作。 [x,y,scaleFactor] = mercator(lon,lat), -> Mercator Projection 输入: lon:一个或多个点的经度lat:一个或多个点的纬度输出:墨卡托...
  • 墨卡托GL MercatorGL是用于使用WebGL在GPU上计算Web墨卡托投影的最小库。 它提供了一些实用程序,可将用于将经度/纬度坐标投影到已经存在的顶点着色器代码中的GLSL代码,并计算所需的制服。 MercatorGL通过以64位...
  • 百度经纬度转换百度墨卡托通常需要使用百度api进行转换,比较麻烦。经过一番搜集资料查看js代码终于实现百度经纬度与百度墨卡托离线互转,使用python代码实现
  • 将百度地图平面投影坐标(墨卡托)转换为经纬度坐标 用在什么场景 使用PHP来调用百度地图API,某些情况下得到的是投影坐标,需要转换为经纬度坐标 为什么要写这个东西 首先,百度地图最好用 第二,百度接口很不准,...
  • 包含墨卡托投影与经纬度互相转换的C代码以及原理解释文章2篇
  • 墨卡托投影.rar

    2019-06-10 10:41:46
    利用MFC将一定范围内的经纬线网转化为墨卡托投影,并可视化,生成特殊点的坐标值以及变形率
  • 墨卡托投影是圆柱投影,应用到海图的较多,兰勃特投影是圆锥投影,应用到国家行政区划图、人口图等较多。文中通过对海南岛研究区进行墨卡托投影和兰伯特投影,来分析两种投影在海南岛此类研究区的变形差异情况,以期建立...
  • 百度墨卡托坐标转百度经纬度离线实现(源码) https://blog.csdn.net/funkstill/article/details/89400809
  • geojson格式的世界地图,包含各个国家边界,两种投影,EPSG4326和EPSG3857。 【凑够50个字】
  • Python实现 支持墨卡托投影转地理坐标及地理坐标转墨卡托投影的转换函数 支持Numpy向量计算,可大批量转多对经纬度数据
  • GIS空间坐标系,WGS84经纬度,先转GCJ02国测02,再转web墨卡托的代码。项目中用到的分享给大家
  • viewport-mercator-project, 利用墨卡托投影的地图变换器 viewport-mercator-project | 文档支持韦伯投影的投影和相机工具。 它的核心是一个转换到地图坐标( 例如 )的工具。 ,) screen屏幕坐标和背面。是谁?专门为...
  • sphericalmercator, 在Javascript中,球面墨卡托数学 sphericalmercator 为墨卡托米,屏幕像素( 。256 x256或者可以配置的大小平铺) 和纬度/经度之间的转换提供投影数学。nodejs包和浏览器兼容。安装npm install @...
  • 墨卡托投影坐标、手机屏幕像素坐标转换
  • 北纬10~50,东经100~140 生成投影后坐标以及变形率
  • 墨卡托法,计算任意多边形曲面的面积。可以用于各种地图控件。
  • WGS84转墨卡托坐标

    2017-03-10 21:21:51
    WGA84经纬度坐标系转换围墨卡托投影坐标代码
  • 根据边界框和缩放级别生成 x/y/z 球形墨卡托切片列表。 安装 npm install xyz-affair 用法 var xyz = require ( "xyz-affair" ) ; var bounds = [ [ - 74.00596618652344 , //minimum longitude (west) 40....
  • 最近开发地图,用到了!所以就干脆费了点功夫把他做成一个Java窗口小程序了!需要的可以下!CSDN不能免费下载了,所以弄了个最低分。只是想分享给大家!
  • 墨卡托投影C#算法实现 http://blog.csdn.net/guanghua2009/article/details/6641548
  • 目录 一、开胃小知识 二、墨卡托投影 1、什么是墨卡托投影? 2、墨卡托投影的特点 3、墨卡托投影的缺点 三、瓦片地图 1、GIS介绍 2、瓦片地图原理 四、瓦片地图原理---续 1、经纬度 2、投影 3、瓦片 4、瓦片编号 5、...

    目录

    一、开胃小知识

    二、墨卡托投影

    1、什么是墨卡托投影?

    2、墨卡托投影的特点

    3、墨卡托投影的缺点

    三、瓦片地图

    1、GIS介绍

    2、瓦片地图原理

    四、瓦片地图原理---续

    1、经纬度

    2、投影

    3、瓦片

    4、瓦片编号

    5、关于中国的经纬度


    一、开胃小知识

    先写几个小知识点:

    1)既然地球是圆的,但是为什么地面却是平的呢?这主要是因为人和地球比起来,相差悬殊;人眼看到的地球表面区域弧度非常小,人类察觉不到,从而产生地面平坦的错觉,我们因此会认为“地面是平面”了。

    2)纬度是指某点与地球球心的连线和地球赤道面所成的线面角,其数值在0至90度之间。经纬度是经度与纬度的合称组成一个坐标系统。又称为地理坐标系统。东经正数,西经为负数;北纬为正数,南纬为负数。

    3)东西半球分界线不是本初子午线;而是东经160度和与其相对的西经20度所组成的经线圈。至于为啥可参考这篇知乎:为什么东西半球的分界线不是本初子午线,而南北半球的界线却是赤道? - 知乎

    二、墨卡托投影

    1、什么是墨卡托投影?

    我们平时看到的地图大多是平面的,那么如何将一个三维的地球画在平面上呢?

    墨卡托投影就是将三维的地球表示在一个二维平面上的方法之一,也是应用得最广泛的方法。我们平时看到的谷歌地图,百度地图,包括我们的GeoHey地图,都是使用的(WEB)墨卡托投影。 

    墨卡托投影的过程其实非常简单,就是将地球展开成一个圆柱,再将圆柱展开成平面。

    从球心出发射出一条直线,它与球的交点投影后的位置就是这条线与圆柱的交点。当然,中间的计算过程中会做一些取舍。

    引用来源:一个小游戏让你彻底弄懂墨卡托投影 - 知乎


    细说墨卡托

    墨卡托(Mercator)投影,是一种"等角正切圆柱投影”,荷兰地图学家墨卡托(Gerhardus Mercator 1512-1594)在1569年拟定,假设地球被围在一中空的圆柱里,其标准纬线与圆柱相切接触,然后再假想地球中心有一盏灯,把球面上的图形投影到圆柱体上,再把圆柱体展开,这就是一幅选定标准纬线上的“墨卡托投影”绘制出的地图。墨卡托投影没有角度变形,由每一点向各方向的长度比相等,它的经纬线都是平行直线,且相交成直角,经线间隔相等,纬线间隔从标准纬线向两极逐渐增大。墨卡托投影的地图上长度和面积变形明显,但标准纬线无变形,从标准纬线向两极变形逐渐增大,但因为它具有各个方向均等扩大的特性,保持了方向和相互位置关系的正确。在地图上保持方向和角度的正确是墨卡托投影的优点,墨卡托投影地图常用作航海图和航空图,如果循着墨卡托投影图上两点间的直线航行,方向不变可以一直到达目的地,因此它对船舰在航行中定位、确定航向都具有有利条件,给航海者带来很大方便。

    引用来源:投影和坐标系统那点事 - 简书

    2、墨卡托投影的特点

    墨卡托投影有以下特点:

    • 原来的经线(子午线)都汇聚于极点,纬度愈高经线的间隔愈小,而在墨卡托投影上,经线全部画成与赤道上间隔相等的平行直线。
    • 地球表面上假想的各纬线间隔基本是相等的,而在墨卡托投影上纬线间隔由赤道向两极逐渐扩大,而且经纬线以同一倍数扩大。
    • 墨卡托投影上经、纬线均为平行直线而且经纬线之间互相正交。
    • 地球上的等角航线在墨卡托投影地图上均表现为直线。
    • 图上能正确表示航线与子午线的夹角。例如,航线在地球上与子午线的夹角为15^{\circ},图上也表示为15^{\circ}
    • 比例尺随纬度而变化,在一张地图上纬度不同,同一距离的比例尺也不同,不能比较面积。因而在量测距离时不能使用同一分划尺(但以海里为单位量测时,因为1海里即为纬度1{}',可使用所量地域附近的分划尺)。

        墨卡托投影是按等角条件修改透视圆筒投影而得到的投影。

    等角(也称为保形)是指当地图上任何一点的各方向具有相同的比例,称为局部保形,透视圆筒投影如下图所示:

     从墨卡托投影图上可以看出,经线间隔的经度如果相等,则经线是等距平行的直线,纬线也是平行的直线,而且经纬线是相互垂直的。

    墨卡托投影有一个特别的特性:所有罗盘等角线,或称斜航线(就是与所经过的所有经线形成相同角度的航线,也称恒向航线)在墨卡托投影下都是直线。这使得在航海领域这个投影非常重要。

    墨卡托投影对透视圆筒投影改造点:要使圆筒投影称为等角的性质,必须使由赤道向两极经线逐渐伸长的倍数与经线上各点相应的纬度扩大的倍数相同。

    地球赤道的圆周长为2\piR(R为赤道半径),而各纬线圈周长为2\piR\cos \Phi\Phi表示对应的纬度),因此,墨卡托投影地图上纬线长与地球上实际纬线长的比值为:

    投影上的纬线长/地球上实际纬线长 = 2{\pi}R/2{\pi}Rcos\phi = sec\phi

    既然各纬度的纬线扩大\sec \Phi(正割)倍,为了保持等角,各纬线通过处的经线也要相应的扩大\sec \Phi倍。

    这时,经线方向上的长度比才能与纬线方向上的长度比相等。

    注意:投影地图上经纬线的伸长与纬度的正割成比例变化,随纬度增高极具拉伸,到极点成为无穷大;面积的扩大更为明显,在60^{\circ}的地方面积要扩大四倍(因为\sec 60^{\circ} = 2,面积比是长度比的两倍,所以是四倍)。如下图所示,地理上等半径圆在高纬度面积明显扩大。(一般都只截取了85度纬度以内的部分,否则会是一个无穷高的图;与此同时由于取到85度时仍然会让地图变得很大,互联网地图用的墨卡托投影在计算上也会做一些处理,让地图没那么大~~)

    Web墨卡托投影

    最后还有一点,那就是程序员也特别喜欢,Google基于墨卡托投影设计了一个Web墨卡托投影,使得全世界可以在一个正方形里面刚好放下,极大简化了Web地图的涉及和计算的效率。

    3、墨卡托投影的缺点

    墨卡托投影的地图最大的缺点就是和现实差别太大,变形非常严重。

    在墨卡托投影的地图上,变形最严重的就是格陵兰岛了。地图上非洲的大小和格陵兰岛差不多大,但如果计算一下的话:非洲面积约是3020万平方千米,格陵兰岛面积约是217万平方千米,也就是说,非洲的面积是格陵兰岛的14倍!

    再比如墨卡托投影的地图上的加拿大,看起来是个瘦瘦的长方形,但实际上,加拿大是个类似正方形的形状。它不仅扭曲得不像样,而且还被放大了好几倍。在地图上加拿大的面积大约是美国的三倍,实际上加拿大比美国大不了多少。

    引用来源:墨卡托投影_不睡觉的怪叔叔的博客-CSDN博客_墨卡托投影


    三、瓦片地图

    引用来源:瓦片地图原理 - 简书

    1、GIS介绍

    地理信息系统(Geographic Information System或 Geo-Information system,GIS)有时又称为“地学信息系统”。它是一种特定的十分重要的空间信息系统。它是在计算机硬、软件系统支持下,对整个或部分地球表层(包括大气层)空间中的有关地理分布数据进行采集、储存、管理、运算、分析、显示和描述的技术系统。和维护性。

    普通地图分类

    • 按照比例尺大小
    1. 大比例尺地形图:1:5千—1:2.5万比例尺地形图 (1cm:5k cm — 1cm:25k cm)
    2. 中比例尺地形图:1:5万—1:25 万比例尺地形图
    3. 小比例尺地形图:1:50万-1:100万比例尺地形图
    4. 我国称1:1万、1:2.5万、1:5万、1:10万、1:25万、1:50万、1:100万七种比例尺普通地图为国家基本比例尺地形图

            备注:地图比例尺越大误差越小,图上测量精度越高。大比例尺地图,内容详细,几何精度高,可用于图上测量。小比例尺地图,内容概括性强,不宜于进行图上测量

    • 实现方式
      瓦片地图:由一张一张的正方形小图片拼接成的地图。
      矢量地图:根据矢量数据,绘制出来的地图。

    2、瓦片地图原理

    瓦片
    指将一定范围内的地图按照一定的尺寸和格式,按缩放级别或者比例尺,切成若干行和列的正方形栅格图片,切片后的正方形栅格图片被形象的称为瓦片(Tile)。

     瓦片.png

     地图瓦片.png

    层次模型
    瓦片地图金字塔模型是一种多分辨率层次模型,从瓦片金字塔的底层到顶层,分辨率越来越低,但表示的地理范围不变。

    地图瓦片金字塔模型.png

    地图瓦片层级关系.png

    地图坐标系

    • 经纬度坐标系
    • 像素坐标系
      像素坐标系,也可以成为屏幕坐标系,像素坐标系和地图的经纬度坐标系存在对应关系,屏幕上的每一个像素都对应一个经纬度点位置。 不同缩放级别下,像素坐标系和经纬度坐标系的对应关系是不同的。
    • 投影坐标系
      投影坐标系在GIS系统中非常的重要,作用是将经纬度坐标系和屏幕的像素坐标系关联起来。理解投影坐标系也是GIS系统研究中的一个重要环节。

    地图投影
    地图投影是利用一定数学法则把地球表面的经、纬线转换到平面上的理论和方法。由于地球是一个赤道略宽两极略扁的不规则的梨形球体,故其表面是一个不可展平的曲面,所以运用任何数学方法进行这种转换都会产生误差和变形,为按照不同的需求缩小误差,就产生了各种投影方法。

    常见的投影类型

    1. 高斯-克吕格投影
    2. 斜轴等面积方位投影
    3. 双标准纬线等角圆锥投影
    4. 等差分纬线多圆锥投影
    5. 正轴方位投影
    6. 墨卡托投影(正轴等角圆柱投影)

    墨卡托投影
    墨卡托投影,是正轴等角圆柱投影。由荷兰地图学家墨卡托(G.Mercator)于1569年创立。假想一个与地轴方向一致的圆柱切或割于地球,按等角条件,将经纬网投影到圆柱面上,将圆柱面展为平面后,即得本投影。等角条件是使地球面上微分区域内两个方向的夹角投影到平面以后,保持角度不变的条件。
    百度地图和Google Maps使用的投影方法都是墨卡托投影。

    墨卡托投影结果区域图.png 

    投影结果

    1. 图中红色矩形区域是真实投影结果。
    2. 图中蓝色正方形区域,是数学计算区域。
    3. 正方形的边长是赤道周长。
    4. 纵轴方向,纬度的变化是非线性的。
    5. 横轴方向,经度的变化是线性的。
    6. 横轴和纵轴方向,投影区域和都比真实区域大, 处于拉伸状态。

    墨卡托投影坐标算法

     手机与地图的位置关系

     手机与地图的位置关系.png

    四、瓦片地图原理---续

    引用来源:https://segmentfault.com/a/1190000011276788

    1、经纬度

    地球是一个椭球,Datum是一组用于描述这个椭球的数据集合。最常用的一个Datum是WGS84(World Geodetic System 1984),它的主要参数有:

    • 坐标系的原点是地球质心(center of mass);
    • 子午线(meridian),即零度经线,位于格林威治子午线Royal Observatory所在纬度往东102.5米所对应的的经线圈;
    • 椭球截面长轴为a=6378137米;
    • 椭圆截面短轴为b=6356752.3142米,可选参数;
    • 扁平比例(flattening)f=(a−b)/a=1/298.257223563;
    • geoid,海平面,用于定义高度,本文从略。

    通过以上参数设定,我们才能对地球上的任意一个位置用经度、纬度、高度三个变量进行描述。所以当我们获取一组经纬度信息时,首先要弄明白这组信息对应的Datum。

    WGS84 Datum的信息可以用下图进行概括:

    2、投影

    地图是显示在平面上的,因此需要将球面坐标转换为平面坐标,这个转换过程称为投影。最常见的投影是墨卡托(Mercator)投影,它具有等角性质,即球体上的两点之间的角度方位与平面上的两点之间的角度方位保持不变,因此特别适合用于导航。

    Web墨卡托投影(又称球体墨卡托投影)是墨卡托投影的变种,它接收的输入是Datum为WGS84的经纬度,但在投影时不再把地球当做椭球而当做半径为6378137米的标准球体,以简化计算。其计算公式推导请参考下图:

    备注:这个计算我暂时还没弄懂,看以后能不能补充!

    Web墨卡托投影有两个相关的投影标准,经常搞混:

    • EPSG4326:Web墨卡托投影后的平面地图,但仍然使用WGS84的经度、纬度表示坐标;
    • EPSG3857:Web墨卡托投影后的平面地图,坐标单位为米。

    3、瓦片

    经过Web墨卡托投影后,地图就变为平面的一张地图。考虑到有时候我们需要看宏观的地图信息(如世界地图里每个国家的国界),有时候又要看很微观的地图信息(如导航时道路的路况信息)。为此,我们对这张地图进行等级切分。在最高级(zoom=0),需要的信息最少,只需保留最重要的宏观信息,因此用一张256x256像素的图片表示即可;在下一级(zoom=1),信息量变多,用一张512x512像素的图片表示;以此类推,级别越低的像素越高,下一级的像素是当前级的4倍。这样从最高层级往下到最低层级就形成了一个金字塔坐标体系。

    对每张图片,我们将其切分为256x256的图片,称为瓦片(Tile)。这样,在最高级(zoom=0)时,只有一个瓦片;在下一级(zoom=1)时有4个瓦片;在下一级(zoom=2)时有16个瓦片,以此类推。

    4、瓦片编号

    瓦片生成后,就是一堆图片。怎么对这堆图片进行编号,是目前主流互联网地图商分歧最大的地方。总结起来分为四个流派:

    • 谷歌XYZ:Z表示缩放层级,Z=zoom;XY的原点在左上角,X从左向右,Y从上向下
    • TMS:开源产品的标准,Z的定义与谷歌相同;XY的原点在左下角,X从左向右,Y从下向上。
    • QuadTree:微软Bing地图使用的编码规范,Z的定义与谷歌相同,同一层级的瓦片不用XY两个维度表示,而只用一个整数表示,该整数服从四叉树编码规则。
    • 百度XYZ:Z从1开始,在最高级就把地图分为四块瓦片;XY的原点在经度为0纬度位0的位置,X从左向右,Y从下向上。

    下图显示了前三个流派在zoom=1层级上的瓦片编号结果:

    下表总结了中国主要地图商的瓦片编号流派,点击每个链接就可以获得一个对应编号的瓦片地图:

    地图商瓦片编码图层链接
    高德地图谷歌XYZ道路http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x=105&y=48&z=7
    高德地图谷歌XYZ卫星http://webst04.is.autonavi.com/appmaptile?style=6&x=843&y=388&z=10
    谷歌地图谷歌XYZ道路http://mt2.google.cn/vt/lyrs=m&hl=zh-CN&gl=cn&x=105&y=48&z=7
    谷歌地图谷歌XYZ卫星http://mt2.google.cn/vt/lyrs=s&hl=zh-CN&gl=cn&x=105&y=48&z=7
    谷歌地图谷歌XYZ地形http://mt0.google.cn/vt/lyrs=t&hl=zh-CN&gl=cn&x=420&y=193&z=9
    OpenStreetMap谷歌XYZ道路http://a.tile.openstreetmap.org/7/105/48.png
    腾讯地图TMS道路http://rt1.map.gtimg.com/realtimerender?z=7&x=105&y=79&type=vector&style=0
    Bing地图QuadTree道路http://r1.tiles.ditu.live.com/tiles/r1321001.png?g=100&mkt=zh-cn
    百度地图百度XYZ道路http://online4.map.bdimg.com/tile/?qt=tile&x=98&y=36&z=9&;styles=pl&scaler=1&udt=20170406
    百度地图百度XYZ交通http://its.map.baidu.com:8002/traffic/TrafficTileService?level=19&x=99052&y=20189&time=1373790856265&label=web2D&;v=017

    补充一个新的瓦片地图资源:http://map.geoq.cn/,里面有彩色、灰色、暖色和夜色版的中国地图,坐标为GCJ02。举例:http://map.geoq.cn/ArcGIS/rest/services/ChinaOnlineStreetWarm/MapServer/tile/{z}/{y}/{x}

    5、关于中国的经纬度

    国内的经纬度有三套系统:

    • WGS84:为一种大地坐标系,也是目前广泛使用的GPS全球卫星定位系统使用的坐标系。
    • GCJ02:又称火星坐标系,是由中国国家测绘局制订的地理信息系统的坐标系统。由WGS84坐标系经加密后的坐标系。
    • BD09:为百度坐标系,在GCJ02坐标系基础上再次加密。其中bd09ll表示百度经纬度坐标,bd09mc表示百度墨卡托米制坐标。

    使用OpenStreetMap的坐标为WGS84;使用高德地图、腾讯地图的坐标为GCJ02;使用百度地图的坐标为BD09;谷歌地图和Bing地图的中国部分采用了高德地图的数据,所以坐标为GCJ02

    WGS84的坐标转化为GCJ02的坐标是单向的,即WGS84的坐标能够准确地变换为GCJ02坐标;但GCJ02坐标转换为WGS84时会存在精度损失。

    GCJ02的坐标和BD09的坐标转换是双向的。

    展开全文
  • 墨卡托转换器

    2012-02-21 15:38:46
    墨卡托投影,是正轴等角圆柱投影。由荷兰地图学家墨卡托(G.Mercator)于1569年创拟。假想一个与地轴方向一致的圆柱切或割于地球,按等角条件,将经纬网投影到圆柱面上,将圆柱面展为平面后,即得本投影。墨卡托投影在...
  • 这是一个将GPS坐标转换成GCJ-02墨卡托坐标的js代码,很有价值,可以精确定位到具体地理位置。
  • gis地图是墨卡托投影,卫星影像是等经纬度投影,不能直接叠加。 于是整出了这个等经纬度影像 转 墨卡托影像的程序。 上代码: import java.awt.image.BufferedImage; import java.io.File; import java.io....

    前段时间做了气象方面的工作,要在gis地图上叠加卫星影像。

    gis地图是墨卡托投影,卫星影像是等经纬度投影,不能直接叠加。

    于是整出了这个等经纬度影像 转 墨卡托影像的程序。

    上代码:

    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    
    import javax.imageio.ImageIO;
    
    /**
     * 等经纬度影像 转 墨卡托影像
     * 基本思路:
     *     1、赤道上经度跨越1度,其代表的距离恒定不变。
     *     2、(经纬度影像)由起止经纬度可以计算出径向距离,得到径向有多少像素,从而可以计算出一像素代表多少米;
     *     3、纬度到赤道的距离有公式可以计算出,再由第2步得到的一像素代表多少米,就可以知道纬度需要多少像素填充。
     * @author RainingTime
     *
     */
    public class LatLonImage2MercatorImage {
    	
    	public static void main(String[] args) throws IOException {
    		long start = System.currentTimeMillis();
            
    		//原始数据起止经纬度{{开始纬度、开始经度}、{结束纬度、结束经度}},左上角开始,右下角结束
    		Double[][] sourceRange = {{53.817,60.2}, {4.83,138.78}};
    		
    		//裁剪区域起止经纬度{{开始纬度、开始经度}、{结束纬度、结束经度}},左上角开始,右下角结束。
    		//若不需要裁剪,则令cutRange = sourceRange
            Double[][] cutRange = {{53.817,60.2}, {4.83,138.78}};
            
            String imageType = "png";
            
            String source = "C:/Users/RainingTime/Desktop/FY4影像/FY4A_20210421074900000.jpg";
            String outPut = "C:/Users/RainingTime/Desktop/FY4影像/FY4A_20210421074900000-mkt." + imageType;
            BufferedImage sourceImage = ImageIO.read(new File(source));
            BufferedImage mercator = imageToMercator(sourceImage, sourceRange, cutRange, imageType);
    		ImageIO.write(mercator, imageType, new File(outPut));
            
            long end = System.currentTimeMillis();
            System.out.println("转换完成,用时:"+(end-start)+"ms");
    	}
    
    	/**
    	 * png、jpg影像转墨卡托投影
    	 * @param sourcePath	原始影像
    	 * @param outPutPath	输出影像
    	 * @param sourceRange	原始影像经纬度范围,要求左上角开始,右下角结束:{{开始纬度、开始经度}、{结束纬度、结束经度}}
    	 * @param cutRange		裁剪区域经纬度范围,要求左上角开始,右下角结束:{{开始纬度、开始经度}、{结束纬度、结束经度}},为null时默认不裁剪
    	 * @param imageType		输出影像格式,png、jpg两种
    	 * @throws IOException
    	 */
    	public static BufferedImage imageToMercator(BufferedImage sourceImage, Double[][] sourceRange, Double[][] cutRange, String imageType) throws IOException {
    		double sourceStartLat = sourceRange[0][0];
    		double sourceStartLon = sourceRange[0][1];
    		double sourceEndLat = sourceRange[1][0];
    		double sourceEndLon = sourceRange[1][1];
    		double cutStartLat = sourceStartLat;
    		double cutStartLon = sourceStartLon;
    		double cutEndLat = sourceEndLat;
    		double cutEndLon = sourceEndLon;
    		if(cutRange != null){
    			cutStartLat = cutRange[0][0];
    			cutStartLon = cutRange[0][1];
    			cutEndLat = cutRange[1][0];
    			cutEndLon = cutRange[1][1];
    		}
    		
    		if(sourceEndLat>sourceStartLat || sourceStartLon>sourceEndLon){
    			System.out.println("数据源经纬度坐标从左上角开始,右下角结束!");
    			return null;
    		}
    		if(cutEndLat>cutStartLat || cutStartLon>cutEndLon){
    			System.out.println("裁剪区域经纬度坐标从左上角开始,右下角结束!");
    			return null;
    		}
    		/**
    		 * earthRadius = 6378137;//地球赤道半径6378137米
    		 * 20037508.3427892 = earthRadius * (math.pi - 0);//赤道周长的一半
    		 * 85.05112877980659 = (math.atan(math.exp(aa / earthRadius))-math.pi/4)*2 * 180 / math.pi;//墨卡托最大有效纬度
    		 */
    		if(cutStartLat > 85.051128){
    			System.out.println("墨卡托投影起始纬度最大为:85.051128,裁剪区域将被限定。");
    			cutStartLat = 85.051128;
    		}
    		if(cutEndLat <- 85.051128){
    			System.out.println("墨卡托投影终止纬度最小为:-85.051128,裁剪区域将被限定。");
    			cutEndLat = -85.051128;
    		}
    		
            int sourceWidth = sourceImage.getWidth();
    		int sourceHeight = sourceImage.getHeight();
    		double lonStep = (sourceEndLon-sourceStartLon)/(sourceWidth-1);
    		double latStep = (sourceEndLat-sourceStartLat)/(sourceHeight-1);
    		System.out.println("sourceWidth: " + sourceWidth + ", sourceHeight: " + sourceHeight + ", latStep: " + latStep + ", lonStep: " + lonStep);
    
    		int cutWidth = (int)((cutEndLon - cutStartLon)/lonStep + 0.5) + 1;
    		int cutHeight = (int)((cutEndLat - cutStartLat)/latStep + 0.5) + 1;
    		System.out.println("cutWidth: "+cutWidth+", cutHeight: "+cutHeight);
    		
    		//截止纬度与赤道之间有多少个点,北半球为正值
    		int start = (int)((Math.log(Math.tan((90 + cutStartLat) * Math.PI / 360)) / (Math.PI / 180))/ lonStep + 0.5);
    		//起始纬度与赤道之间有多少个点,南半球为负值
    		int end = (int)((Math.log(Math.tan((90 + cutEndLat) * Math.PI / 360)) / (Math.PI / 180))/ lonStep + 0.5);
    		
    		int mwidth = cutWidth;//墨卡托投影宽度
    		int mheight = start - end + 1;//墨卡托投影高度
    		System.out.println("mwidth: "+mwidth+", mheight: "+mheight);
    
    		//建立预设
    		List<List<Integer>> list = new ArrayList<List<Integer>>();
    		List<Integer> innerList = null;
    		for(int y=0; y<mheight; y++){
    			innerList = new ArrayList<Integer>();
    			for(int x=0; x<mwidth; x++){
    				innerList.add(0);//填充0,透明图层
    			}
    			list.add(innerList);
    			innerList = null;
    		}
    		
    		//填充真实数据
    		int equator = -1;//赤道的像素y轴坐标
    		BufferedImage outImage = null;
    		if("png".equals(imageType)){
    			outImage = new BufferedImage(mwidth, mheight, BufferedImage.TYPE_INT_ARGB);
    		}else{
    			outImage = new BufferedImage(mwidth, mheight, BufferedImage.TYPE_INT_RGB);
    		}
    		List<Integer> yIndexList = new ArrayList<Integer>(); 
    		for(int y=0; y<cutHeight; y++){
    			double lat = cutStartLat + (y * latStep);//截止纬度 减 当前纬度,得到纬度差
    			if(-85.051128 <= lat && lat <= 85.051128){
    				int oy = start - (int)((Math.log(Math.tan((90 + lat) * Math.PI / 360)) / (Math.PI / 180)) / lonStep + 0.5);
    				
    				if(oy<mheight){
    					yIndexList.add(oy);
    					if(lat == 0.0 || (lat>0.0 && (lat+0.5*latStep)<0.0) || (lat<0.0 && (lat-0.5*latStep)>0.0)){//赤道
    						equator = oy;
    					}
    					for(int x=0; x<cutWidth; x++){
    		        		int px = (int)((cutStartLon+x*lonStep-sourceStartLon)/lonStep + 0.5);
    		        		int py = (int)((cutStartLat+y*latStep-sourceStartLat)/latStep + 0.5);
    						int rgb = sourceImage.getRGB(px, py);
    						list.get(oy).set(x, rgb);
    					}
    				}
    			}
    		}
    		System.out.println("赤道的像素y轴坐标:"+equator);
    		
    		for(int y=0; y<mheight; y++){
    			if(y <= equator){
    				for(int i=0; i<yIndexList.size(); i++){
    					if(y == yIndexList.get(i)){
    						for(int x=0; x<cutWidth; x++){
    							outImage.setRGB(x, y, list.get(y).get(x));
    						}
    						break;
    					} else if(y > yIndexList.get(i) && (i+1)<yIndexList.size() && y < yIndexList.get(i+1)){
    						for(int x=0; x<cutWidth; x++){
    							outImage.setRGB(x, y, list.get(yIndexList.get(i+1)).get(x));
    						}
    						break;
    					}
    				}
    			} else {
    				for(int i=0; i<yIndexList.size(); i++){
    					if(y == yIndexList.get(i)){
    						for(int x=0; x<cutWidth; x++){
    							outImage.setRGB(x, y, list.get(y).get(x));
    						}
    						break;
    					} else if(y > yIndexList.get(i) && (i+1)<yIndexList.size() && y < yIndexList.get(i+1)){
    						for(int x=0; x<cutWidth; x++){
    							outImage.setRGB(x, y, list.get(yIndexList.get(i)).get(x));
    						}
    						break;
    					}
    				}
    			}
    		}
    		list = null;
    		return outImage;
    	}
    
    }
    

    原图:风云四A星真彩色云图,来源:http://www.nmc.cn/publish/satellite/FY4A-true-color.htm

    输出:因为不能上传大于5M的图片,这里将图片压缩了下才上传的。

    传送门:墨卡托影像 转 等经纬度影像,墨卡托图片 转 等经纬度图片

    展开全文
  • 在WebGIS的开发中经常用到的地图投影为Web墨卡托和WGS84。该方法可以实现这两种坐标的相互转换。
  • 墨卡托及Web墨卡托投影

    千次阅读 2019-04-30 17:57:48
    墨卡托(Mercator)投影,又名“等角正轴圆柱投影”,荷兰地图学家墨卡托(Mercator)在1569年拟定,假设地球被围在一个中空的圆柱里,其赤道与圆柱相接触,然后再假想地球中心有一盏灯,把球面上的图形投影到圆柱体...

    参考这个资料:一个小游戏让你彻底弄懂墨卡托投影

    以及:https://blog.csdn.net/wudiazu/article/details/76597294

    https://www.cnblogs.com/jz1108/archive/2011/07/02/2095376.html

    关于椭球体的重要参数和计算公式:http://qiancy.com/2017/01/07/datum-spheroid-parameters-equation/

    参考:GIS基础知识 - 坐标系、投影、EPSG:4326、EPSG:3857_爱是与世界平行-CSDN博客

            Google Maps、谷歌地球等网络地图所使用的地图投影,常被称作Web Mercator或Spherical Mercator,它与常规墨卡托投影的主要区别就是把地球模拟为球体而非椭球体。

    什么是墨卡托投影?

            墨卡托(Mercator)投影,又名“等角正轴圆柱投影”,荷兰地图学家墨卡托(Mercator)在1569年拟定,假设地球被围在一个中空的圆柱里,其赤道与圆柱相接触,然后再假想地球中心有一盏灯,把球面上的图形投影到圆柱体上,再把圆柱体展开,这就是一幅标准纬线为零度(即赤道)的“墨卡托投影”绘制出的世界地图。

    Google为什么选择墨卡托投影?

            墨卡托投影的“等角”特性,保证了对象的形状的不变型,正方形的物体投影后不会变为长方形。“等角”也保证了方向和相互位置的正确性,因此在航海和航空中常常应用,而Google在计算人们查询地物的方向时不会出错。

            墨卡托投影的“圆柱”特性,保证了南北(纬线)和东西(经线)都是平行直线,并且相互垂直。而且经线间隔是相同的,纬线间隔从标准纬线(此处是赤道,也可能是其他纬线)向两级逐渐增大。

            但是,“等角”不可避免的带来的面积的巨大变形,特别是两极地区,明显的如格陵兰岛比实际面积扩大了N倍。

    为什么是圆形球体,而非椭球体?

            这说来简单,仅仅是由于实现的方便和计算上的简单,精度理论上差别0.33%之内,特别是比例尺越大,差别基本可以忽略。


    Web墨卡托投影坐标系:

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

            X轴:由于赤道半径为6378137米,则赤道周长为2*PI*r = 2*20037508.3427892,因此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、坐标转换等就不再多言。


    PS:

            墨卡托投影并不是一种坐标系,而是为了在二维平面上展示三维地球而进行的一种空间映射。所以在GIS地图和互联网地图中,虽然用户看到的地图经过了墨卡托投影,但依然使用经纬度坐标来表示地球上点的位置。
            在地图绘制和地图可视化时,就需要将地图数据使用投影的方式来呈现。

    地图瓦片具有以下特点:

            具有唯一的瓦片等级(Level)和瓦片坐标编号(tileX, tileY)。
            瓦片分辨率为256*256。
            最小的地图等级是0,此时世界地图只由一张瓦片组成。
            瓦片等级越高,组成世界地图的瓦片数越多,可以展示的地图越详细。
            某一瓦片等级地图的瓦片是由低一级的各瓦片切割成的4个瓦片组成,形成了瓦片金字塔。

    Web墨卡托投影有两个相关的投影标准,经常搞混:

    • EPSG4326:Web墨卡托投影后的平面地图,但仍然使用WGS84的经度、纬度表示坐标;
    • EPSG3857:Web墨卡托投影后的平面地图,坐标单位为米。
    展开全文
  • 兰勃特墨卡托投影.rar

    2019-09-28 00:23:58
    对经纬度坐标进行读取,完成投影后绘制在界面上,另外实现道格拉斯算法对地图抽稀

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,702
精华内容 1,880
关键字:

墨卡托