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

最近做了一个地图项目,第一次接触踩了很多坑所以想着写出来能让大家也避一避
先说下我们项目大致要求:
拿到车队的北斗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坐标系需要进行转换

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

<think>嗯,用户想知道如何在Vue.js中使用Baidu Map GL进行地图开发。首先,我需要回忆一下相关的文档和引用内容。根据提供的引用[2],Vue3 Baidu Map GL是一个基于Vue 3和百度地图GL版本的开源项目,它利用Vue 3的响应式特性和百度地图的高性能渲染。用户可能正在使用Vue 3,所以需要指导他们安装和配置这个库。 步骤一应该是安装,引用[2]提到可以通过npm或yarn安装,所以需要告诉用户运行相应的命令。然后,在main.js中引入并注册组件,这部分引用[2]和引用[3]都有涉及,需要指导用户正确导入BMapGL和样式文件。 接下来,如何在组件中使用地图组件。引用[2]的示例代码展示了基本的地图初始化,包括容器ID、中心点坐标和缩放级别。可能需要提醒用户替换自己的API密钥,并确保容器有正确的高度,否则地图可能不显示。 然后,用户可能需要添加点位,引用[4]提到使用map.addOverlay()方法,以及监听点击事件获取经纬度。这里需要详细说明如何创建覆盖物,比如使用Marker类,并绑定事件处理函数,将数据传回后台。 另外,用户可能会遇到问题,比如地图不显示,需要检查容器样式和API密钥是否正确。引用[3]提到文档区分的问题,可能需要建议用户参考正确的文档链接,如百度地图示例中心和类参考。 最后,生成相关问题,帮助用户深入了解更多功能,比如事件绑定、自定义覆盖物、性能优化和3D效果,这些都可以基于引用中的信息进行扩展。确保回答结构清晰,步骤明确,用户能一步步跟着操作。</think>### 如何在 Vue.js 中使用 Baidu Map GL 进行地图开发 #### 1. **环境准备与安装** - **安装依赖** 使用 npm 或 yarn 安装 `vue3-baidu-map-gl` 库(支持 Vue 3)[^2]: ```bash npm install vue3-baidu-map-gl # 或 yarn add vue3-baidu-map-gl ``` - **注册组件** 在 `main.js` 中全局引入组件和百度地图 API 密钥(需在百度地图开放平台申请): ```javascript import { createApp } from 'vue'; import App from './App.vue'; import BaiduMap from 'vue3-baidu-map-gl'; const app = createApp(App); app.use(BaiduMap, { ak: 'YOUR_BAIDU_MAP_API_KEY' // 替换为实际密钥 }); app.mount('#app'); ``` #### 2. **基础地图渲染** - **组件中使用地图** 在 Vue 组件中通过 `<baidu-map>` 标签初始化地图,设置初始中心点和缩放级别: ```vue <template> <baidu-map class="map-container" :center="{ lng: 116.404, lat: 39.915 }" :zoom="14" @ready="handleMapReady" ></baidu-map> </template> <style> .map-container { width: 100%; height: 600px; /* 必须设置容器高度 */ } </style> ``` - **地图加载完成事件** 通过 `@ready` 事件获取地图实例,后续操作需在此回调中执行: ```javascript export default { methods: { handleMapReady(map) { this.map = map; // 存储地图实例 console.log('地图初始化完成'); } } } ``` #### 3. **添加地图覆盖物** - **标注点位** 使用 `BMapGL.Marker` 类创建标记,并通过 `map.addOverlay()` 添加到地图[^4]: ```javascript // 在 handleMapReady 中添加标记 const point = new BMapGL.Point(116.404, 39.915); const marker = new BMapGL.Marker(point); this.map.addOverlay(marker); ``` - **监听地图点击事件** 获取用户点击位置的经纬度,用于动态添加标记或传回后端: ```javascript this.map.addEventListener('click', (e) => { console.log('点击坐标:', e.latlng.lng, e.latlng.lat); }); ``` #### 4. **常见问题排查** - **地图未显示** 检查容器是否设置宽度和高度,确认 API 密钥有效且域名已加入白名单[^3]。 - **覆盖物未加载** 确保地图实例已初始化完成(在 `@ready` 回调中操作)。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值