摘要

随着大语言模型与智能体(Agent)技术的规模化落地,位置服务正经历从「被动执行的导航工具」到「主动决策的空间智能大脑」的本质跃迁。本文基于腾讯位置服务原生的 MCP(Model Context Protocol)服务、Map Skills 能力体系,结合多 AI 工具协同与 Agent 架构设计,打造了一套覆盖全场景的空间智能大脑解决方案,实现了自然语言驱动的地图能力调用、多维度出行智能决策、全场景 POI 深度推荐、时空数据商业分析四大核心能力。本文将完整拆解项目的创意逻辑、技术底座、提示词工程、全流程开发实现与创新价值,为 AI与地图服务的深度融合提供可复现、可扩展的完整实践方案。

一、引言:地图服务的智能化革命

自电子地图诞生以来,其核心形态始终围绕「坐标可视化」与「路线导航」两大基础能力展开,本质上是用户输入明确指令后被动执行的工具。而随着 AI 技术的爆发式发展,尤其是大模型的语义理解、逻辑推理与工具调用能力的成熟,地图服务的核心价值正在被重新定义。

今天的地图,不再是等待用户输入起止点的「画布」,而是能听懂自然语言需求、综合多维度时空数据、主动输出最优决策方案的「智能大脑」。用户无需再手动切换多个 APP、反复筛选 POI、调整路线参数,只需一句话描述需求,地图就能完成从需求解析、数据调用、方案决策到结果可视化的全流程闭环。

腾讯位置服务联合 CSDN 共同发起的「AI + 地图・智能进化」开发者征文大赛,正是为广大开发者提供了探索地图智能化无限可能的创新舞台。本文基于腾讯位置服务官方开放的 AI 原生能力,从零到一打造了一套完整的空间智能大脑,既满足零基础开发者的快速落地需求,也为高阶开发者提供了可深度定制的技术框架,全面贴合大赛「AI 赋能,重塑地图智能新体验」的核心主题。

二、行业痛点:传统位置服务的能力瓶颈

在日常出行与商业应用中,传统地图服务的能力短板日益凸显,主要集中在四大核心痛点:

2.1 交互范式固化,使用门槛高

传统地图的交互逻辑高度依赖用户的手动操作:用户需要分步输入起止点、手动筛选 POI 类型、反复调整路线参数,无法通过自然语言一次性完成复杂需求。对于「帮我找济南市区人少、有停车场、适合带孩子玩的户外公园,顺路推荐一家评分 4.8 以上的鲁菜馆」这类复合需求,用户需要在多个页面来回切换,操作成本极高。

2.2 决策能力单一,无法适配复杂场景

传统地图的路线规划仅能基于「最短距离」「最快时间」两个单一维度输出结果,无法综合实时路况、客流热力、天气变化、用户偏好、多人出行等多维度数据做智能决策。比如多人出行场景中,传统地图无法为来自不同出发地的用户智能推荐最优汇合点,只能由用户手动协调,效率极低。

2.3 场景能力割裂,无法形成闭环

路线规划、美食推荐、酒店预订、商业选址、客流分析等高频需求,分散在不同的 APP 与平台中,传统地图无法实现全场景能力的打通。用户在地图上找到合适的点位后,还需要切换到其他平台完成后续操作,无法在地图场景中完成从需求到落地的全流程闭环。

2.4 开发门槛高,创新落地难度大

传统地图 API 的开发需要开发者掌握复杂的接口参数、坐标体系、前端渲染逻辑,即使是简单的地图功能,也需要大量的代码开发工作。对于 AI 开发者而言,很难快速将大模型能力与地图服务深度融合,极大限制了 AI + 地图的创新落地。

三、核心技术底座:腾讯位置服务 AI 能力体系全解析

腾讯位置服务针对 AI 时代的开发需求,打造了一套原生适配大模型与 Agent 开发的能力体系,为地图智能化提供了完整的技术底座,也是本次项目的核心技术支撑。

3.1 MCP Server:AI 与地图的标准化桥梁

MCP(Model Context Protocol)是腾讯位置服务推出的、专为大模型设计的标准化服务接口,彻底解决了大模型与地图服务的对接难题,让 AI 大模型可以像人类一样原生调用地图的全量能力。

  • 云端化部署:无需本地部署服务,通过标准 SSE/StreamableHTTP 协议即可接入,开箱即用;
  • 语义化封装:对原生 API 的 JSON 结果进行语义化转换,更适配大模型的理解与处理,大幅降低提示词调试成本;
  • 全能力覆盖:封装了腾讯位置服务的核心 WebService API,包括地址解析、POI 搜索、路线规划、距离矩阵、逆地址解析等高频能力;
  • 高兼容性:完美适配 WorkBuddy、OpenClaw、Dify、LangChain 等主流 AI 开发平台与智能体框架。

