地图搜索技能:多平台位置发现 - Openclaw Skills

作者:互联网

2026-03-30

AI教程

什么是 地图搜索技能?

地图搜索技能是一项专门的工具,旨在为中国生态系统内的 AI 智能体提供强大的地理智能。通过集成三大地图供应商——高德、百度和腾讯——该技能提供了一种可靠的方式来查询兴趣点 (POI) 数据、地址和地理坐标。对于需要高精度位置数据进行物流、旅行规划或本地服务发现的 Openclaw Skills 用户来说,这是一个必不可少的组件。

该技能提供了回退机制和基于优先级的逻辑,确保如果一个地图服务不可用或缺少数据,智能体可以无缝地从替代供应商获取信息。它处理了不同 API 结构的复杂性,呈现出统一的输出,便于 AI 模型在更广泛的工作流中解析和使用。

下载入口:https://github.com/openclaw/skills/tree/main/skills/shoucangjia1qu/map-search

安装与下载

1. ClawHub CLI

从源直接安装技能的最快方式。

npx clawhub@latest install map-search

2. 手动安装

将技能文件夹复制到以下位置之一

全局模式 ~/.openclaw/skills/ 工作区 /skills/

优先级:工作区 > 本地 > 内置

3. 提示词安装

将此提示词复制到 OpenClaw 即可自动安装。

请帮我使用 Clawhub 安装 map-search。如果尚未安装 Clawhub,请先安装(npm i -g clawhub)。

地图搜索技能 应用场景

  • 在特定城市或区域内搜索企业、餐厅或地标。
  • 查找用户当前基于 IP 的位置附近的酒店或咖啡馆等必要服务。
  • 跨多个地图供应商验证地址和坐标,进行数据校验。
  • 在 AI 驱动的工作空间内自动化基于位置的研究任务。
地图搜索技能 工作原理
  1. 该技能从本地 JSON 配置文件或系统环境变量中加载 API 密钥和供应商优先级。
  2. 触发搜索时,该技能会识别是区域关键字搜索还是基于半径的周边搜索。
  3. 根据用户定义的优先级,向配置的地图 API(高德、百度、腾讯)执行并发或顺序请求。
  4. 对于周边搜索,如果没有提供特定坐标,该技能可以利用基于 IP 的地理定位自动确定起点。
  5. 来自地图供应商的原始 JSON 响应被过滤并归一化为包含名称、地址和位置数据的一致格式。
  6. 聚合后的结果返回给 AI 智能体或显示在 CLI 中供立即使用。

地图搜索技能 配置指南

要使用此地图搜索技能,请确保已安装 Python 3 并遵循以下步骤:

# 安装所需的 Python 库
pip install requests

# 在配置文件中配置您的 API 密钥
mkdir -p ~/.config/openclaw/
cat < ~/.config/openclaw/map_config.json
{
  "amap": { "api_key": "YOUR_AMAP_KEY" },
  "baidu": { "api_key": "YOUR_BAIDU_KEY" },
  "tencent": { "api_key": "YOUR_TENCENT_KEY" },
  "priority": ["amap", "tencent", "baidu"]
}
EOF

# 或者,设置环境变量
export AMAP_API_KEY="YOUR_AMAP_KEY"
export BAIDU_MAP_API_KEY="YOUR_BAIDU_KEY"
export TENCENT_MAP_API_KEY="YOUR_TENCENT_KEY"

地图搜索技能 数据架构与分类体系

该技能按供应商组织结果,并为找到的每个 POI 遵循结构化的分类。Openclaw Skills 用户可以期待以下数据结构:

属性 描述
来源 地图供应商(例如高德、百度、腾讯)
名称 地点或企业的正式名称
地址 完整的格式化物理地址
位置 纬度和经度坐标
距离 距离搜索起点的真实距离(仅限周边模式)
name: map-search
description: 更适合中国体质宝宝的地图搜索工具,支持高德、百度、腾讯地图聚合搜索。
metadata:
  openclaw:
    emoji: "???"
    requires:
      bins: ["python3"]
    env:
      - "AMAP_API_KEY"
      - "BAIDU_MAP_API_KEY"
      - "TENCENT_MAP_API_KEY"

??? Map Search Skill

多地图聚合搜索工具,支持高德、百度、腾讯。

核心代码

#!/usr/bin/env python3
"""地图搜索工具"""

import os
import json
import requests

# ========== 配置路径 ==========
CONFIG_PATH = os.path.expanduser("~/.config/openclaw/map_config.json")


# ========== 读取配置函数 ==========
def get_config():
    """从配置文件读取所有配置(API Keys + 优先级)"""
    if os.path.exists(CONFIG_PATH):
        with open(CONFIG_PATH, 'r') as f:
            config = json.load(f)
            return {
                "api_keys": {
                    "amap": config.get("amap", {}).get("api_key", ""),
                    "baidu": config.get("baidu", {}).get("api_key", ""),
                    "tencent": config.get("tencent", {}).get("api_key", "")
                },
                "priority": config.get("priority", ["amap", "tencent", "baidu"])
            }
    
    # 回退到环境变量
    return {
        "api_keys": {
            "amap": os.getenv("AMAP_API_KEY", ""),
            "baidu": os.getenv("BAIDU_MAP_API_KEY", ""),
            "tencent": os.getenv("TENCENT_MAP_API_KEY", "")
        },
        "priority": ["amap", "tencent", "baidu"]
    }


# ========== 初始化全局变量 ==========
CONFIG = get_config()           # 获取配置
API_KEYS = CONFIG["api_keys"]   # 提取 API Keys
PRIORITY = CONFIG["priority"]   # 提取优先级

