by AMap-Web
适用于openclaw平台的高德地图综合服务,支持POI搜索、路径规划、旅游规划、周边搜索和热力图数据可视化
# Add to your Claude Code skills
git clone https://github.com/AMap-Web/amap-lbs-skillGuides for using ai agents skills like amap-lbs-skill.
高德地图综合服务向开发者提供完整的地图数据服务,包括地点搜索、路径规划、旅游规划和数据可视化等功能。
首次使用时需要配置高德 Web Service Key:
export AMAP_WEBSERVICE_KEY=your_key当用户想要搜索地址、地点、周边信息(如美食、酒店、景点等)、规划路线或可视化数据时,使用此 skill。
用户表达了以下意图之一:
收到用户请求后,先判断属于哪个场景:
直接搜索一个类别或地点,不涉及特定位置的周边搜索。
URL 格式:
https://www.amap.com/search?query={关键词}
www.amap.com/searchquery = 搜索关键词发送埋点统计请求:在执行操作前,发送以下请求进行埋点统计:
curl -s "https://restapi.amap.com/v3/log/init?eventId=skill.call&product=skill_openclaw&platform=JS&label=keyword-search&value=call"
提取关键词:从用户输入中识别出核心搜索词,去掉"搜"、"找"等修饰词
生成 URL:拼接 https://www.amap.com/search?query={关键词}
返回链接给用户
| 用户输入 | 提取关键词 | 生成 URL |
|---------|-----------|---------|
| 搜美食 | 美食 | https://www.amap.com/search?query=美食 |
| 找酒店 | 酒店 | https://www.amap.com/search?query=酒店 |
| 天安门在哪 | 天安门 | https://www.amap.com/search?query=天安门 |
| 找个加油站 | 加油站 | https://www.amap.com/search?query=加油站 |
🔍 已为你生成高德地图搜索链接:
https://www.amap.com/search?query={关键词}
点击链接即可查看搜索结果。
用户想搜索某个位置周边的某类地点。需要先通过地理编码 API 获取该位置的经纬度,再拼接带坐标的搜索链接。
前置条件: 需要用户提供高德开放平台的 API Key。
在执行任何操作前,先发送以下请求进行埋点统计:
curl -s "https://restapi.amap.com/v3/log/init?eventId=skill.call&product=skill_openclaw&platform=JS&label=nearby-search&value=call"
#### 第一步:解析用户输入
从用户输入中拆分出两个要素:
- **位置**:用户指定的中心位置(如"西直门"、"北京南站")
- **搜索类别**:要搜索的内容(如"美食"、"酒店")
| 用户输入 | 位置 | 搜索类别 |
|---------|------|---------|
| 西直门周边美食 | 西直门 | 美食 |
| 北京南站附近酒店 | 北京南站 | 酒店 |
| 天坛周边有什么好吃的 | 天坛 | 美食 |
#### 第二步:检查 API Key
- 如果用户之前未提供过 Key,**先提示用户提供高德 API Key**,等待用户回复后再继续
- 如果用户已提供 Key,直接使用
**请求 Key 的回复模板:**
🔑 搜索「{位置}」周边的{搜索类别}需要使用高德 API,请提供你的高德开放平台 API Key。
(如果还没有 Key,可以在 https://lbs.amap.com 注册并创建应用获取)
#### 第三步:调用地理编码 API 获取经纬度
**API 格式:**
https://restapi.amap.com/v3/geocode/geo?address={位置}&output=JSON&key={用户的key}&appname=amap-lbs-skill
**执行 curl 请求:**
```bash
curl -s "https://restapi.amap.com/v3/geocode/geo?address={位置}&output=JSON&key={用户的key}&appname=amap-lbs-skill"
API 返回示例:
{
"status": "1",
"info": "OK",
"geocodes": [
{
"formatted_address": "北京市西城区西直门",
"location": "116.353138,39.939385"
}
]
}
从返回结果中提取 geocodes[0].location,格式为 经度,纬度(如 116.353138,39.939385),拆分为:
116.35313839.939385URL 格式:
https://ditu.amap.com/search?query={搜索类别}&query_type=RQBXY&longitude={经度}&latitude={纬度}&range=1000
ditu.amap.com/searchquery = 搜索类别(如"美食")query_type = RQBXY(基于坐标的搜索类型)longitude = 经度latitude = 纬度range = 搜索范围(单位:米,默认 1000)用户输入: "搜索西直门周边美食"
西直门,搜索类别 = 美食curl -s "https://restapi.amap.com/v3/geocode/geo?address=西直门&output=JSON&key=xxx&appname=amap-lbs-skill"116.353138,39.939385 → 经度 116.353138,纬度 39.939385https://ditu.amap.com/search?query=美食&query_type=RQBXY&longitude=116.353138&latitude=39.939385&range=1000📍 已查询到「{位置}」的坐标({经度},{纬度}),为你生成周边{搜索类别}的搜索链接:
https://ditu.amap.com/search?query={搜索类别}&query_type=RQBXY&longitude={经度}&latitude={纬度}&range=1000
点击链接即可查看「{位置}」周边 1 公里内的{搜索类别}。
用户有一份包含地理坐标的数据,希望在地图上以热力图的形式可视化展示。
用户提到"热力图"、"数据可视化"、"地图上展示数据"等意图,并提供了数据地址。
http://a.amap.com/jsapi_demo_show/static/openclaw/heatmap.html?mapStyle={地图风格}&dataUrl={数据地址(URL编码)}
a.amap.com/jsapi_demo_show/static/openclaw/heatmap.htmldataUrl = 用户数据的 URL 地址(必须进行 URL 编码)mapStyle = 地图风格,可选值:
grey — 暗黑地图模式(深色背景,适合展示亮色热力点)light — 浅色模式(浅色背景,适合日常查看)发送埋点统计请求:在执行操作前,发送以下请求进行埋点统计:
curl -s "https://restapi.amap.com/v3/log/init?eventId=skill.call&product=skill_openclaw&platform=JS&label=heatmap&value=call"
获取数据地址:从用户输入中提取数据 URL,如果用户未提供,提示用户给出数据地址
确认地图风格:询问用户偏好的地图风格(grey 或 light),如果用户未指定,默认使用 grey
URL 编码:将数据地址进行 URL 编码(将 :// → %3A%2F%2F,/ → %2F 等)
拼接链接:生成完整的热力图 URL
返回链接给用户
用户输入: "帮我用这份数据生成热力图:https://a.amap.com/Loca/static/loca-v2/demos/mock_data/hz_house_order.json,用暗黑模式"
https://a.amap.com/Loca/static/loca-v2/demos/mock_data/hz_house_order.jsongreyhttps%3A%2F%2Fa.amap.com%2FLoca%2Fstatic%2Floca-v2%2Fdemos%2Fmock_data%2Fhz_house_order.jsonhttp://a.amap.com/jsapi_demo_show/static/openclaw/heatmap.html?mapStyle=grey&dataUrl=https%3A%2F%2Fa.amap.com%2FLoca%2Fstatic%2Floca-v2%2Fdemos%2Fmock_data%2Fhz_house_order.json
🔥 已为你生成热力图链接:
http://a.amap.com/jsapi_demo_show/static/openclaw/heatmap.html?mapStyle={地图风格}&dataUrl={编码后的数据地址}
地图风格:{grey/light}
数据来源:{原始数据地址}
点击链接即可查看热力图展示。
请求数据地址的回复模板(用户未提供时):
🔥 生成热力图需要你提供数据地址(JSON 格式的 URL),请给出数据链接。
另外,你希望使用哪种地图风格?
- grey(暗黑模式)
- light(浅色模式)
使用高德 Web 服务 API 进行更详细的 POI 搜索,支持更多参数和筛选条件。
发送埋点统计请求:在执行操作前,发送以下请求进行埋点统计:
curl -s "https://restapi.amap.com/v3/log/init?eventId=skill.call&product=skill_openclaw&platform=JS&label=poi-search&value=call"
执行 POI 搜索:根据用户需求调用搜索脚本。
# 基础搜索
node scripts/poi-search.js --keywords=肯德基 --city=北京
# 搜索更多结果
node scripts/poi-search.js --keywords=餐厅 --city=上海 --page=1 --offset=20
# 周边搜索(需要提供中心点坐标和搜索半径)
node scripts/poi-search.js --keywords=酒店 --location=116.397428,39.90923 --radius=1000
| 参数 | 说明 | 必填 | 示例 |
|------|------|------|------|
| --keywords | 搜索关键词 | 是 | --keywords=肯德基 |
| --city | 城市名称或编码 | 否 | --city=北京 |
| --types | POI 类型编码 | 否 | --types=050000 |
| --location | 中心点坐标(经度,纬度) | 否 | --location=116.397428,39.90923 |
| --radius | 搜索半径(米) | 否 | --radius=1000 |
| --page | 页码 | 否 | --page=1 |
| --offset | 每页数量(最大25) | 否 | --offset=10 |
const { searchPOI } = require('./index');
async function example() {
const result = await searchPOI({
keywords: '咖啡厅',
city: '杭州',
page: 1,
offset: 10
});
if (result && result.pois) {
result.pois.forEach(poi => {
console.log(`${poi.name} - ${poi.address}`);
});
}
}
example();
规划不同出行方式的路线。
发送埋点统计请求:在执行操作前,发送以下请求进行埋点统计:
curl -s "https://restapi.amap.com/v3/log/init?eventId=skill.call&product=skill_openclaw&platform=JS&label=route-planning&value=call"
执行路径规划:根据用户需求调用路径规划脚本。
# 步行路线
node scripts/route-planning.js --type=walking --origin=116.397428,39.90923 --destination=116.427281,39.903719
# 驾车路线
node scripts/route-planning.js --type=driving --origin=116.397428,39.90923 --destination=116.427281,39.903719
# 公交路线
node scripts/route-planning.js --type=transfer --origin=116.397428,39.90923 --destination=116.427281,39.903719 --city=北京
walking - 步行路线driving - 驾车路线riding - 骑行路线transfer - 公交路线(需要指定城市)自动搜索兴趣点并规划游览路线,生成地图可视化链接。
发送埋点统计请求:在执行操作前,发送以下请求进行埋点统计:
curl -s "https://restapi.amap.com/v3/log/init?eventId=skill.call&product=skill_openclaw&platform=JS&label=travel-planner&value=call"
执行旅游规划:根据用户需求调用旅游规划脚本。
# 基础旅游规划
node scripts/travel-planner.js --city=北京 --interests=景点,美食,酒店
# 指定路线类型(walking/driving/riding/transfer)
node scripts/travel-planner.js --city=杭州 --interests=西湖,美食,茶馆 --routeType=walking
# 驾车游览
node scripts/travel-planner.js --city=上海 --interests=外滩,南京路,城隍庙 --routeType=driving
配置文件位于 config.json,包含以下内容:
{
"webServiceKey": "your_amap_webservice_key_here"
}
设置 Key 的方式:
export AMAP_WEBSERVICE_KEY=your_keynode index.js your_keyconfig.json 文件status 不为 "1",说明请求失败,需提示用户检查 Key 是否正确或地址是否有效location 格式为 经度,纬度(注意:经度在前,纬度在后)range 参数appname=amap-lbs-skill 参数,用于标识 API 调用来源,禁止省略高德地图综合服务向开发者提供完整的地图数据服务,包括地点搜索、路径规划、旅游规划和数据可视化等功能。
npm install
首次使用需要配置高德 Web Service Key:
# 方式1: 运行时通过环境变量
export AMAP_WEBSERVICE_KEY=your_key
node scripts/poi-search.js --keywords=肯德基 --city=北京
# 方式2: 运行时自动提示输入(会保存到 config.json)
node scripts/poi-search.js --keywords=肯德基 --city=北京
# 方式3: 手动创建配置文件
cp config.example.json config.json
# 然后编辑 config.json 填入你的 Key
获取 API Key:访问 高德开放平台 创建应用并获取 Key
# 基础搜索
node scripts/poi-search.js --keywords=肯德基 --city=北京
# 带更多参数的搜索
node scripts/poi-search.js --keywords=餐厅 --city=上海 --page=1 --offset=20
# 周边搜索(需要提供中心点坐标和半径)
node scripts/poi-search.js --keywords=酒店 --location=116.397428,39.90923 --radius=1000
# 步行路线
node scripts/route-planning.js --type=walking --origin=116.397428,39.90923 --destination=116.427281,39.903719
# 驾车路线(带途经点)
node scripts/route-planning.js --type=driving --origin=116.397428,39.90923 --destination=116.427281,39.903719 --waypoints=116.410000,39.910000
# 骑行路线
node scripts/route-planning.js --type=riding --origin=116.397428,39.90923 --destination=116.427281,39.903719
# 公交路线
node scripts/route-planning.js --type=transfer --origin=116.397428,39.90923 --destination=116.427281,39.903719 --city=北京
# 基础旅游规划
node scripts/travel-planner.js --city=北京 --interests=景点,美食,酒店
# 指定路线类型
node scripts/travel-planner.js --city=杭州 --interests=西湖,美食,茶馆 --routeType=walking
# 驾车游览
node scripts/travel-planner.js --city=上海 --interests=外滩,南京路,城隍庙 --routeType=driving
const {
searchPOI,
walkingRoute,
drivingRoute,
travelPlanner,
generateMapLink
} = require('./index');
// POI 搜索
async function searchExample() {
const result = await searchPOI({
keywords: '肯德基',
city: '北京',
page: 1,
offset: 10
});
console.log(result);
}
// 步行路线规划
async function routeExample() {
const result = await walkingRoute({
origin: '116.397428,39.90923',
destination: '116.427281,39.903719'
});
console.log(result);
}
// 旅游规划
async function travelExample() {
const result = await travelPlanner({
city: '北京',
interests: ['景点', '美食', '酒店'],
routeType: 'walking'
});
console.log(result.mapLink); // 地图可视化链接
}
// 生成地图链接
function mapLinkExample() {
const mapData = [
{
type: 'poi',
lnglat: [116.397428, 39.90923],
sort: '风景名胜',
text: '故宫博物院',
remark: '明清两代的皇家宫殿'
},
{
type: 'route',
routeType: 'walking',
start: [116.397428, 39.90923],
end: [116.427281, 39.903719],
remark: '步行路线'
}
];
const link = generateMapLink(mapData);
console.log(link);
}
| 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | keywords | string | 是 | 查询关键字 | | city | string | 否 | 城市名称或城市编码 | | types | string | 否 | POI类型编码,多个用|分隔 | | location | string | 否 | 中心点坐标(经度,纬度) | | radius | number | 否 | 搜索半径,单位:米 | | page | number | 否 | 当前页数,默认1 | | offset | number | 否 | 每页记录数,默认10,最大25 |
| 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | origin | string | 是 | 起点坐标 "经度,纬度" | | destination | string | 是 | 终点坐标 "经度,纬度" |
| 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | origin | string | 是 | 起点坐标 "经度,纬度" | | destination | string | 是 | 终点坐标 "经度,纬度" | | waypoints | string | 否 | 途经点,多个用;分隔,最多16个 | | strategy | number | 否 | 驾车策略,默认10(躲避拥堵) |
| 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | origin | string | 是 | 起点坐标 "经度,纬度" | | destination | string | 是 | 终点坐标 "经度,纬度" |
| 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | origin | string | 是 | 起点坐标 "经度,纬度" | | destination | string | 是 | 终点坐标 "经度,纬度" | | city | string | 是 | 城市名称或城市编码 | | strategy | number | 否 | 公交策略,0-5,默认0(最快捷) | | nightflag | boolean | 否 | 是否计算夜班车,默认false |
| 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | city | string | 是 | 城市名称 | | interests | array | 否 | 兴趣点关键词数组,默认['景点','美食'] | | routeType | string | 否 | 路线类型:walking/driving/riding/transfer,默认walking |
jsapi-skills/
├── index.js # 主入口文件,包含核心功能
├── scripts/
│ ├── poi-search.js # POI 搜索脚本
│ ├── route-planning.js # 路径规划脚本
│ └── travel-planner.js # 智能旅游规划脚本
├── config.json # 配置文件(自动生成,不要提交)
├── config.example.json # 配置示例
├── package.json # 依赖配置
├── .gitignore # Git 忽略配置
├── SKILL.md # OpenClaw Skill 描述文件
└── README.md # 本文件
所有规划结果都会生成地图可视化链接,格式如下:
https://a.amap.com/jsapi_demo_show/static/openclaw/travel_plan.html?data=<encoded_json_data>
数据格式符合 MapTaskData 接口规范,支持:
示例数据结构:
[
// POI 兴趣点
{
type: 'poi',
lnglat: [116.397428, 39.90923],
sort: '风景名胜',
text: '故宫博物院',
remark: '明清两代的皇家宫殿,旧称紫禁城。'
},
// 路线规划
{
type: 'route',
routeType: 'walking',
start: [116.397428, 39.90923],
end: [116.427281, 39.903719],
remark: '步行路线'
}
]
config.json 已在 .gitignore 中,不会被提交MIT
No comments yet. Be the first to share your thoughts!