1. 环境准备与项目创建
想要用uniapp开发地图应用,首先得把开发环境搭建好。我这里推荐使用HBuilderX作为开发工具,它专门为uniapp做了优化,用起来特别顺手。安装过程很简单,去官网下载对应版本就行,Windows和Mac都支持。
创建项目时记得选择"uni-app"模板,建议用vue3版本,毕竟这是现在的趋势。项目名称可以叫"uni-map-demo"之类的,方便识别。创建完成后,你会看到一个标准的uniapp项目结构,pages目录用来放页面,static放静态资源,这些基础知识我就不多说了。
地图开发离不开地图服务商的API,国内主流的有高德、百度、腾讯地图。我个人比较推荐高德,因为它的文档齐全,免费额度也够用。申请API密钥的过程很简单,注册开发者账号,创建应用,获取key就行。记得把获取到的key保存好,待会儿配置要用到。
2. 基础地图集成
2.1 配置manifest.json
在manifest.json中需要配置地图相关的设置。找到"app-plus"节点,添加如下配置:
"maps": { "amap": { "key": "你的高德地图key", "securityJsCode": "你的安全密钥" } }安全密钥不是必须的,但建议加上,可以防止key被滥用。配置完成后,记得重新运行项目使配置生效。
2.2 基本地图展示
在页面中使用map组件非常简单,在template中添加:
<map id="myMap" style="width:100%; height:300px;" :latitude="latitude" :longitude="longitude" :markers="markers" ></map>对应的script部分:
export default { data() { return { latitude: 39.909, longitude: 116.397, markers: [] } } }这样就能显示一个以北京为中心的基础地图了。地图的宽高建议用固定值或者百分比,不要用rpx,因为map是原生组件,有些CSS属性不支持。
3. 标记点与信息气泡
3.1 添加标记点
标记点是地图上最常见的元素,用来标识特定位置。在data中定义markers数组:
markers: [{ id: 1, latitude: 39.909, longitude: 116.397, title: '天安门广场', iconPath: '/static/location.png', width: 30, height: 30 }]iconPath可以指定自定义图标,建议使用绝对路径。如果想用网络图片,记得在manifest.json中配置域名白名单。
3.2 信息气泡实现
信息气泡可以在点击标记点时显示更多信息。修改markers配置:
{ id: 1, latitude: 39.909, longitude: 116.397, title: '天安门广场', iconPath: '/static/location.png', callout: { content: '北京著名地标', color: '#ffffff', bgColor: '#007AFF', padding: 10, borderRadius: 4, display: 'ALWAYS' } }callout对象定义了气泡的样式和行为。display属性可以设为'ALWAYS'常显或'BYCLICK'点击显示。
4. 交互功能实现
4.1 点击事件处理
给map组件添加点击标记点的事件:
<map @markertap="handleMarkerTap"></map>在methods中定义处理函数:
handleMarkerTap(e) { const markerId = e.markerId uni.showToast({ title: `点击了标记点${markerId}`, icon: 'none' }) }通过e.markerId可以获取被点击标记点的id,然后可以根据id做不同处理。
4.2 地图定位功能
实现一键定位到当前位置的功能:
methods: { locate() { uni.getLocation({ type: 'gcj02', success: (res) => { this.latitude = res.latitude this.longitude = res.longitude this.$nextTick(() => { this.mapCtx = uni.createMapContext('myMap', this) this.mapCtx.moveToLocation() }) } }) } }注意type要设为'gcj02',这是国内地图通用的坐标系。moveToLocation方法会把地图中心点移动到当前位置。
5. 进阶功能与优化
5.1 自定义地图样式
高德地图支持自定义样式,可以在map组件上添加:
<map :setting="mapSetting"></map>data中定义:
mapSetting: { skew: 0, rotate: 0, showLocation: true, showScale: true, subKey: '', layerStyle: 1 }layerStyle可以设置内置的样式,也可以使用自定义样式ID。
5.2 性能优化技巧
当地图标记点很多时,可能会卡顿。可以采用以下优化方案:
- 使用聚合标记点,当缩放级别改变时动态合并/分开标记点
- 延迟加载非可视区域内的标记点
- 简化标记点图标,使用更小的图片
- 避免频繁调用地图的setData方法
6. 常见问题解决
在实际开发中,我遇到过几个典型问题:
- 地图不显示:检查key是否正确,manifest配置是否生效,网络是否正常
- 标记点不显示:确认经纬度是否正确,iconPath路径是否正确
- 定位不准:确认使用的是gcj02坐标系,检查手机GPS是否开启
- 真机调试问题:确保打包时选择了地图模块,检查权限是否获取
7. 完整项目源码解析
项目源码已经上传到GitHub,包含以下核心文件:
- pages/index/index.vue - 主页面,包含地图组件和所有交互逻辑
- static/map-style.json - 自定义地图样式配置文件
- manifest.json - 应用配置,包含地图key等设置
- pages.json - 页面路由配置
代码结构清晰,每个功能模块都有详细注释,方便理解和扩展。比如定位功能的实现:
// 获取当前位置 getCurrentLocation() { return new Promise((resolve, reject) => { uni.getLocation({ type: 'gcj02', success: resolve, fail: reject }) }) }这个Promise封装的版本更适合在复杂逻辑中使用。