初次接触GIS离线地图项目踩坑

梁学真
2023-12-01

最近做了一个地图项目,第一次接触踩了很多坑所以想着写出来能让大家也避一避
先说下我们项目大致要求:
拿到车队的北斗GPS定位在地图上撒点显示,历史轨迹查看,电子围栏规划与显示 等功能 并且需要离线(内网运行)

第一坑 坐标系

常用地图的坐标系:

坐标系地图介绍
GCJ-02谷歌矢量地图 高德地图 …(国内地图)火星坐标系 国家测绘局出品规定国内地图都要用此坐标系,目前网上广泛流传的算法可以实现 0 偏差
BD09百度地图百度地图独有通过对GCJ-02坐标系二次加密产生
WGS84谷歌卫星地图 谷歌地球 OpenStreetMap 天地图GPS坐标 大地坐标系 EPSG4326 国际上广泛使用的
墨卡托投影天地图WEB投影坐标系 EPSG3857 坐标很好辨认值都比较大[13523111.584418062,3668754.246812698]

比如 上海博物馆坐标121.470849, 31.230327(WGS84)在不同坐标系地图下位置都会出现偏差,使用时必须先转成对应地图的坐标系
各个坐标系的转换算法网上有很多 可以自行去GitHub上搜索 转换后精度失误一般都在分米级别内
如: https://github.com/wandergis/coordtransform

讽刺的是作为官方规定的加密算法GCJ-02
网上传播的转换算法误差基本在分米级别内,更离谱的是作为作为官方地图平台的天地图居然不用GCJ-02 ( 不说百度高德了
谷歌这样的外企进入中国也被要求使用的GCJ-02)

第二坑 地图瓦片选择与离线瓦片的下载

地图的类型分为:
矢量地图 与 卫星影像地图 。 矢量地图就是咱们平时最常见的导航地图 瓦片的类型有两种: 图片瓦片 矢量数据瓦片。 卫星影像地图的瓦片只能是图片。
图片类型的缺点都知道会糊 矢量数据对电脑的性能有一定要求(一般都没问题 政府项目的老电脑要先测试下) 并且 矢量数据地图 可以实现 主题样式修改 3D效果 更多的地图交互 等等。

选择地图的时候一定要慎重, 要考虑 格式 地图风格 地图是否精细准确 是否是国内的 还有坐标系。

常用的切片地址:

  1. 天地图: (天地图官网: http://lbs.tianditu.gov.cn/server/MapService.html

详见官网 (需要注册申请key 申请后免费下载)
底图:https://t5.tianditu.gov.cn/vec_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=vec&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TileMatrix={z}&TileRow={y}&TileCol={x}&tk=YouTK

标签点位:https://t0.tianditu.gov.cn/cva_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=cva&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILECOL={x}&TILEROW={y}&TILEMATRIX={z}&tk=YouTK
卫星地图:https://t1.tianditu.gov.cn/img_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=img&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILECOL={x}&TILEROW={y}&TILEMATRIX={z}&tk=

  1. 高德地图:

普通:http://wprd0{1,4}.is.autonavi.com/appmaptile?x={x}&y={y}&z={z}&lang=zh_cn&size=1&scl=1&style=7
卫星:https://webst01.is.autonavi.com/appmaptile?style=6&x={x}&y={y}&z={z}
卫星带道路:http://wprd02.is.autonavi.com/appmaptile?x={x}&y={y}&z={z}&lang=zh_cn&size=1&scl=1&style=8

  1. google地图:

普通: http://mt0.google.com/vt/lyrs=s&x={x}&y={y}&z={z}
卫星:https://mt0.google.com/vt/lyrs=s&x={x}&y={y}&z={z}

  1. MapBoX地图(需要注册申请key 申请后免费下载):

矢量数据: https://api.mapbox.com/v4/mapbox.mapbox-terrain-v2,mapbox.mapbox-bathymetry-v2,mapbox.mapbox-streets-v8/{z}/{x}/{y}.vector.pbf?sku=101Asds1IWRgC&access_token=You token
卫星: https://api.mapbox.com/v4/mapbox.satellite/{z}/{x}/{y}.webp?sku=1011GQt4HlNGF&access_token=You token

GitHub上挺多免费的下载项目可以使用,也推下我写的一个工具 https://gitee.com/houlaidelu/map-tiles-downloader_node

第三坑 地图js框架的选择

目前常用的框架有: MapBoxJS / MapBoxGLJS Openlayers Leaflet ArcGIS API for JS Cesium BMapGL(百度) 高德 。
高德 百度 框架只能用于加载自己的地图瓦片,

名称是否开源是否支持其他瓦片特点缺点
MapBoxGL流畅的矢量地图瓦片加载 动态地图样式修改 地球 3D 动画效果多离线地图时稍微麻烦点 ,坐标系不支持GCJ-02需要自己转换
Openlayers简单易用 图层操作更加简便 切换其他地图时比较方便(官方也提供更多加载类) 对于不同坐标系地图加载有良好的适配(支持自定义projection)暂不支持3D 加载MapBox矢量瓦片会出现卡顿
百度地图BMapGL国产中文API例子多教程多 支持3D矢量瓦片 有大量应用场景例子与配套服务不支持离线地图(需要手动将源码修改为本地) 并且因为使用BD09坐标系需要进行转换

根据不同的使用场景选择最适合你的框架 很重要

 类似资料: