作者: Devil枫 发布时间: 已于 2026-04-15 08:35:17 修改
来源: https://blog.csdn.net/weixin_43578304/article/details/159731850
经常做地图开发的都知道,在传统地图开发中,周边搜索、路线规划、筛选排序往往需要硬编码多套接口逻辑,参数繁琐、扩展性差。用户需要经过输入关键词→筛选条件→选择排序方式→点击路线规划等多个步骤,才能完成一次简单的出行需求;而开发者则需要处理复杂的参数判断,不仅开发效率低,且扩展性差,难以适配用户多样化的自然语言需求。比如简单的,用户想实现5公里内评分大于4.6的咖啡店,按距离最近规划步行路线,传统开发模式下,需要单独开发关键词搜索、范围筛选、评分过滤、排序、路线规划等多个模块,且无法直接响应自然语言指令。 基于此,我今天分享结合腾讯位置服务(WebService API + JavaScript API GL)与AI自然语言解析技术,实现了一套一句话完成复杂地图操作的智能出行助手——用户只需输入自然语句,系统即可自动完成语义解析、POI搜索、最优推荐、路线计算和地图渲染,既简化了用户操作,也降低了开发者的开发成本
思维导图:

当然了,为保证代码的轻量性、可运行性和易用性,我这次开发采用极简技术栈,无需依赖Vue、React等前端框架,具体选型如下:
整个系统的运行流程清晰易懂,分为5个核心步骤,形成完整的闭环,具体如下:
我们在运行本文提供的代码前,需先完成腾讯位置服务Key的申请与配置,步骤简单易懂,具体如下(新手必看):
注意:Key是接口调用的凭证,请勿泄露给他人;若接口调用失败,可检查Key是否正确、权限是否开启、域名白名单是否配置正确。
下面附上运行代码:
大家注意: 替换 key为你在腾讯位置服务控制台申请的 Web 端 Key(开启 WebService、JSAPI)
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<title>AI+地图智能推荐</title>
<style>
body{margin:0;padding:10px;background:#f5f5f5;}
#map{width:100%;height:70vh;border-radius:8px;}
.input-area{margin-bottom:10px;display:flex;gap:8px;}
#query{flex:1;padding:12px;border:1px solid #ddd;border-radius:6px;}
#searchBtn{padding:12px 20px;background:#12B7F5;color:white;border:none;border-radius:6px;cursor:pointer;}
</style>
</head>
<body>
<div class="input-area">
<input id="query" placeholder="例:5公里内评分>4.6咖啡店,按距离最近,步行路线"
value="5公里内评分>4.6的咖啡店,按距离最近,规划步行路线">
<button id="searchBtn">AI 解析搜索</button>
</div>
<div id="map"></div>
<!-- 腾讯地图 JS API GL -->
<script src="https://map.qq.com/api/gljs?v=1.exp&key=你的KEY"></script>
<script>
// 1. 初始化地图
const center = new TMap.LatLng(39.9046, 116.4074); // 北京
const map = new TMap.Map("map", {
center,
zoom: 14
});
let markerLayer, polylineLayer;
// 2. AI 解析:自然语言 → 地图参数(可替换为真实大模型)
function aiParseQuery(text) {
const res = {
keyword: "咖啡店",
radius: 5000,
sort: "distance", // distance / rating
filter: "rating>=4.6",
naviType: "walking" // walking / driving
};
if (/公里/.test(text)) res.radius = parseInt(text.match(/(\d+)公里/)[1]) * 1000;
if (/评分>?(\d+\.?\d*)/.test(text)) res.filter = `rating>=${text.match(/评分>?(\d+\.?\d*)/)[1]}`;
if (/距离最近/.test(text)) res.sort = "distance";
if (/评分最高/.test(text)) res.sort = "rating";
if (/步行/.test(text)) res.naviType = "walking";
if (/驾车/.test(text)) res.naviType = "driving";
if (/餐厅|火锅|烧烤|咖啡/.test(text)) res.keyword = text.match(/(餐厅|火锅|烧烤|咖啡店)/)[1];
return res;
}
// 3. 腾讯POI搜索(WebService)
async function searchPOI(params) {
const key = "你的KEY";
const url = `https://apis.map.qq.com/ws/place/v1/search`
+ `?keyword=${encodeURIComponent(params.keyword)}`
+ `&boundary=nearby(${center.lat},${center.lng},${params.radius})`
+ `&orderby=${params.sort}`
+ `&filter=${params.filter}`
+ `&page_size=5`
+ `&key=${key}&output=jsonp`;
return new Promise(resolve => {
const script = document.createElement('script');
window.callback = data => resolve(data?.data?.[0] || null);
script.src = url + '&callback=callback';
document.body.appendChild(script);
});
}
// 4. 路线规划
async function getRoute(from, to, type) {
const key = "你的KEY";
const api = type === "driving" ? "driving" : "walking";
const url = `https://apis.map.qq.com/ws/direction/v1/${api}/`
+ `?from=${from.lat},${from.lng}`
+ `&to=${to.lat},${to.lng}`
+ `&key=${key}&output=jsonp`;
return new Promise(resolve => {
const script = document.createElement('script');
window.routeCb = data => resolve(data?.result?.routes?.[0] || null);
script.src = url + '&callback=routeCb';
document.body.appendChild(script);
});
}
// 5. 绘制地图
function drawMap(to, coords) {
if (markerLayer) markerLayer.setMap(null);
if (polylineLayer) polylineLayer.setMap(null);
// 终点标记
markerLayer = new TMap.MultiMarker({
map,
geometries: [{ position: to, content: "推荐" }]
});
// 路线
const path = coords.map(p => new TMap.LatLng(p.lat, p.lng));
polylineLayer = new TMap.MultiPolyline({
map,
geometries: [{
paths: path,
style: { color: "#12B7F5", width: 6 }
}]
});
map.fitBounds(path);
}
// 6. 主流程
document.getElementById('searchBtn').onclick = async () => {
const text = document.getElementById('query').value;
const params = aiParseQuery(text);
console.log("AI解析参数", params);
const poi = await searchPOI(params);
if (!poi) return alert("未找到符合条件结果");
const to = new TMap.LatLng(poi.location.lat, poi.location.lng);
const route = await getRoute(center, to, params.naviType);
if (!route) return alert("路线失败");
drawMap(to, route.polyline);
alert(`推荐:${poi.title}\n地址:${poi.address}\n距离:${route.distance}m`);
};
</script>
</body>
</html>
这里说一下几个关键点:
为帮助开发者更好地理解代码逻辑、便于二次开发,我单独对核心模块进行详细解析,结合代码注释,让新手也能轻松掌握。
该模块是新手重点修改的部分,包含两个核心配置:
该模块用于初始化腾讯地图实例,核心参数说明:
同时声明了markerLayer(点位标记图层)和lineLayer(路线图层)两个全局变量,用于后续销毁重绘,避免重复绘制导致的界面混乱。
该模块是实现「自然语言→地图操作」的核心,功能是将用户的自然语句拆解为结构化参数。其核心逻辑是通过正则表达式,提取自然语句中的关键信息(范围、评分、排序、出行方式、关键词),并赋值给params对象。
重点说明:
该模块调用腾讯位置服务POI搜索接口(place/v1/search),核心作用是根据AI解析后的参数,搜索符合条件的点位。
关键参数说明(接口URL拼接部分):
接口返回的数据中,包含点位的名称、地址、坐标、评分等信息,本文只提取第一个最优结果,可根据需求扩展为多结果列表展示。
该模块调用腾讯位置服务路线规划接口,支持步行、驾车两种出行方式,核心参数说明:
该模块用于在地图上绘制点位标记和路线,核心功能:
该模块是整个系统的入口,串联所有模块,执行流程如下:
同时,在控制台打印AI解析后的参数,便于开发者调试,排查问题。
代码运行后,可直接复制以下测试语句,粘贴到输入框中,点击“AI解析搜索”,即可看到效果,无需额外配置:
测试注意事项:
在运行代码或二次开发过程中,可能会遇到一些问题,我也整理了常见问题及解决方法,帮助大家快速排错:
原因:Key错误或未配置权限。
解决方法:
原因:搜索条件过于严格(如范围太小、评分太高),或关键词错误。
解决方法:
原因:起点或终点坐标错误,或网络连接异常。
解决方法:
原因:地图初始化失败,或图层未正确绑定到地图实例。
解决方法:
最后简单总结一下,这里我们基于腾讯位置服务与AI自然语言解析技术,实现了一套轻量化、可运行、可扩展的AI+地图智能出行助手。完全实现简化了用户的地图操作流程(一句话完成复杂需求),降低了开发者的开发成本(无框架依赖、开箱即用),同时具备较强的扩展性,可根据需求扩展多场景、多端适配,满足不同开发者的二次开发需求。希望本文的方案能为广大开发者提供参考与帮助。
在智慧出行零售选址物流调度等场景中,精准的地图能力是企业数字化转型的关键支撑。腾讯位置服务地图开放平
在移动应用开发中,精准定位是连接用户与线下场景的核心能力。无论是物流调度共享出行,还是本地生活服务,
作者: 对 发布时间: 已于20260424 16:56:55修改 来源: https:blog