学习openlayers过程中涉及到的gis相关知识

136 阅读4分钟

前言:

openlayers可以简单理解为是“画地图”的JS包,我在项目中也确实是这么用的。那么对于“地图”的知识又有多少了解呢?为什么“世界地图”是看到的这样,openlayers在把数据变成地图的时候又考虑了哪些gis的基础知识呢?

本文总结了学习openlayers过程中涉及到的gis相关知识,也是对以上问题做的一些简单的回答

一、坐标系

如何把立体地球上的每一点映射到平面地图上?

地球并不是规则的球体,为了用数学表达它,需要去近似建模——参考椭球体,这里不去追究“参考椭球体”是怎么产生的,只需要知道我们把地球近似成了一个椭球体,并且由于各个国家地形的差异,参照的椭球体也是不一样的。

现在我们已经把地球近似为一个“椭球体”了,接下来要做的就是在“椭球体”上建立坐标系,从而确定某一点的位置。怎么建坐标系?坐标原点放在哪里?

根据坐标的“表示形式”可将坐标分为“地理坐标系”和“投影坐标系”,如:

image.png

WGS84是全球通用的坐标系,其坐标如图所示。注意,这个坐标系下的点位坐标和经纬度是两个不同的概念。

image.png

至此,我们已经可以确定三维地图上的点的坐标了,但是要把三维地图上的坐标绘制到二维平面上,还需要“投影” ——使用几何透视方法或数学分析的方法,将地球上的点和线投影到可展的曲面(平面、圆柱面或圆锥面)上,再将此可展曲面展成平面,建立该平面上的点、线和地球椭球面上的点、线的对应关系。

二、投影

1.等距矩阵投影

维基百科上的解释为:如果连接平面上两个投影点的线段长度与地球仪上两个未投影点之间的测地线(最短面)距离成正比,那么我们就说这两个点之间的距离得到了保留。等距投影保留了一个或两个特殊点到其他所有点的距离。特殊点在投影时可能会被拉伸成一条线或一条曲线段。在这种情况下,必须用直线或曲线段上最接近被测点的点来测量距离。

2.墨卡托投影

如图所示,将地球中心放置一光源,外侧放置一与地球相切的圆柱,光线经过地球上的某点投影到圆柱上,最终将该圆柱展开即为墨卡托投影,可以想见,纬度越高的地方投影点也就越高(如C点),极点的投影位置甚至在无穷远处,所以墨卡托投影只显示维度小于85度的范围。

image.png

三、实际开发中对于EPSG:3857和EPSG:4326的处理

EPSG:3857即伪墨卡托投影(可以理解为墨卡托投影的简化版)的结果,因为墨卡托投影的影响,他的数值往往较大,如该坐标系下[2449028.7974520186,9876845.895794801]转到EPSG:4326坐标系下为[22,66]。所以EPSG:4326更易存储,而从两个坐标下的画的地图来看,EPSG:3857坐标更适合于展示,且被openlayers默认采用。

总之,存取数据用的EPSG:4326;展示数据即画地图时用的EPSG:3857

所以这就涉及到两种坐标系下参数的转化。

  1. 使用EPSG:4326坐标系
new ol.view ({
    center:[22,66],
    // 指定坐标,否则默认是3857坐标系
    projection:'EPSG:4326',
    zoom:10
})
  1. 将从后台获取的经纬度数据转成3857坐标系数据并画图
new ol.view ({
    center:fromLonLat([22,66]),
    // 指定坐标,默认是3857坐标系,所以也可以不写这一句
    projection:'EPSG:3857',
    zoom:10
})
  1. openlayers坐标转换的API
    • transform(coordinate, source, destination),将source坐标系下的坐标转到destination坐标系下的坐标
    • fromLonLat(coordinate, projection),将经纬度坐标转到projection坐标系下的坐标,projection默认为'EPSG:3857'
    • toLonLat(coordinate, projection),将某一坐标系下的坐标转成经纬度,该坐标系projection默认为'EPSG:3857'

存疑

  1. 对等距投影我尚不能有一个直观的感受;
  2. EPSG:4326、EPSG:3857和经纬度之间的转化关系还不清楚。

参考资料

  1. 地图投影怎么做到按条件(等角、等面积、等距)投影的?
  2. 坐标系及投影
  3. 一个小游戏让你彻底弄懂墨卡托投影
  4. EPSG:3857和EPSG:4326区别详解
  5. 在线坐标转换工具