3.2 Map Skills:开箱即用的地图能力插件

腾讯地图官方推出了两款核心 Skill,为 AI 开发工具提供了零代码的地图能力接入方案,无需开发者手动对接 API,即可快速实现地图功能开发。

  1. tmap-jsapi-gl Skill面向前端地图渲染的能力插件,封装了腾讯地图 JavaScript API GL 的全量能力,支持地图初始化、3D 视图控制、覆盖物绘制、图层管理、事件系统、可视化渲染等核心功能,一句话即可生成可直接运行的地图渲染代码。
  2. tmap-lbs-skill Skill面向 LBS 综合服务的能力插件,封装了周边 POI 搜索、旅游行程规划、轨迹图可视化、地址解析转换等高频场景化能力,专为出行、文旅、本地生活等场景优化,适配大模型的自然语言调用逻辑。

3.3 全栈地图基础能力

腾讯位置服务提供了覆盖「定位 - 地图 - 导航 - 搜索 - 分析」的全栈基础能力,为 AI 应用提供了稳定、精准的底层支撑:

  • 地图渲染能力:JavaScript API GL、小程序地图组件,支持 2D/3D 地图渲染、海量数据可视化、自定义地图样式;
  • 定位服务能力:IP 定位、GPS 定位、室内定位、WiFi / 基站定位,覆盖全场景定位需求,综合定位精度业界领先;
  • 路线规划能力:驾车、步行、公交、骑行、货车等多模式路线规划,支持多途经点、实时路况避堵、未来路况预测;
  • 搜索与解析能力:POI 搜索、关键词提示、地址解析 / 逆地址解析、行政区划查询,覆盖全国全量 POI 数据;
  • 时空大数据能力:客流热力分析、人群画像、区域潜力评估、出行特征分析,为商业决策提供数据支撑。

四、AI + 地图核心 Skill 提示词工程:开箱即用的能力封装

提示词工程是实现大模型与地图能力深度融合的核心,也是本次项目的核心交付物。以下提示词经过多轮调优,完美适配腾讯位置服务 MCP 协议与 Map Skills 体系,可直接在 WorkBuddy、OpenClaw 等主流 AI 开发工具中开箱即用,覆盖全场景地图 AI 开发需求。

4.1 通用系统提示词(全场景基础版)

# 角色:腾讯地图空间智能专家
你是基于腾讯位置服务MCP协议打造的专业地图智能体,精通腾讯地图全量API与Skill能力,能精准理解用户的出行、选址、规划、分析类需求,通过调用腾讯地图官方工具,输出专业、精准、可落地的空间智能解决方案。

## 核心能力与调用规则
1. 地址解析规则
- 当用户输入文字地址/地名时,必须先调用geocoder接口,将地址转换为经纬度坐标,同时获取结构化的省市区地址信息;
- 当用户输入经纬度坐标时,必须调用reverseGeocoder接口,将坐标转换为可读的文字地址与周边POI信息,禁止直接输出原始坐标。

2. POI搜索规则
- 周边搜索:使用placeSearchNearby接口,必须传入中心点坐标、搜索关键词、搜索半径三个核心参数,默认按距离排序;
- 城市内搜索:使用placeSearch接口,必须明确指定城市范围,避免跨城市搜索结果偏差;
- 沿途搜索:先通过路线规划接口获取路线坐标串,再调用placeAlongby接口搜索路线沿途的POI,禁止无路线的沿途搜索。

3. 路线规划规则
- 必须根据用户的出行方式,调用对应的direction系列接口:驾车(directionDriving)、公交(directionTransit)、步行(directionWalking)、骑行(directionRiding);
- 多途经点规划:必须明确起止点与途经点顺序,返回路线总距离、预计总耗时、分段路线详情、路况提示;
- 多人出行规划:先获取所有参与者的地址/坐标,调用distanceMatrix接口计算距离矩阵,再基于「最大耗时最小化」原则推荐最优汇合点。

4. 地图渲染规则
- 所有坐标、路线、POI信息,必须调用tmap-jsapi-gl Skill生成可直接运行的前端渲染代码;
- 渲染代码必须包含完整的地图初始化、覆盖物绘制、事件监听、样式配置,可直接复制到HTML文件中运行;
- 必须使用腾讯地图官方的JavaScript API GL,禁止使用第三方地图框架。

## 输出规范
1. 先精准拆解用户的核心需求,明确需求场景、约束条件与核心目标,不偏离用户需求;
2. 严格按照上述规则调用腾讯地图官方工具,禁止编造不存在的接口、参数与返回结果;
3. 结果输出分为三个部分:
   - 第一部分:结构化的自然语言解决方案,逻辑清晰、通俗易懂,贴合用户需求;
   - 第二部分:完整的可运行代码片段,包含完整的配置、参数、详细注释;
   - 第三部分:地图可视化方案,明确标注渲染内容与预期效果;
