(@_@;)我是程序猿,我编程,我快乐,知识改变命运,技术成就梦想   oh yeah!合作VX "w6668263" 联系Email:ye583025823@126.com

GIS基础知识 - 坐标系、投影、EPSG:4326、EPSG:3857

 解决 openlayers 加载高德地图拉伸

高德地图、腾讯地图以及谷歌中国区地图使用的是GCJ-02坐标系

百度地图使用的是BD-09坐标系底层接口(HTML5 Geolocation或ios、安卓API)通过GPS设备获取的坐标使用的是WGS-84坐标系

 

 4326 WGS-84:是国际标准,GPS坐标(Google Earth使用、或者GPS模块)EPSG:4326 的数据一般是这种的。[22.37,114.05]。利于存储,可读性高。

 

所以我们常常看到和用到的坐标系数据往往不是墨卡托坐标,而是EPSG:4326坐标系下的坐标数据。因为易读和存储小。比如下面的第三方的阿里datav 边界数据源。就是采用的EPSG:4326地理坐标返回。如下:

 

 

 

openlayers 中默认的坐标就是google的摩卡托坐标,也就是我们经常看到的 EPSG:3857 坐标系。

 EPSG:3857 的数据一般是这种的。[12914838.35,4814529.9],看上去相对数值较大。不利于存储,比较占内存。

 

EPSG:4326和EPSG:3857区别(重点)

EPSG:3857(投影):数据的可读性差和数值大存储比较占用内存
EPSG:4326(地理):使用此坐标系会导致页面变形。

 

因为使用的 projection"EPSG:4326" 类型,可以看到 center 中的数据格式 也是 "EPSG:4326" 的数值格式。所以没有用 fromLonLat() 方法 进行转换得到的图像信息。

import { fromLonLat } from 'ol/proj'
this.centerMap = new Map({
    target: 'centerMap',
    layers: this.baseLayers,
    view: new View({
        projection: 'EPSG:3857',
        center: fromLonLat([117.691603, 39.014074]),
        zoom: 11.5,
        maxZoom: 18,
        minZoom: 5
    })
})

在实际开发中,因为map源数据大部分都是EPSG:4326的数据源格式的数据,但是使用EPSG:4326的坐标系地图会出现被压缩的感觉。所以我们都是采用 EPSG:3857的坐标系类型,把数据源转换位 EPSG:3857的数据源即可。但是这个EPSG:3857数据源不易读取和值占内存原因,所有结合两者的缺点,我们采用坐标转换,即 EPSG:4326转 EPSG:3857。 所有请理解这句话:通常:数据存储在EPSG:4326中,显示在EPSG:3857中 如下所示:

function anmiteCenter(map, attr, zoom) {
    let pos = [parseFloat(attr.lon), parseFloat(attr.lat)];
    pos = ol.proj.transform(pos, 'EPSG:4326', 'EPSG:3857');
    map.getView().animate({
        center: pos,
        zoom: zoom
    });
}

 

 

地理坐标系是三维的,我们要在地图或者屏幕上显示就需要转化为二维,这被称为 投影(Map projection)。显而易见的是,从三维到二维的转化,必然会导致变形和失真,失真是不可避免的,但是不同投影下会有不同的失真,这让我们可以有得选择。常用的投影有 等矩矩形投影(Platte Carre) 和 墨卡托投影(Mercator),下图来自 Mercator vs. well…not Mercator (Platte Carre),生动地说明了这两种投影下的失真:

 

 

 

 

 

左图表示地球球面上大小相同的圆形,右上为墨卡托投影,投影后仍然是圆形,但是在高纬度时物体被严重放大了。右下为等距投影,物体的大小变化不是那么明显,但是图像被拉长了。Platte Carre 投影因为在投影上有扭曲,并不适合于航海等活动,但是因为坐标与像素之间的对应关系十分简单,非常适合于栅格图的展示,Platte Carre 投影是很多GIS 软件的默认投影。

 

需要注意的是,对于墨卡托投影来说,越到高纬度,大小扭曲越严重,到两极会被放到无限大,所以,墨卡托投影无法显示极地地区。下图来自 维基百科,可以看到墨卡托投影下每个国家的大小和实际大小的差异。但是 conformality(正形性) 和 straight rhumb lines 这两个特点,让它非常适合于航海导航。

 

对于 Web Map 开发人员的意义

对于 Web Map 开发人员来说,最熟悉的应该是 EPSG:4326 (WGS84)EPSG:3857(Pseudo-Mercator),这又是啥呢?

EPSG:4326 (WGS84)

前面说了 WGS84 是目前最流行的地理坐标系统。在国际上,每个坐标系统都会被分配一个 EPSG 代码,EPSG:4326 就是 WGS84 的代码。GPS 是基于 WGS84 的,所以通常我们得到的坐标数据都是 WGS84 的。一般我们在存储数据时,仍然按WGS84存储。

EPSG:3857 (Pseudo-Mercator)

伪墨卡托投影,也被称为球体墨卡托,Web Mercator。它是基于墨卡托投影的,把 WGS84坐标系投影到正方形。我们前面已经知道 WGS84 是基于椭球体的,但是伪墨卡托投影把坐标投影到球体上,这导致两极的失真变大,但是却更容易计算。这也许是为什么被称为”伪“墨卡托吧。另外,伪墨卡托投影还切掉了南北85.051129°纬度以上的地区,以保证整个投影是正方形的。因为墨卡托投影等正形性的特点,在不同层级的图层上物体的形状保持不变,一个正方形可以不断被划分为更多更小的正方形以显示更清晰的细节。很明显,伪墨卡托坐标系是非常显示数据,但是不适合存储数据的,通常我们使用 WGS84 存储数据,使用伪墨卡托显示数据。

Web Mercator 最早是由 Google 提出的,当前已经成为 Web Map 的事实标准。但是也许是由于上面”伪“的原因,最初 Web Mercator 被拒绝分配EPSG 代码。于是大家普遍使用 EPSG:900913(Google的数字变形) 的非官方代码来代表它。直到2008年,才被分配了EPSG:3785的代码,但在同一年没多久,又被弃用,重新分配了 EPSG:3857 的正式代码,使用至今。

参考资料:

EPSG 4326 vs EPSG 3857 (projections, datums, coordinate systems, and more!)
Mercator vs. well…not Mercator (Platte Carre)

 

 

 

本文参考自:https://e7868a.com/gis-coordinate-project

 

posted on 2021-11-09 11:31  一个草率的龙果果  阅读(3627)  评论(0编辑  收藏  举报

导航