mcpField
T
tianditu

tianditu

本地服务
github.com/bailaohe地图与出行778 周前更新

关于 tianditu

天地图的 MCP 服务将地图地理信息能力提供给 MCP 客户端,适用于需要地址与地点数据的智能体。支持地理编码、逆地理编码、周边检索,并列有行政区内搜索和路线规划示例。

主要功能

  1. 01地址转坐标
  2. 02坐标转地址与行政区信息
  3. 03按中心点和半径搜索 POI
  4. 04提供行政区划与分类编码资源
  5. 05支持行政区内搜索及路线规划

适用场景

  1. 01将地址解析为经纬度
  2. 02根据坐标查询地址和道路信息
  3. 03搜索当前位置附近的地点
  4. 04查询区域内地点或规划驾车、公交路线

MCP 相关

作为 MCP 服务向客户端提供天地图地理信息工具与编码资源,包括地理编码、逆地理编码和周边检索。README 还列出行政区内搜索及驾驶、公交规划能力。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"mcp_tianditu": {
"command": "uvx",
"args": [
"mcp-tianditu"
],
"env": {
"TIANDITU_API_KEY": "<TIANDITU_API_KEY>"
}
}
}
}
启动命令uvx mcp-tianditu
需要配置的环境变量
TIANDITU_API_KEY密钥

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
pypimcp-tianditu

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

来自项目 README

天地图 MCP Server

概述

天地图API现已全面兼容MCP协议,提供了一套符合MCP协议标准的地理信息服务接口。

天地图提供的MCP Server,包含6个符合MCP协议标准的API接口,涵盖地理编码、逆地理编码、周边检索、行政区内搜索、驾驶规划、公交规划等核心地图服务功能。

依赖MCP Python SDK,任意支持MCP协议的智能体助手(如Claude、Cursor以及千帆AppBuilder等)都可以快速接入。

工具

地理编码 addr_to_geocode

描述: 将地址解析为对应的位置坐标,地址结构越完整,地址内容越准确,解析的坐标精度越高。

参数:

  • address: 待解析的地址(如:北京市海淀区莲花池西路28号)地址结构越完整,解析精度越高。

输出:

  • 地址经纬度信息数据字典,包含如下键:
    • lon (float): 经度 (gcj02ll)
    • lat (float): 纬度 (gcj02ll)
    • score (int): 置信度评分, 分值范围0-100, 分值越大精度越高
    • keyWord (str): 输入的地址内容
逆地理编码 geocode_to_addr

描述: 根据纬经度坐标, 获取对应位置的地址描述, 所在行政区划, 道路以及相关POI等信息

参数:

  • latitude: 纬度 (gcj02ll)
  • longitude: 经度 (gcj02ll)

输出:

  • 地址经纬度信息数据字典,包含如下键:
    • formatted_address (str): 格式化地址信息
    • addressComponent (dict): 地址信息
      • nation (str): 国家
      • province (str): 省
      • city (str): 市
      • county (str): 区
      • town (str): 镇/县
      • road (str): 道路
    • location (dict): 输入的经纬度信息
      • lon (float): 经度 (gcj02ll)
      • lat (float): 纬度 (gcj02ll)
周边检索 search_by_redius

描述: 设置圆心和半径,检索圆形区域内的地点信息(常用于周边检索场景)。

参数:

  • query: 检索关键字, 可直接使用名称或类型, 如'query=天安门'
  • latitude: 纬度 (gcj02ll)
  • longitude: 经度 (gcj02ll)
  • radius: 半径 (米)

输出:

  • 周边查询结果数据字典,包含如下键:
    • keyWord (str): 输入的检索关键字
    • count (int): 检索结果总数
    • pois(list[dict]): POI结果元素列表,每个元素包含如下键:
      • name (str): Poi点名称
      • address (str): Poi点地址
      • lonlat (str): 经纬度 (gcj02ll),格式为:经度,纬度
      • phone (str): 联系电话
      • distance (str): 距离(单位 m,km),1千米以下单位为米(m),1千米以上单位为千米(km)

资源

行政区划编码表 tdt://admin-code

描述: 中国行政区划编码,包括省市区。

数据分类编码表 tdt://data-type

描述: 数据分类编码表,包含餐馆、商店、医院等各类POI分类编码。

开始

使用天地图MCP Server主要通过两种形式,分别是Python和Typescript,下面分别介绍。

获取AK

在选择两种方法之前,你需要在天地图开放平台的控制台中创建一个服务端AK,通过AK你才能够调用天地图API能力。

获取方式请参考: https://console.tianditu.gov.cn/api/key

Python接入
安装

使用pip安装mcp-tianditu:

pip install mcp-tianditu

安装后,我们可以使用以下命令将其作为脚本运行:

python -m mcp_tianditu
配置

在任意MCP客户端(如Claude.app)中添加如下配置,部分客户端下可能需要做一些格式化调整。

其中TIANDITU_API_KEY对应的值需要替换为你自己的AK。

{
    "mcpServers": {
        "tianditu-map": {
            "command": "python",
            "args": [
                "-m",
                "mcp_tianditu"
            ],
            "env": {
                "TIANDITU_API_KEY": "你的天地图API密钥"
            }
        }
    }
}