4. 若用户需求信息不完整,必须主动询问关键参数,禁止输出模糊、不准确的结果;
5. 所有坐标、地址、POI信息必须来自腾讯地图接口返回结果,禁止编造虚假地理位置信息。

## 优先级规则
1. 安全优先:路线规划必须优先推荐合规、安全的路线,禁止推荐危险路段、禁行路段;
2. 需求优先:严格按照用户的约束条件输出方案,禁止偏离用户的核心需求;
3. 精准优先:所有地理信息必须精准,优先返回腾讯地图官方的权威结果。

4.2 分场景专用提示词

场景 1:智能行程规划专用提示词
# 角色:腾讯地图智能行程规划师
你是基于腾讯位置服务打造的专业行程规划智能体,能根据用户的目的地、出行天数、出行人数、偏好标签,生成精准、合理、可落地的个性化行程方案,同时通过腾讯地图API完成路线规划、POI推荐、地图可视化全流程。

## 核心规划规则
1. 行程逻辑规范
- 先明确用户的核心信息:目的地城市、出行天数、出行人数、出行偏好(亲子/情侣/人文/自然风光/美食/小众打卡等)、出行方式、预算范围;
- 基于用户偏好,调用placeSearch接口获取目的地城市的优质POI,优先筛选评分高、口碑好、距离合理的点位,避免网红打卡点的过度推荐;
- 基于地理位置智能排序游览点位,单日行程集中在同一区域,避免跨区域往返奔波,单日车程控制在合理范围;
- 行程安排张弛有度,合理分配游览、餐饮、休息、交通时间,避免行程过于紧凑或松散;
- 餐饮推荐必须匹配当日行程点位,优先推荐行程周边的本地特色美食,贴合用户的口味偏好;
- 酒店推荐优先选择行程核心区域,交通便利、配套完善,匹配用户的预算范围。

2. 地图能力调用规范
- 每日行程必须调用对应出行方式的路线规划接口,规划点位之间的最优交通路线,返回预计耗时与详细交通方案;
- 必须调用placeSearchNearby接口,搜索当日行程点位周边的餐饮、卫生间、停车场等配套设施;
- 全行程结束后,必须调用tmap-jsapi-gl Skill,生成全行程路线、POI点位、游览顺序的3D地图可视化代码。

3. 输出规范
- 先输出行程总览:包含行程亮点、核心路线、总里程、交通总览、适合人群;
- 再按天输出详细行程:包含时间安排、点位详情、交通方案、餐饮推荐、住宿推荐、注意事项;
- 最后输出完整的地图可视化代码,可直接复制运行,渲染全行程信息;
- 所有方案必须具备可执行性,禁止输出空泛、不符合实际的行程安排。
场景 2:多人出行智能汇合点决策专用提示词
# 角色:腾讯地图多人出行智能决策专家
你是基于腾讯位置服务打造的多人出行汇合点规划专家,能根据多个参与者的出发位置、出行方式、时间约束,智能推荐最优汇合地点,同时生成每个参与者到汇合点的详细出行方案。

## 核心计算规则
1. 基础信息处理
- 先获取所有参与者的核心信息:出发地址/实时位置、出行方式(驾车/公交/步行/骑行)、可接受的最长通勤时间;
- 调用geocoder接口,将所有参与者的出发地址转换为精准的经纬度坐标,确保位置信息准确;
- 调用distanceMatrix接口,计算所有参与者之间的距离与通勤耗时矩阵,作为汇合点筛选的核心依据。

2. 汇合点筛选逻辑
- 核心原则:「最大通勤耗时最小化」,优先保证所有参与者的通勤时间均衡,避免单个参与者通勤时间过长;
- 次要原则:「总通勤距离最短」,在时间均衡的前提下,最小化所有参与者的总通勤成本;
- 候选点位要求:优先推荐交通便利、配套完善、适合汇合的点位,如商圈、地铁站出入口、景区入口、大型停车场,禁止推荐偏僻、无配套的点位;
- 必须提供2-3个备选汇合点,标注每个方案的优势与适用场景,供用户选择。

3. 地图能力调用规范
- 调用placeSearchNearby接口,搜索所有出发位置的几何中心点周边的优质汇合点候选;
- 为每个参与者调用对应出行方式的路线规划接口,生成详细的出行路线、预计耗时、关键途经点;
- 调用tmap-jsapi-gl Skill,在地图上标注所有参与者的出发位置、汇合点位置、每个人的出行路线,生成可直接运行的渲染代码。

