前言
WebGIS系统通常都围绕地图进行内容表达,但并不是有地图就一定是WebGIS,所以有必要讨论下基于Web的地图API分类及应用场景。
Web上的Map API主要分类如下几类:
- Charts:以D3.js,Echarts等为代表。
- LBS:以高德/谷歌/百度地图等为代表。
- WebGIS商业API:ESRI的ArcGIS API For JS,超图的IClient。
- WebGIS开源API:Leaflet,OpenLayers,Cesium,MapboxGL等。
建模工具Blender
https://zhuanlan.zhihu.com/p/628531907
Leaflet
OpenLayers
https://openlayers.org/doc/quickstart.html
https://blog.csdn.net/qq_29602347/article/details/99623968
https://viglino.github.io/ol-ext/examples/map/map.layer.3D.html
Cesium
https://github.com/CesiumGS/cesium
https://sandcastle.cesium.com/?src=3D%20Tiles%20Photogrammetry.html
使用OpenLayers
创建项目
1 | vue create z-webgis-ol |
添加依赖
1 | cd z-webgis-ol |
地图页面
添加页面
OlMap.vue
1 | // example |
瓦片地址
瓦片地址配置
1 | new TileLayer({ |
更换为
1 | new TileLayer({ |
高德
1 | new TileLayer({ |
openstreetmap地址
1 | https://a.tile.openstreetmap.org/10/809/421.png |
格式为
1 | https://{a-c}.tile.openstreetmap.org/{z}/{x}/{y}.png |
高德的地址
http://webst01.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=7&x=809&y=421&z=10
格式为
1 | http://webst0{1-4}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=7&x={x}&y={y}&z={z} |
经纬度
1 | view: new View({ |
引用
1 | <template> |
百度坐标拾取器
经纬度转换
概念
投影方式
Google的墨卡托坐标,也就是我们经常看到的 EPSG:3857 坐标系。
EPSG:3857 的数据一般是这种的。[12914838.35,4814529.9],看上去相对数值较大。不利于存储,比较占内存。EPSG:4326/WGS-84:是国际标准,GPS坐标(Google Earth使用、或者GPS模块)。
EPSG:4326 的数据一般是这种的。[22.37,114.05]。利于存储,可读性高。
所以我们常常看到和用到的坐标系数据往往不是墨卡托坐标,而是EPSG:4326坐标系下的坐标数据。
讲完投影方式,我们再聊一下坐标系,WGS84、GCJ-02、BD-09
WGS84/EPSG:4326
:也叫大地坐标系,它是原始坐标系统。
GCJ02/火星坐标
:是由中国国家测绘局(G表⽰Guojia国家,C表⽰Cehui测绘,J表⽰Ju局)制订的地理信息系统的坐标系统,是在WGS84经纬度的基础上执⾏加密算法⽽成。因为GPS得到的经纬度直接在 GCJ-02 坐标系下会定位到错误的地点,有种到了⽕星的感觉,因此在坊间也将 GCJ-02 戏称为火星坐标系。
BD09
:只有百度地图没有使用这种加密算法,而是使用的是BD09,从名字上可以看出,GCJ02是2002年提出来的算法,BD09则是2009年提出来的,虽然百度地图没有使用GCJ02加密算法,但是他却是在GCJ02基础上做了一个二次加密,所以说,从WGS84坐标系不能直接转BD09,中间需要跨越一个GCJ02,反过来,需要将GCJ02或者BD09转为WGS84就是纠偏算法,相当于逆向解密,同样的DB09直接到不了WGS84,中间还需要转为GCJ02,所以现在的很多算法,如果你看到有百度坐标转大地坐标,基本上需要借助火星坐标来计算。
使用对象
高德地图、腾讯地图以及谷歌中国区地图使用的是GCJ-02坐标系
百度地图使用的是BD-09坐标系
底层接口(HTML5 Geolocation或iOS、安卓API)通过GPS设备获取的坐标使用的是EPSG:4326/WGS-84
坐标系
在Openlayers 中默认的坐标就是Google的摩卡托坐标,也就是我们经常看到的 EPSG:3857
坐标系。
不过我们可以设置为EPSG:4326/WGS-84
:
1 | view: new View({ |
坐标示例:
EPSG:3857
的数据一般是这种的:[12914838.35,4814529.9]
,看上去相对数值较大。不利于存储,比较占内存。EPSG:4326/WGS-84
数据一般是这种的:[121.5025, 31.237015]
。BD-09
的数据一般是这种的[113.65523,34.79977]
。
EPSG:4326/WGS-84
:是国际标准,GPS坐标(Google Earth使用、或者GPS模块)EPSG:4326 的数据一般是这种的:[22.37,114.05]
。利于存储,可读性高。
EPSG:4326和EPSG:3857区别(重点)
EPSG:3857(投影):数据的可读性差和数值大存储比较占用内存。
EPSG:4326(地理):使用此坐标系会导致页面变形。
经纬度存储计算用EPSG:4326也就是WGS84,数据展示用EPSG:3857。
百度地图采用 BD09 百度坐标系,叠加到 Leaflet 和 Cesium 默认的 WGS84 通用坐标系需要进行纠偏。
2个格式的数据怎么互转呢?
JS转换
1 | var GPS = { |
上面这段代码,没有对百度坐标bd09转大地坐标wgs84、大地坐标wgs84转百度坐标bd09进行书写,
如果你了解坐标之间的关系,你大概就能猜到:
只需要借助wgs84->gcj02->bd09
就能实现wgs84->bd09
的实现。
相反,借助bd09->gcj02->wgs84
就能实现bd09->wgs84
的转换了。
另一个封装
1 | /** |
使用方法:
1 | //国测局坐标(火星坐标,比如高德地图在用),百度坐标,wgs84坐标(谷歌国外以及绝大部分国外在线地图使用的坐标) |
自带transform
可以通过ol/proj/transform这个方法
例:
1 | transform([121.501842, 31.239204], ‘EPSG:4326’, ‘EPSG:3857’) |
经纬度存储计算用EPSG:4326也就是WGS84,数据展示用EPSG:3857。
用 fromLonLat() 方法把4326的坐标转换为3857的坐标。
1 | import { fromLonLat } from 'ol/proj' |
在实际开发中,因为map源数据大部分都是EPSG:4326的数据源格式的数据,但是使用EPSG:4326的坐标系地图会出现被压缩的感觉。
所以我们都是采用 EPSG:3857的坐标系类型,把数据源转换位 EPSG:3857的数据源即可。
但是这个EPSG:3857数据源不易读取和值占内存原因,所有结合两者的缺点,我们采用坐标转换,即 EPSG:4326转 EPSG:3857。
所有请理解这句话:
通常:数据存储在EPSG:4326中,显示在EPSG:3857中 如下所示:
1 | function anmiteCenter(map, attr, zoom) { |
三方库gcoord
使用gcoord这个库
1 | npm install gcoord --save |
使用1
2
3
4
5
6import gcoord from 'gcoord'
const xy = gcoord.transform(
[经度, 纬度],
gcoord.EPSG4326,
gcoord.EPSG3857
)
瓦片地址
高德(可用)
高德瓦片地图下载地址
矢量图
矢量图(含路网、含注记)1
http://wprd0{1,4}.is.autonavi.com/appmaptile?x={x}&y={y}&z={z}&lang=zh_cn&size=1&scl=1&style=7
示例
http://wprd01.is.autonavi.com/appmaptile?x=809&y=421&z=10&lang=zh_cn&size=1&scl=1&style=7
http://wprd04.is.autonavi.com/appmaptile?x=809&y=421&z=10&lang=zh_cn&size=1&scl=1&style=7
矢量图(含路网,不含注记)
1 | http://wprd0{1,4}.is.autonavi.com/appmaptile?x={x}&y={y}&z={z}&lang=zh_cn&size=1&scl=2&style=7 |
示例
http://wprd01.is.autonavi.com/appmaptile?x=809&y=421&z=10&lang=zh_cn&size=1&scl=2&style=7
http://wprd04.is.autonavi.com/appmaptile?x=809&y=421&z=10&lang=zh_cn&size=1&scl=2&style=7
影像
高德影像:
1 | https://webst01.is.autonavi.com/appmaptile?style=6&x={x}&y={y}&z={z} |
https://webst01.is.autonavi.com/appmaptile?style=6&x=809&y=421&z=10
参数说明:
{1,4}选一个数字,
{x}、{y}、{z}需要替换为相应的层级。
lang=zh_cn 标注语言为中文。
ArcGIS(可用)
ArcGIS上对外开放的瓦片地址网站
中文
1 | https://map.geoq.cn/arcgis/rest/services/ChinaOnlineCommunity_Mobile/MapServer/tile/{z}/{y}/{x} |
示例
https://map.geoq.cn/arcgis/rest/services/ChinaOnlineCommunity_Mobile/MapServer/tile/10/421/809
英文
1 | https://map.geoq.cn/arcgis/rest/services/ChinaOnlineCommunityENG/MapServer/tile/{z}/{y}/{x} |
示例
https://map.geoq.cn/arcgis/rest/services/ChinaOnlineCommunityENG/MapServer/tile/10/421/809
中文灰色
1 | https://map.geoq.cn/arcgis/rest/services/ChinaOnlineStreetGray/MapServer/tile/{z}/{y}/{x} |
示例
https://map.geoq.cn/arcgis/rest/services/ChinaOnlineStreetGray/MapServer/tile/10/421/809
中文蓝色
1 | https://map.geoq.cn/arcgis/rest/services/ChinaOnlineStreetPurplishBlue/MapServer/tile/{z}/{y}/{x} |
示例
https://map.geoq.cn/arcgis/rest/services/ChinaOnlineStreetPurplishBlue/MapServer/tile/10/421/809
中文暖色
1 | https://map.geoq.cn/arcgis/rest/services/ChinaOnlineStreetWarm/MapServer/tile/{z}/{z}/{y}/{x} |
示例
https://map.geoq.cn/arcgis/rest/services/ChinaOnlineStreetWarm/MapServer/tile/10/421/809
百度(不推荐)
不推荐使用百度的,原因:
百度使用的坐标体系不是标准的WGS84,所以瓦片的XY坐标也不一致。
百度地图瓦片地址:
黄色底图
1 | http://api0.map.bdimg.com/customimage/tile?&x={x}&y={y}&z={z}&udt=20191205&scale=1&ak=5ieMMexWmzB9jivTq6oCRX9j1 |
示例地址:
夜深色地图,蓝色地图
1 | http://api0.map.bdimg.com/customimage/tile?&x={x}&y={y}&z={z}&udt=20191205&scale=1&ak=5ieMMexWmzB9jivTq6oCRX9j&customid=midnight |
百度个性化地图模板
只需要修改customid参数分别为:midnight、light、normal、grassgreen等。
腾讯(已失效)
1 | vector = "http://rt{s}.map.gtimg.com/realtimerender?z={z}&x={x}&y={reverseY}&type=vector&style=0&scene=0", |
示例
http://rts.map.gtimg.com/realtimerender?z=10&x=809&y=421&type=vector&style=0&scene=0
新版本返回格式