如果使用uv配置,配置内容如下:

{
    "mcpServers": {
        "tianditu-map": {
            "command": "uvx",
            "args": [
                "mcp-tianditu"
            ],
            "env": {
                "TIANDITU_API_KEY": "你的天地图API密钥"
            }
        }
    }
}

效果

接下来就可以进行提问,验证出行规划小助手的能力了。

示例1:地址查询
请帮我查询北京市海淀区中关村的位置坐标
示例2:周边检索
我现在在北京天安门(39.908823, 116.397470),请帮我找出5公里内的博物馆
示例3:位置信息查询
请告诉我坐标(39.908823, 116.397470)对应的地址信息
示例4:行政区内查询
请帮我查询北京市海淀区内的大学
示例5:驾驶规划
请帮我规划从北京市海淀区中关村到北京市朝阳区国贸的驾车路线
示例6:公交规划
请帮我规划从北京西站到北京站的公交路线

通过千帆AppBuilder平台接入

千帆平台接入,目前支持SDK接入或是API接入,通过AppBuilder构建一个应用,每个应用拥有一个独立的app_id,在python文件中调用对应的app_id,再调用天地图 Python MCP Tool即可。

模板代码可向下跳转,通过SDK Agent && 天地图MCP Server,拿到位置信息及周边POI信息,并给出出行建议。

Agent配置

前往千帆平台,新建一个应用,并发布。

将Agent的思考轮数调到6。发布应用。

调用

此代码可以当作模板,以SDK的形式调用千帆平台上已经构建好且已发布的App,再将MCP Server下载至本地,将文件相对路径写入代码即可。

(注意:使用实际的app_id、token、query、mcp文件)

import os
import asyncio
import appbuilder
from appbuilder.core.console.appbuilder_client.async_event_handler import (
    AsyncAppBuilderEventHandler,
)
from appbuilder.mcp_server.client import MCPClient

class MyEventHandler(AsyncAppBuilderEventHandler):
    def __init__(self, mcp_client):
        super().__init__()
        self.mcp_client = mcp_client
    
    def get_current_weather(self, location=None, unit="摄氏度"):
        return "{} 的温度是 {} {}".format(location, 20, unit)
    
    async def interrupt(self, run_context, run_response):
        thought = run_context.current_thought
        # 绿色打印
        print("\033[1;31m", "-> Agent 中间思考: ", thought, "\033[0m")
        tool_output = []
        for tool_call in run_context.current_tool_calls:
            tool_res = ""
            if tool_call.function.name == "get_current_weather":
                tool_res = self.get_current_weather(**tool_call.function.arguments)
            else:
                print(
                    "\033[1;32m",
                    "MCP工具名称: {}, MCP参数:{}\n".format(tool_call.function.name, tool_call.function.arguments),
                    "\033[0m",
                )
                mcp_server_result = await self.mcp_client.call_tool(
                    tool_call.function.name, tool_call.function.arguments
                )
                print("\033[1;33m", "MCP结果: {}\n\033[0m".format(mcp_server_result))
                for i, content in enumerate(mcp_server_result.content):
                    if content.type == "text":
                        tool_res += mcp_server_result.content[i].text
            tool_output.append(
                {
                    "tool_call_id": tool_call.id,
                    "output": tool_res,
                }
            )
        return tool_output
    
    async def success(self, run_context, run_response):
        print("\n\033[1;34m", "-> Agent 非流式回答: ", run_response.answer, "\033[0m")

async def agent_run(client, mcp_client, query):
    tools = mcp_client.tools
    conversation_id = await client.create_conversation()
    with await client.run_with_handler(
        conversation_id=conversation_id,
        query=query,
        tools=tools,
        event_handler=MyEventHandler(mcp_client),
    ) as run:
        await run.until_done()

### 用户Token
os.environ["APPBUILDER_TOKEN"] = ""

async def main():
    appbuilder.logger.setLoglevel("DEBUG")
    ### 发布的应用ID
    app_id = ""
    appbuilder_client = appbuilder.AsyncAppBuilderClient(app_id)
    mcp_client = MCPClient()
    
    ### 注意这里的路径为MCP Server文件在本地的相对路径
    await mcp_client.connect_to_server("./<YOUR_FILE_PATH>/main.py")
    print(mcp_client.tools)
    await agent_run(
        appbuilder_client,
        mcp_client,
        '请帮我查询北京市海淀区中关村的位置坐标',
    )
    await appbuilder_client.http_client.session.close()

if __name__ == "__main__":
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())
效果

经过Agent自己的思考,通过调用MCPServer 地理编码服务、逆地理编码服务、周边检索服务等多个tool,拿到位置信息及周边POI信息,并给出出行建议。

实际用户请求:"请帮我规划一次北京故宫一日游,并考虑周边的餐饮和交通。"

说明

在天地图MCP Server中传入的部分参数规格:

  • 行政区划编码均采用天地图adcode映射表。
  • 经纬度坐标均采用国测局经纬度坐标gcj02ll。
  • 类型等中文字符串参数应符合天地图POI类型标准。

许可

MIT

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。