4. 输出规范
- 先输出最优汇合点推荐:包含汇合点名称、详细地址、核心推荐理由、每个参与者的通勤时间与距离;
- 再输出每个参与者的详细出行方案:包含交通方式、路线详情、预计耗时、关键导航节点、停车建议;
- 再输出备选汇合点方案,标注各自的优劣势;
- 最后输出完整的地图可视化代码,可直接复制运行。
场景 3:商业智能选址专用提示词

plaintext

# 角色:腾讯地图商业智能选址专家
你是基于腾讯位置大数据打造的专业商业选址智能体,能根据用户的门店类型、目标客群、预算、城市范围,结合客流热力、人群画像、周边配套、竞争环境,输出专业的商业选址分析报告与最优选址方案。

## 核心分析规则
1. 选址需求拆解
- 先明确用户的核心需求:门店业态(餐饮/零售/休闲娱乐/生活服务等)、目标客群画像、目标城市/区域、面积/租金预算、核心选址要求;
- 基于门店业态,确定核心选址维度:客流规模、客群匹配度、交通便利度、周边配套、竞争环境、租金水平。

2. 数据分析逻辑
- 调用腾讯位置大数据接口,获取目标城市/区域的客流热力分布、目标客群聚集区域、热门商圈排名;
- 调用placeSearch接口,分析目标区域的同类门店分布(竞争环境)、周边配套(写字楼/住宅小区/学校/地铁站/医院等);
- 综合五大核心维度,为每个候选区域进行量化打分,满分100分,按得分高低排序;
- 优先推荐客流充足、客群匹配度高、竞争强度适中、交通便利、租金符合预算的点位。

3. 地图能力调用规范
- 调用热力图接口,在地图上渲染目标城市/区域的客流热力分布;
- 调用placeSearch接口,在地图上标注候选点位的目标客群配套、竞争门店、交通点位;
- 调用geocoder接口,将所有选址点位转换为精准的坐标与结构化地址信息;
- 调用tmap-jsapi-gl Skill,生成完整的选址分析地图可视化代码,包含热力图、点位标注、区域划分。

4. 输出规范
- 先输出选址分析总览:包含核心选址逻辑、筛选维度、最优区域推荐、核心结论;
- 再输出详细的候选点位分析:每个点位包含客流数据、客群画像、配套分析、竞争分析、优劣势总结、综合得分;
- 再输出完整的量化评分表,按维度清晰展示每个候选点位的得分情况;
- 最后输出完整的地图可视化代码,可直接复制运行。

五、全链路实战开发:空间智能大脑的落地实现

本章节将完整拆解空间智能大脑的全流程开发实现,所有代码均基于腾讯位置服务官方能力开发,可直接复现,覆盖地址解析、POI 搜索、路线规划、地图渲染全链路能力。

5.1 前期开发准备

  1. 开发者账号注册:前往

    腾讯位置服务官网

    File

    完成开发者注册与实名认证,全程免费;
  2. 创建应用与 Key 获取:进入控制台→应用管理→我的应用→创建应用,应用类型选择「Web 端」,为应用添加 Key,开启「WebServiceAPI」与「JavaScript API」权限;
  3. AI 开发工具准备:下载安装

    WorkBuddy

    File

    (零代码开发)或配置 LangChain 开发环境(自定义开发);
  4. 权限确认:腾讯位置服务 MCP Server 与 Map Skills 对所有开发者免费开放,使用上述 Key 即可直接调用,无需额外申请开通。

5.2 MCP 服务对接配置

MCP 服务对接分为零代码可视化配置与代码化自定义配置两种方式,开发者可根据自身需求选择。

方式 1:WorkBuddy 零代码可视化配置
  1. 打开 WorkBuddy,点击侧边栏「插件」,选择右上角「MCP 服务器」;
  2. 点击「添加 MCP 服务器」,填写以下配置信息:
    • 服务器名称:腾讯位置服务
    • 服务类型:SSE
    • 服务地址:https://mcp.map.qq.com/sse?key=你的腾讯位置服务Key
  3. 点击「保存」并启用该服务器,WorkBuddy 会自动识别所有可用的地图工具接口,完成对接后即可通过自然语言直接调用地图能力。
方式 2:LangChain 代码化自定义配置

适用于需要深度定制智能体逻辑的开发者,基于 TypeScript 实现 MCP 客户端的完整封装:

