高德地图+Coze=?AI导游带你解锁隐藏玩法

前言

前段时间了解到 mapbox 出了一个车机端的 MapGPT,可以做到智能的路线规划等一系列功能。我发现目前还没有人把AI和旅游很好的结合在一起。于是我打算用我们国产软件去做一个简单的 AI导游案例,希望能给各位带来启发。

选型

一、AI
AI方面我选择了可以预定义人设的 Coze,给他一个AI导游、充当后台服务的角色,人设如下。

图片

这样我们就得到了一个可以返回标准 json 的 AI。

图片

将此 AI 发布到Bot as API 和Web SDK,以便可以在前端调用。

二、地图

地图当然选择了高德地图,高德地图提供的 Loca API 可以华丽的实现各种可视化效果,其中就包括我们需要的镜头动画。

案例地址:

https://lbs.amap.com/demo/loca-v2/demos/cat-view-control/view-control

图片


实现

一、Coze API

这个项目技术上不存在什么难点,重点在于对现有技术的整合利用,打造出一个有用的产品。话不多说,直接进入编码阶段。

首先我们使用常规的 axios 快速将 coze 提供的接口封装一个函数。

import axios from "axios";
import autolog from 'autolog.js';
​
​
const service = axios.create({
  baseURL: "https://api.coze.cn/open_api/v2",
  timeout: 60000,
  headers: {
    "Content-Type": "application/json",
    'Authorization': `Bearer ${import.meta.env.VITE_COZE_TOKEN}`
  },
});
service.interceptors.request.use(
  (config) => {
    return config;
  },
  (error) => {
    autolog.log('请求错误', 'error');
    return Promise.reject(error);
  }
);
const getAnswer = async (question: string) => {
  const res = await service.post("/chat", {
    query: question,
    user: "githubPages",
    bot_id: "7413640476366602275",
    stream: false
  });
  return res.data;
}
export default getAnswer;

这里我使用的是 coze v2 版本,参数比较简单,便于大家理解,bot_id 即 coze 机器人主页 url 的最后一串数字,大家也可以在 Coze 商店直接体验我的机器人。

地址:

https://www.coze.cn/store/agent/7413634674695815209?panel=1&bid=6dole50k44g0a

虽然此 bot 没有使用高德接口额外扩展,但是经过实测发现,它本身给的经纬度也是非常准确的。调用此接口,我们将得到如下回复:

图片

content 里就是我们给它预设的回复内容,使用 JSON.parse 即可得到我们想要的内容。

二、高德地图 Loca 镜头动画

高德为可视化专门提供了另一套API服务,即 Loca。我这里使用的是 Loca 2.0。安装并引入 @amap/amap-jsapi-loader

  AMap = await AMapLoader.load({
    key: import.meta.env.VITE_AMAP_KEY, // 申请好的Web端开发者Key,首次调用 load 时必填
    version: "2.0", // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15
    plugins: ["AMap.GeoJSON"], //需要使用的的插件列表,如比例尺'AMap.Scale',支持添加多个如:['...','...']
    Loca: {                // 是否加载 Loca, 缺省不加载
      "version": '2.0.0'  // Loca 版本,缺省 1.3.2
    },
  })

注意这里需要手动将 Loca 在初始化地图时就加上,不然会获取不到该变量。地图加载完成后,我们需要初始化 Loca。

async function initLoca() {
  // @ts-ignore
  loca = new Loca.Container({
    map,
  })
  console.log('loca::: ', loca);
}

由于 Loca 是高德直接注入的,所以这里TS并不会识别,只好先忽略一下。按照官网案例,我们可以很轻松的让镜头动画跑起来。

function animate() {
  let end = endPoint.value
  var speed = 1;
  // 镜头动画
​
  loca.viewControl.addAnimates(
    [{
      pitch: {
        value: 0,
        control: [[0, 20], [1, 0]],
        timing: [0, 0, 0.8, 1],
        duration: 3000 / speed,
      },
    }]
    , function () {
​
      loca.viewControl.addAnimates([
        // 寻迹
        {
          zoom: {
            value: 16,
            control: [[map.getZoom(), 3], [map.getZoom(), 15]],
            timing: [0.3, 0, 0.9, 1],
            duration: 5000 / speed,
          },
          center: {
            value: map.getCenter(),
            control: [map.getCenter(), end],
            timing: [0.3, 0, 0.1, 1],
            duration: 8000 / speed,
          },
        }, {
          // 环绕
          pitch: {
            value: 50,
            control: [[0, 40], [1, 50]],
            timing: [0.3, 0, 1, 1],
            duration: 7000 / speed,
          },
          rotation: {
            value: 260,
            control: [[0, -80], [1, 260]],
            timing: [0, 0, 0.7, 1],
            duration: 7000 / speed,
          },
          zoom: {
            value: 17,
            control: [[0.3, 16], [1, 17]],
            timing: [0.3, 0, 0.9, 1],
            duration: 5000 / speed,
          },
        },
      ],
        function () {
          setTimeout(animate, 2000);
          console.log('结束');
        });
    });
}

