将 Kaleidr Chat 连接到 MapLibre 地图
完成本指南后,网页将展示 MapLibre GL JS 地图以及嵌入地图的聊天面板。访客提问时,回答会逐步显示在面板中,其中的地点作为标记出现在 MapLibre 地图上,相机也会移动以展示这些位置。所有套餐(包括 Free)都支持,只需要可公开使用的密钥。提问会消耗组织的 AI 点数。
面板沿用地图当前的样式,不会更改样式或瓦片数据源。
开始之前
- 从 kaleidr.com/api-keys 获取包含
ai权限的 Kaleidr 可公开使用的密钥(kld_pk_live_…)。参阅获取 API 密钥。 - 如果密钥限制来源,网页来源必须在允许列表中;本地开发可添加
http://localhost:8080。 - MapLibre 样式 URL。示例使用 MapLibre 公开演示样式;生产环境应使用自己的样式。
- 通过 script 加载 MapLibre GL JS,保证存在
window.maplibregl。从 npm 导入时,请参阅将库公开为全局对象。 - HTTP 服务器,例如
npx serve或python -m http.server 8080。不能直接从磁盘打开文件。 - 如果网站设置了内容安全策略,请允许内容安全策略中列出的主机。
第 1 步:布置地图和聊天层
将地图和聊天挂载目标放在同一个定位容器中。聊天层覆盖在地图上方,但允许指针事件穿透。
<div id="mapHost" style="position:relative; height:520px">
<div id="map" style="position:absolute; inset:0; z-index:0"></div>
<div id="chat" style="position:absolute; inset:0; z-index:1; pointer-events:none"></div>
</div>
**预期结果:**此时还没有地图,只显示一个高度为 520 px 的空白块。主题与布局解释了各项声明的作用。
第 2 步:加载 MapLibre GL JS 并创建地图
在网页 head 中加载样式表,并在自己的代码前加载脚本。两个 URL 必须指向相同版本。
<link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.17.0/dist/maplibre-gl.css" />
<script src="https://unpkg.com/maplibre-gl@5.17.0/dist/maplibre-gl.js"></script>
<script>
const map = new maplibregl.Map({
container: 'map',
style: 'https://demotiles.maplibre.org/style.json', // your own style here
center: [-0.12, 51.5],
zoom: 11,
});
</script>
**预期结果:**地图可以拖动和缩放。演示样式只是城市细节较少的简化国家地图,但地点标记和相机移动仍会正常工作。
第 3 步:加载 kaleidr.js
在 MapLibre 脚本之后、挂载聊天面板的代码之前加入 Kaleidr 加载器。
<script src="https://cdn.kaleidr.com/embed/v1/kaleidr.js"></script>
**预期结果:**网页不会发生明显变化。在控制台中,Kaleidr.version 会返回版本字符串。
第 4 步:挂载聊天面板
传入密钥和实际运行的地图对象。
const handle = Kaleidr.mount('#chat', {
product: 'chat',
publishableKey: 'kld_pk_live_…',
map,
contained: true,
});
无需等待地图的 load 事件。Kaleidr.mount 会立即返回;聊天程序包加载完成且密钥交换为会话后,面板就会出现。
**预期结果:**地图左上角出现写有“Ask Kaleidr”的输入栏。
完整页面
将文件保存为 index.html,替换密钥并通过 HTTP 提供文件夹。
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Kaleidr Chat on MapLibre</title>
<link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.17.0/dist/maplibre-gl.css" />
<style>
body { margin: 0; font-family: system-ui, sans-serif; }
#mapHost { position: relative; height: 100vh; }
#map { position: absolute; inset: 0; z-index: 0; }
#chat { position: absolute; inset: 0; z-index: 1; pointer-events: none; }
</style>
</head>
<body>
<div id="mapHost">
<div id="map"></div>
<div id="chat"></div>
</div>
<script src="https://unpkg.com/maplibre-gl@5.17.0/dist/maplibre-gl.js"></script>
<script src="https://cdn.kaleidr.com/embed/v1/kaleidr.js"></script>
<script>
const map = new maplibregl.Map({
container: 'map',
style: 'https://demotiles.maplibre.org/style.json',
center: [-0.12, 51.5],
zoom: 11,
});
const handle = Kaleidr.mount('#chat', {
product: 'chat',
publishableKey: 'kld_pk_live_…',
map,
contained: true,
});
</script>
</body>
</html>
工作原理
| 访客操作 | 聊天面板 | MapLibre 地图 |
|---|---|---|
| 提交问题 | 展开聊天窗口,逐步显示回答文本。 | 暂无变化。 |
| 等待回答 | 为回答中的每个地点显示一张结果卡片。 | 每找到一个地点就显示标记。只有一个地点时,相机飞向该位置;多个地点时,调整视野并留出空间避开聊天面板。 |
| 点击标记或结果 | 打开包含概况、照片和路线工具的地点卡片。 | 点击结果将相机移动到该地点。 |
| 请求路线 | 显示路线距离和耗时。 | 绘制并框选路线。 |
| 继续提问 | 在同一对话中追加消息。 | 新标记被添加,旧标记保留。 |
| 关闭聊天 | 恢复到输入栏并结束对话。 | 删除标记和路线。 |
MapLibre GL JS 的具体行为:
- 标记使用包含 HTML 元素的 MapLibre
Marker对象,与您自行添加的标记相互独立。 - 路线使用面板向样式添加的 source 和 layer 绘制,之后会被移除。您自己的数据源和图层不会被更改。
- 面板挂载期间会在后台续期会话,您无需管理令牌。