// src/services/tencent-map-mcp.ts
import { MCPClient } from '@modelcontextprotocol/sdk/client/index.js';
import { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js';

/**
 * 腾讯地图MCP客户端封装
 * 基于腾讯位置服务官方MCP Server实现
 */
export class TencentMapMcpClient {
  // 单例实例
  private static instance: TencentMapMcpClient;
  // MCP客户端实例
  private client: MCPClient;
  // SSE传输实例
  private transport: SSEClientTransport;
  // 腾讯地图Key
  private readonly mapKey: string;
  // MCP服务地址
  private readonly mcpServerUrl: string;
  // 连接状态
  private isConnected: boolean = false;

  private constructor() {
    // 从环境变量获取Key,避免硬编码泄露
    this.mapKey = process.env.TENCENT_MAP_KEY || '';
    if (!this.mapKey) {
      throw new Error('请配置环境变量TENCENT_MAP_KEY');
    }
    this.mcpServerUrl = `https://mcp.map.qq.com/sse?key=${this.mapKey}`;
    
    // 初始化MCP客户端
    this.client = new MCPClient(
      { name: 'tencent-map-space-brain', version: '1.0.0' },
      { capabilities: { tools: {} } }
    );
    // 初始化SSE传输
    this.transport = new SSEClientTransport(new URL(this.mcpServerUrl));
  }

  /**
   * 获取单例实例
   */
  public static getInstance(): TencentMapMcpClient {
    if (!TencentMapMcpClient.instance) {
      TencentMapMcpClient.instance = new TencentMapMcpClient();
    }
    return TencentMapMcpClient.instance;
  }

  /**
   * 连接MCP服务器
   */
  public async connect(): Promise<void> {
    if (this.isConnected) {
      console.log('MCP服务器已连接,无需重复连接');
      return;
    }
    try {
      await this.client.connect(this.transport);
      this.isConnected = true;
      console.log('腾讯地图MCP服务器连接成功');
      // 获取并打印可用工具列表
      const tools = await this.client.listTools();
      console.log('可用地图工具数量:', tools.tools.length);
    } catch (error) {
      console.error('MCP服务器连接失败:', error);
      throw error;
    }
  }

  /**
   * 调用地图工具
   * @param toolName 工具名称
   * @param args 工具参数
   * @returns 工具调用结果
   */
  public async callTool(toolName: string, args: Record<string, any>) {
    if (!this.isConnected) {
      throw new Error('MCP服务器未连接,请先调用connect()方法');
    }
    try {
      const result = await this.client.callTool({
        name: toolName,
        arguments: args
      });
      return result;
    } catch (error) {
      console.error(`工具【${toolName}】调用失败:`, error);
      throw error;
    }
  }

  /**
   * 断开MCP服务器连接
   */
  public async disconnect(): Promise<void> {
    if (this.isConnected) {
      await this.client.close();
      this.isConnected = false;
      console.log('MCP服务器连接已断开');
    }
  }
}

5.3 核心功能模块实现

基于上述 MCP 客户端,我们实现了空间智能大脑的三大核心功能模块,覆盖高频使用场景。

模块 1:自然语言行程规划核心实现

typescript

运行

// src/modules/itinerary-planner.ts
import { TencentMapMcpClient } from '../services/tencent-map-mcp.ts';

/**
 * 智能行程规划核心函数
 * @param params 行程规划参数
 * @returns 完整行程方案
 */
export async function generateIntelligentItinerary(params: {
  city: string;
  days: number;
  preferences: string[];
  travelMode: 'driving' | 'transit';
  budgetLevel: 'economy' | 'comfort' | 'luxury';
}) {
  const { city, days, preferences, travelMode, budgetLevel } = params;
  const mcpClient = TencentMapMcpClient.getInstance();
  await mcpClient.connect();

  try {
    // 步骤1:地址解析,获取城市中心点坐标
    const cityGeocodeResult = await mcpClient.callTool('geocoder', {
      address: city,
      region: city
    });
    const cityCenter = cityGeocodeResult.result.location;
    console.log('目的地城市中心点:', cityCenter);

    // 步骤2:基于用户偏好搜索优质POI
    const searchKeywords = preferences.join('|');
    const poiResult = await mcpClient.callTool('placeSearch', {
      keyword: searchKeywords,
      region: city,
      page_size: days * 4,
      filter: 'type=旅游景点|文化场馆|公园'
    });
    const attractionList = poiResult.data;
    console.log('获取到景点数量:', attractionList.length);

    // 步骤3:智能规划景点游览顺序,避免跨区域往返
    const waypointOrderResult = await mcpClient.callTool('waypointOrder', {
      points: attractionList.map(item => item.location)
    });
    const orderedAttractions = waypointOrderResult.data.points.map((point, index) => ({
      ...attractionList[index],
      orderIndex: index
    }));

    // 步骤4:按天分配置行程
    const itinerary = [];
    const attractionsPerDay = Math.ceil(orderedAttractions.length / days);
    
    for (let day = 0; day < days; day++) {
      const dayAttractions = orderedAttractions.slice(
        day * attractionsPerDay,
        (day + 1) * attractionsPerDay
      );

      // 规划当日路线
      const dayRouteResult = await mcpClient.callTool(`direction${travelMode.charAt(0).toUpperCase() + travelMode.slice(1)}`, {
        from: dayAttractions[0].location,
        to: dayAttractions[dayAttractions.length - 1].location,
        waypoints: dayAttractions.slice(1, -1).map(item => item.location)
      });

      // 搜索当日行程周边餐饮推荐
      const restaurantResult = await mcpClient.callTool('placeSearchNearby', {
        keyword: '特色美食|本地餐厅',
        location: dayAttractions[Math.floor(dayAttractions.length / 2)].location,
        radius: 2000,
        orderby: 'rating'
      });

      // 搜索周边酒店推荐
      const hotelResult = await mcpClient.callTool('placeSearchNearby', {
        keyword: budgetLevel === 'economy' ? '经济型酒店' : budgetLevel === 'comfort' ? '四星级酒店' : '五星级酒店',
        location: dayAttractions[0].location,
        radius: 3000,
        orderby: 'rating'
      });

      itinerary.push({
        day: day + 1,
        attractions: dayAttractions,
        route: dayRouteResult.result.routes[0],
        restaurantRecommendations: restaurantResult.data.slice(0, 3),
        hotelRecommendations: hotelResult.data.slice(0, 3)
      });
    }

    await mcpClient.disconnect();
    return {
      city,
      days,
      cityCenter,
      itinerary,
      totalDistance: itinerary.reduce((sum, day) => sum + day.route.distance, 0),
      totalDuration: itinerary.reduce((sum, day) => sum + day.route.duration, 0)
    };

  } catch (error) {
    await mcpClient.disconnect();
    console.error('行程规划失败:', error);
    throw error;
  }
}

// 调用示例
(async () => {
  const itinerary = await generateIntelligentItinerary({
    city: '济南市',
    days: 3,
    preferences: ['亲子', '自然风光', '人文历史'],
    travelMode: 'driving',
    budgetLevel: 'comfort'
  });
  console.log('生成的行程方案:', JSON.stringify(itinerary, null, 2));
})();
模块 2:多人出行汇合点智能决策实现

typescript

运行

// src/modules/meeting-point-calculator.ts
import { TencentMapMcpClient } from '../services/tencent-map-mcp.ts';

/**
 * 参与者信息类型定义
 */
interface Participant {
  name: string;
  address: string;
  travelMode: 'driving' | 'transit' | 'walking' | 'riding';
  maxAcceptableDuration?: number; // 单位:秒
}

/**
 * 多人出行最优汇合点计算核心函数
 * @param participants 参与者列表
 * @returns 汇合点方案
 */
export async function calculateOptimalMeetingPoint(participants: Participant[]) {
  const mcpClient = TencentMapMcpClient.getInstance();
  await mcpClient.connect();

  try {
    // 步骤1:解析所有参与者的地址为经纬度坐标
    const participantWithLocation = [];
    for (const participant of participants) {
      const geocodeResult = await mcpClient.callTool('geocoder', {
        address: participant.address,
        region: '全国'
      });
      participantWithLocation.push({
        ...participant,
        location: geocodeResult.result.location
      });
    }

    // 步骤2:计算所有位置的几何中心点
    const centerPoint = {
      lat: participantWithLocation.reduce((sum, p) => sum + p.location.lat, 0) / participantWithLocation.length,
      lng: participantWithLocation.reduce((sum, p) => sum + p.location.lng, 0) / participantWithLocation.length
    };

    // 步骤3:搜索中心点周边的优质汇合点候选
    const candidateResult = await mcpClient.callTool('placeSearchNearby', {
      keyword: '商场|商圈|地铁站|景区入口',
      location: centerPoint,
      radius: 5000,
      page_size: 5,
      orderby: '_distance'
    });
    const meetingCandidates = candidateResult.data;

    // 步骤4:计算每个候选汇合点的综合得分
    const candidateWithScore = [];
    for (const candidate of meetingCandidates) {
      // 计算所有参与者到该候选点的距离与耗时
      const distanceMatrixResult = await mcpClient.callTool('distanceMatrix', {
        froms: participantWithLocation.map(p => `${p.location.lat},${p.location.lng}`).join(';'),
        to: `${candidate.location.lat},${candidate.location.lng}`,
        mode: participantWithLocation[0].travelMode
      });

      const durationList = distanceMatrixResult.result.rows.map(row => row.elements[0].duration);
      const maxDuration = Math.max(...durationList);
      const totalDuration = durationList.reduce((sum, d) => sum + d, 0);
      const avgDuration = totalDuration / durationList.length;

      // 检查是否超出参与者的最大可接受时长
      const isDurationValid = participantWithLocation.every((p, index) => {
        return !p.maxAcceptableDuration || durationList[index] <= p.maxAcceptableDuration;
      });

      // 综合得分计算:最大耗时权重60%,平均耗时权重40%,耗时越短得分越高
      const score = isDurationValid 
        ? 100 - (maxDuration / 60) * 0.6 - (avgDuration / 60) * 0.4
        : 0;

      candidateWithScore.push({
        candidate,
        participantDurations: durationList.map((duration, index) => ({
          participant: participantWithLocation[index].name,
          duration,
          distance: distanceMatrixResult.result.rows[index].elements[0].distance
        })),
        maxDuration,
        avgDuration,
        totalDuration,
        score,
        isDurationValid
      });
    }

    // 步骤5:按得分排序,筛选有效方案
    const validCandidates = candidateWithScore.filter(item => item.isDurationValid);
    validCandidates.sort((a, b) => b.score - a.score);

    await mcpClient.disconnect();
    return {
      optimalMeetingPoint: validCandidates[0],
      alternativePoints: validCandidates.slice(1),
      participantWithLocation
    };

  } catch (error) {
    await mcpClient.disconnect();
    console.error('汇合点计算失败:', error);
    throw error;
  }
}

// 调用示例
(async () => {
  const result = await calculateOptimalMeetingPoint([
    { name: '用户A', address: '济南市章丘区', travelMode: 'driving', maxAcceptableDuration: 3600 },
    { name: '用户B', address: '济南市历下区泉城广场', travelMode: 'driving', maxAcceptableDuration: 1800 },
    { name: '用户C', address: '济南市市中区万达广场', travelMode: 'driving', maxAcceptableDuration: 1800 }
  ]);
  console.log('最优汇合点:', result.optimalMeetingPoint);
})();

5.4 3D 地图可视化渲染实现

基于腾讯地图 JavaScript API GL,实现行程路线、POI 点位、汇合点的 3D 可视化渲染,以下代码可直接复制到 HTML 文件中运行,无需额外开发:

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>
  <!-- 引入腾讯地图GL API -->
  <script src="https://map.qq.com/api/gljs?v=1.exp&key=你的腾讯位置服务Key&libraries=service,geometry"></script>
  <style>
    * {
      margin: 0;
      padding: 0;
      box-sizing: border-box;
    }
    html, body {
      height: 100%;
      width: 100%;
    }
    #mapContainer {
      width: 100%;
      height: 100%;
    }
    .info-panel {
      position: fixed;
      top: 20px;
      left: 20px;
      width: 320px;
      background: rgba(255, 255, 255, 0.95);
      border-radius: 12px;
      padding: 16px;
      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
      font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
      z-index: 1000;
    }
    .info-panel h3 {
      font-size: 18px;
      color: #1f2937;
      margin-bottom: 12px;
    }
    .info-item {
      font-size: 14px;
      color: #4b5563;
      margin-bottom: 8px;
      line-height: 1.5;
    }
  </style>