oca.viewControl.addAnimates 的参数也很好理解,分别有:pitch、rotation、zoom等,他们的内部参数则都有:value、control、timing、duration,分别是:动画终点的值、过渡中的轨迹控制点、动画时间控制点、总持续时间。

通过调整以上参数,我们可以实现几乎所有角度的动画展示。上面的动画表达的是:先晃动一下视角(我们要出发了),视角先拉升再放大,从当前位置飞到终点,再终点环绕展示,最后动画结束,2秒后再次执行。

原谅我不懂镜头语言,但凑合着我们可以感受到飞来飞去的视觉效果了。

三、结合一下

首先获取到 Coze 的回答:

async function getAnswerFromCoze() {
  if (!question.value) {
    return
  }
  loading.value = true
  conversations.value.push({
    type: 'question',
    content: question.value
  })
  let question_backup = question.value
  question.value = ''
  conversations.value.push({
    type: 'answer',
    content: "正在为您查找..."
  })
  let res = await getAnswer(question_backup)
  loading.value = false
  let answer = JSON.parse(res.messages[0].content)
  endPoint.value = toNumber(answer.lnglat)
  conversations.value[conversations.value.length - 1].content = answer.description
  loca.animate.start();
  animate()
}

在这个函数中,我们通过一个响应式变量question存储用户的询问字符串(保证同一时间只处理一个),使用conversations存储对话历史,以便待会我们渲染到对话框中,最后,将得到的结果解析后,调动高德地图启动动画。

将两者分配一下画面,Coze作为对话框在左侧,高德作为地图展示铺满全屏。

图片

当我们问询时,首先由扣子查询相关信息。

图片

图片

coze回复的同时,高德地图也动了起来。

四、效果

最终我们就得到了这样的效果。

图片

图片


结语

此项目已在github开源:

https://github.com/LarryZhu-dev/amap_coze_guide

图片

高德开放平台第二期实战案例,三等奖作品

作者:朱永博

仅代表作者个人观点

### SearXNG 和 Coze 的集成与使用 SearXNG 是一款开源搜索引擎前端工具,支持多种后端服务的集成,能够提供去中心化和隐私保护的搜索体验[^1]。而 Coze 则是一个轻量级的知识管理平台,专注于个人数据管理和协作功能[^2]。 #### 一、SearXNG 的基本概念 SearXNG 提供了一个灵活的架构设计,允许开发者通过配置文件轻松实现与其他服务的对接。其核心特性包括多引擎支持、自定义过滤器以及强大的扩展能力[^3]。这些特点使得它成为许多用户构建个性化搜索解决方案的理想选择。 #### 二、Coze 平台概述 Coze 主要用于帮助用户整理并共享笔记、链接和其他形式的信息资源。作为一个注重安全性的应用,Coze 支持加密存储机制,并提供了 RESTful API 接口以便第三方程序调用[^4]。 #### 三、两者之间的潜在联系 尽管目前没有现成文档专门描述如何直接将 SearXNG 和 Coze 结合起来使用,但从技术角度出发可以推测存在可行方案:利用 Coze 所暴露出来的 Web Service 功能作为额外的数据源接入到 searxng 中的一个新 engine 定义里[^5]。 以下是基于假设场景下的 Python 脚本片段展示可能的操作方式: ```python from searx.engines import Engine, categories class CustomEngine(Engine): name = 'coze-integration' category = ['general'] def search(self, query, params): url = f"https://your-coze-instance.com/api/search?q={query}" response = self.http_get(url) results = [] for item in response.json().get('items', []): title = item['title'] content = item['snippet'][:self.config.get('max_content_length')] link = item['link'] results.append({ 'url': link, 'title': title, 'content': content }) return results categories['custom'].append(CustomEngine()) ``` 上述代码仅为示意目的编写而成,在实际部署前需参照具体环境调整参数设置[^6]。 #### 四、参考资料获取途径建议 对于更深入的学习需求,推荐访问以下地址查找最新版本说明及相关社区讨论帖: - **SearXNG GitHub Repository**: https://github.com/searxng/searxng - **Coze Official Website & Documentation**: Referenced through official channels or developer blogs.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值