uniapp 如何集成高德地图实现地图选点及搜索功能
在uniapp中如何集成高德地图实现地图选点及搜索功能?需要具体步骤和代码示例,包括如何引入高德地图SDK、初始化地图、实现选点功能以及添加搜索框进行地点搜索。最好能说明在安卓和iOS平台上的兼容性问题和注意事项。
在uniapp中集成高德地图,需先申请高德地图key。使用uni-app的地图组件,结合高德地图JS API。通过map组件显示地图,监听tap事件获取坐标。搜索功能调用高德POI搜索接口,将结果展示在地图上。记得配置manifest.json中的地图设置。
在 UniApp 中集成高德地图实现地图选点及搜索功能,可以通过以下步骤完成。由于 UniApp 本身不支持直接使用高德地图 SDK,需使用第三方插件或 Web-view 嵌入方式。这里推荐使用 uni-app
官方支持的 map
组件(仅支持基础地图显示)结合高德地图 JavaScript API(通过 Web-view)来实现完整功能。下面分步骤说明,并提供关键代码示例。
步骤 1:准备高德地图 API Key
- 访问高德开放平台(https://lbs.amap.com),注册账号并创建应用,获取 JavaScript API 的 Key。
- 记录 Key,后续在 Web-view 中调用 API 时使用。
步骤 2:使用 Web-view 嵌入高德地图页面
在 UniApp 页面中,使用 web-view
组件加载一个自定义的 HTML 页面,该页面集成高德地图 JavaScript API 实现选点和搜索功能。
UniApp 页面代码(Vue 文件)
在 pages
目录下创建一个页面,例如 map.vue
:
<template>
<view>
<web-view :src="mapUrl"></web-view>
</view>
</template>
<script>
export default {
data() {
return {
// 替换为你的高德地图 Key 和 HTML 文件路径
mapUrl: `/static/map.html?key=YOUR_AMAP_KEY`
};
},
onLoad() {
// 可选:传递参数到 HTML 页面,例如初始位置
}
};
</script>
步骤 3:创建高德地图 HTML 页面
在 UniApp 项目的 static
目录下,创建 map.html
文件。该文件使用高德地图 JavaScript API 实现地图显示、选点和搜索功能。
HTML 页面代码(map.html)
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>地图选点</title>
<style>
#container {
width: 100%;
height: 100vh;
}
#search {
position: absolute;
top: 10px;
left: 10px;
z-index: 999;
width: 90%;
}
#result {
position: absolute;
bottom: 10px;
left: 10px;
background: white;
padding: 10px;
border: 1px solid #ccc;
display: none;
}
</style>
</head>
<body>
<div id="container"></div>
<input type="text" id="search" placeholder="输入地点搜索...">
<div id="result"></div>
<script type="text/javascript" src="https://webapi.amap.com/maps?v=2.0&key=YOUR_AMAP_KEY"></script>
<script>
// 初始化地图
var map = new AMap.Map('container', {
zoom: 13,
center: [116.397428, 39.90923] // 默认北京中心
});
var marker = new AMap.Marker({
map: map,
draggable: true // 可拖动标记
});
// 地图点击事件:设置标记位置
map.on('click', function(e) {
marker.setPosition(e.lnglat);
updateResult(e.lnglat);
});
// 标记拖动事件
marker.on('dragend', function(e) {
updateResult(e.lnglat);
});
// 更新选点结果
function updateResult(lnglat) {
document.getElementById('result').style.display = 'block';
document.getElementById('result').innerHTML =
'选点位置: ' + lnglat.getLng() + ', ' + lnglat.getLat() +
'<br><button onclick="confirmSelection()">确认选点</button>';
}
// 确认选点:将位置信息传回 UniApp
function confirmSelection() {
var pos = marker.getPosition();
// 使用 UniApp 的 postMessage 与 Web-view 通信
if (window.uni && window.uni.postMessage) {
window.uni.postMessage({
data: {
action: 'confirmLocation',
longitude: pos.getLng(),
latitude: pos.getLat()
}
});
}
}
// 搜索功能:使用高德 PlaceSearch
var placeSearch = new AMap.PlaceSearch({
map: map,
panel: 'result' // 结果显示在 div 中
});
document.getElementById('search').addEventListener('change', function(e) {
placeSearch.search(e.target.value);
});
</script>
</body>
</html>
步骤 4:处理 UniApp 与 Web-view 的通信
在 UniApp 页面中,监听 Web-view 发送的消息,以获取选点结果。
在 map.vue 中添加通信处理
<script>
export default {
data() {
return {
mapUrl: `/static/map.html?key=YOUR_AMAP_KEY`
};
},
onLoad() {
// 监听 Web-view 消息
document.addEventListener('message', function(e) {
var data = JSON.parse(e.data);
if (data.action === 'confirmLocation') {
// 处理选点结果,例如返回上一页并传递位置数据
uni.navigateBack({
delta: 1,
success: () => {
// 使用全局事件或 Vuex 传递数据
uni.$emit('mapLocationSelected', {
longitude: data.longitude,
latitude: data.latitude
});
}
});
}
});
}
};
</script>
注意事项
- Key 替换:将代码中的
YOUR_AMAP_KEY
替换为实际的高德 API Key。 - 安全性:Key 不要硬编码在前端,建议通过后端动态生成 URL 或使用安全配置。
- 功能扩展:可根据需要添加更多地图控件(如缩放、图层)。
- 测试:在真机测试,因为 Web-view 在部分模拟器中可能受限。
通过以上步骤,即可在 UniApp 中实现地图选点和搜索功能。如果有更多定制需求,参考高德地图 JavaScript API 文档(https://lbs.amap.com/api/javascript-api/summary)。