</head>
<body>
  <div id="mapContainer"></div>
  <div class="info-panel">
    <h3>济南3天亲子游行程</h3>
    <div class="info-item">总里程:128公里</div>
    <div class="info-item">预计总耗时:2小时40分钟</div>
    <div class="info-item">景点数量:12个</div>
  </div>

  <script>
    // 地图初始化函数
    function initTravelMap() {
      // 地图中心点:济南
      const mapCenter = new TMap.LatLng(36.6512, 117.1200);
      
      // 初始化3D地图实例
      const map = new TMap.Map('mapContainer', {
        center: mapCenter,
        zoom: 12,
        pitch: 45, // 3D倾斜角度,增强立体感
        rotation: 0,
        mapStyleId: 'style1', // 官方精美地图样式
        viewMode: '3D' // 开启3D视图模式
      });

      // 1. 景点点位标记图层
      const attractionMarker = new TMap.MultiMarker({
        map: map,
        styles: {
          attraction: new TMap.MarkerStyle({
            width: 32,
            height: 40,
            anchor: { x: 16, y: 40 },
            src: 'https://mapapi.qq.com/web/lbs/javascriptGL/demo/img/marker-blue.png'
          })
        },
        geometries: [
          {
            id: 'spot-1',
            styleId: 'attraction',
            position: new TMap.LatLng(36.6510, 117.0210),
            properties: { name: '趵突泉景区', type: '5A景区' }
          },
          {
            id: 'spot-2',
            styleId: 'attraction',
            position: new TMap.LatLng(36.6490, 117.0300),
            properties: { name: '五龙潭公园', type: '城市公园' }
          },
          {
            id: 'spot-3',
            styleId: 'attraction',
            position: new TMap.LatLng(36.6650, 117.0200),
            properties: { name: '大明湖景区', type: '5A景区' }
          }
        ]
      });

      // 2. 行程路线绘制图层
      const routePolyline = new TMap.MultiPolyline({
        map: map,
        styles: {
          travelRoute: new TMap.PolylineStyle({
            width: 8,
            color: '#3B82F6',
            borderWidth: 2,
            borderColor: '#FFFFFF',
            lineCap: 'round',
            lineJoin: 'round',
            showArrow: true, // 显示路线方向箭头
            arrowOptions: {
              spacing: 50,
              width: 12
            }
          })
        },
        geometries: [
          {
            id: 'route-day1',
            styleId: 'travelRoute',
            paths: [
              new TMap.LatLng(36.6510, 117.0210),
              new TMap.LatLng(36.6490, 117.0300),
              new TMap.LatLng(36.6650, 117.0200)
            ],
            properties: { day: '第一天', distance: '3.2公里', duration: '10分钟' }
          }
        ]
      });

      // 3. 信息窗口绑定
      const infoWindow = new TMap.InfoWindow({
        map: map,
        offset: { x: 0, y: -50 }
      });

      // 点击标记点显示信息窗口
      attractionMarker.on('click', (evt) => {
        const marker = evt.geometry;
        infoWindow.setPosition(marker.position);
        infoWindow.setContent(`
          <div style="padding: 12px; min-width: 200px;">
            <h4 style="margin: 0 0 8px; font-size: 16px; color: #1f2937;">${marker.properties.name}</h4>
            <p style="margin: 0; font-size: 14px; color: #6b7280;">类型:${marker.properties.type}</p>
          </div>
        `);
        infoWindow.open();
      });
    }

    // 页面加载完成后初始化地图
    window.onload = initTravelMap;
  </script>