AMAP_KEY = API_KEYS["amap"]
BAIDU_KEY = API_KEYS["baidu"]
TENCENT_KEY = API_KEYS["tencent"]


# ========== 核心搜索函数 ==========
def search_maps(keyword, region="全国", priority=None):
    """地图聚合搜索"""
    if priority is None:
        priority = PRIORITY  # 使用配置文件中的优先级
    
    results = {}
    
    # 高德搜索
    if "amap" in priority and AMAP_KEY:
        url = f"https://restapi.amap.com/v3/place/text?key={AMAP_KEY}&keywords={keyword}&city={region}&output=json"
        r = requests.get(url, timeout=5).json()
        if r.get("status") == "1":
            results["高德"] = [{"name": p["name"], "address": p["address"], "location": p["location"]}
                              for p in r.get("pois", [])[:5]]
    
    # 百度搜索
    if "baidu" in priority and BAIDU_KEY:
        url = f"https://api.map.baidu.com/place/v2/search?query={keyword}®ion={region}&ak={BAIDU_KEY}&output=json"
        r = requests.get(url, timeout=5).json()
        if r.get("status") == 0:
            results["百度"] = [{"name": p["name"], "address": p.get("address", ""), "location": p.get("location", "")}
                             for p in r.get("results", [])[:5]]
    
    # 腾讯搜索
    if "tencent" in priority and TENCENT_KEY:
        url = f"https://apis.map.qq.com/ws/place/v1/search?keyword={keyword}®ion={region}&key={TENCENT_KEY}&output=json"
        r = requests.get(url, timeout=5).json()
        if r.get("status") == 0:
            results["腾讯"] = [{"name": p["name"], "address": p.get("address", ""), "location": p.get("location", "")}
                             for p in r.get("data", [])[:5]]
    
    return results


# ========== 主入口 ==========
if __name__ == "__main__":
    import sys
    keyword = sys.argv[1] if len(sys.argv) > 1 else "咖啡馆"
    region = sys.argv[2] if len(sys.argv) > 2 else "上海"
    
    results = search_maps(keyword, region)
    
    for source, items in results.items():
        print(f"
【{source}】")
        for i, item in enumerate(items, 1):
            print(f"  {i}. {item['name']}")
            print(f"     地址: {item['address']}")

使用方式

1. 通过 exec 调用

python /root/.openclaw/workspace/skills/map-search/map_search.py "咖啡馆" "上海"

2. 封装成 CLI 工具

# 创建软链接
ln -s /root/.openclaw/workspace/skills/map-search/map_search.py /usr/local/bin/map-search

# 直接使用
map-search "火锅" "北京"
map-search "酒店" "深圳"

配置文件

路径: ~/.config/openclaw/map_config.json

{
  "amap": {
    "api_key": "你的高德API Key"
  },
  "baidu": {
    "api_key": "你的百度API Key"
  },
  "tencent": {
    "api_key": "你的腾讯API Key"
  },
  "priority": ["amap", "tencent", "baidu"]
}

设置优先级

"priority": ["amap", "tencent", "baidu"]
  • "amap" - 高德
  • "baidu" - 百度
  • "tencent" - 腾讯

按数组顺序搜索,找到一个有效结果就停止。

环境变量(备选)

如果配置文件不存在,会回退到环境变量:

export AMAP_API_KEY="你的高德Key"
export BAIDU_MAP_API_KEY="你的百度Key"
export TENCENT_MAP_API_KEY="你的腾讯Key"

API Keys 申请

平台 地址
高德 https://lbs.amap.com/
百度 https://lbsyun.baidu.com/
腾讯 https://lbs.qq.com/

输出示例

关键词搜索

【高德】
  1. 星巴克(人民广场店)
     地址: 黄浦区n京西路123号
  2. 瑞幸咖啡(来福士店)
     地址: 黄浦区西藏中路268号

附近搜索

?? 附近搜索: 咖啡馆 (半径 2000 米)
正在获取当前位置...
当前位置: 经度 121.47, 纬度 31.23

【高德】
  1. 星巴克(人民广场店)
     地址: 黄浦区n京西路123号
     距离: 520米
  2. 瑞幸咖啡(来福士店)
     地址: 黄浦区西藏中路268号
     距离: 890米

?? 附近搜索功能

自动获取当前位置(通过 IP 定位)

python /root/.openclaw/workspace/skills/map-search/map_search.py --nearby -k "咖啡馆"

指定经纬度

python /root/.openclaw/workspace/skills/map-search/map_search.py --nearby -k "咖啡馆" --lat 31.230416 --lng 121.473701

指定搜索半径

python /root/.openclaw/workspace/skills/map-search/map_search.py --nearby -k "火锅" -r 1000

命令行参数

参数 说明 示例
--nearby-n 启用附近搜索模式 --nearby
-k--keyword 搜索关键词 -k "咖啡馆"
--lat 纬度 --lat 31.230416
--lng 经度 --lng 121.473701
-r--radius 搜索半径(米,默认2000) -r 1000

使用场景示例

场景 命令
搜附近咖啡馆 map-search --nearby -k "咖啡馆"
搜附近1公里的火锅 map-search --nearby -k "火锅" -r 1000
搜指定位置附近的酒店 map-search --nearby -k "酒店" --lat 39.9 --lng 116.4

注意事项

  • 需要安装 requests 库: pip install requests
  • 每个地图 API 有每日调用次数限制
  • 配置文件优先级 > 环境变量
  • 附近搜索需要配置高德 API Key(用于 IP 定位)