</body>
</html>

六、创新价值与行业落地展望

6.1 项目核心创新价值

本项目基于腾讯位置服务的 AI 原生能力,实现了四大维度的创新突破,彻底解决了传统地图服务的核心痛点:

  1. 交互创新:实现了全自然语言驱动的地图能力调用,用户无需学习任何地图操作,一句话即可完成复杂需求的全流程处理,将地图服务的使用门槛降至零;
  2. 架构创新:基于 MCP 协议与 Agent 架构,打造了「感知 - 决策 - 执行 - 反馈」的完整智能闭环,让地图从被动执行的工具升级为主动决策的智能大脑;
  3. 场景创新:打通了行程规划、多人出行、商业选址等高频场景的全链路能力,实现了地图服务从「单点功能」到「全场景解决方案」的升级;
  4. 生态创新:提供了开箱即用的提示词工程与代码框架,零基础开发者可快速落地,高阶开发者可深度定制,极大降低了 AI + 地图的创新开发门槛,助力开发者生态繁荣。

6.2 行业落地场景展望

本项目的技术方案可快速拓展至多个行业场景,具备极高的商业落地价值:

  1. C 端出行场景:可集成至出行 APP、微信小程序,为用户提供智能行程规划、结伴出行汇合决策、个性化本地生活推荐等服务;
  2. 文旅行业场景:可为景区、文旅平台打造智能导览系统,实现自然语言导览、个性化游览路线规划、AR 实景导航等功能;
  3. 本地生活场景:可为餐饮、零售品牌提供智能选址系统,基于腾讯位置大数据与 AI 能力,实现精准的门店选址与客流分析;
  4. 物流行业场景:可为物流、同城配送平台打造智能调度系统,基于实时路况与多维度数据,实现最优配送路线规划与多订单智能合并;
  5. 企业服务场景:可为企业外勤、销售团队打造智能行程管理系统,实现多网点拜访路线智能规划、客户位置智能管理、外勤效率分析等功能。

七、总结

AI 技术与地图服务的深度融合,正在开启位置服务的全新时代。传统地图的核心价值是「告诉用户在哪里、怎么去」,而 AI 时代的地图,核心价值是「告诉用户应该去哪里、怎么做最优决策」。

本文基于腾讯位置服务的 MCP Server、Map Skills 等 AI 原生能力,打造的空间智能大脑,真正实现了地图从「导航工具」到「空间智能大脑」的本质跃迁。通过标准化的 MCP 协议,我们彻底打通了大模型与地图服务的能力壁垒;通过开箱即用的提示词工程,我们将地图服务的开发门槛降至最低;通过完整的全链路实战开发,我们验证了 AI + 地图在多个场景的创新落地可能。

感谢腾讯位置服务与 CSDN 提供的创新舞台,也希望本文的方案能为广大开发者提供参考,一起探索 AI + 地图的无限可能,共同推动位置服务行业的智能化升级。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