概览
所有接口均以 /api 为前缀,请求与响应一律 application/json; charset=utf-8。
除瓦片与静态地图返回二进制图片外,其余接口都遵循统一的响应信封:
{
"ok": true,
... // 各接口自己的字段
}
// 失败时
{ "ok": false, "error": "人类可读的错误描述" }
/api、/vendor、/shared、/sdk
四个前缀均已开放 CORS,可以直接在浏览器里跨域调用。
接口一览
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /api/health | 服务健康检查与运行指标 |
| GET | /api/coord/convert | 两个坐标系之间互转 |
| GET | /api/coord/all | 一次返回全部坐标系的表示 |
| GET | /api/geocode/search | 关键词 / 周边 / 多边形搜索 |
| GET | /api/geocode/reverse | 逆地理编码(坐标→地址) |
| GET | /api/geocode/suggest | 输入联想(只回名称与坐标) |
| GET | /api/tiles/sources | 可用瓦片源列表 |
| GET | /api/tiles/{id}/{z}/{x}/{y}.png | 取瓦片(透传代理 + 本地缓存) |
| GET | /api/staticmap | 服务端渲染静态地图 PNG |
| GET | /api/route | 路线规划(驾车 / 骑行 / 步行) |
| GET | /api/markers | 标注的增删查 |
| GET | /api/merchants/list | 已通过审核的认证商户 |
鉴权与配额
接口默认匿名可用(部署者可在后台把 KEY_REQUIRED 打开强制校验)。
带上 Key 后,服务端会按 Key 统计用量并执行每日配额。
三种携带方式任选其一,服务端都认:
?key=YOUR_KEY // 查询参数(瓦片是 <img>,只能走这种)
X-API-Key: YOUR_KEY // 请求头
Authorization: Bearer YOUR_KEY
<img> 标签加载的,带不了请求头 —— 所以 Key 一律以查询参数传递。
如果你的接口能调通但底图 401,检查瓦片 URL 上有没有带 key。
Scope
创建 Key 时按最小权限勾选,服务端会校验调用的接口是否落在授权范围内:
| scope | 覆盖接口 |
|---|---|
coord | /api/coord/* |
geocode | /api/geocode/* |
tiles | /api/tiles/* |
staticmap | /api/staticmap |
route | /api/route |
stats | 统计类接口 |
坐标系约定
服务端内部一律使用 WGS84。对外返回的坐标默认也是 WGS84,
需要其它坐标系时传 crs 参数,由服务端换算。
crs 告诉服务端,转换只发生一次。
| 标识 | 说明 | 典型来源 |
|---|---|---|
WGS84 | GPS 原始坐标 | 设备定位、OSM 数据 |
GCJ02 | 火星坐标(加密偏移) | 高德、腾讯 |
BD09 | 百度坐标(在 GCJ02 上二次加密) | 百度地图 |
CGCS2000 | 国家大地坐标系 | 测绘成果 |
EPSG:3857 | Web 墨卡托投影(单位:米) | Web 地图渲染 |
错误格式
{ "ok": false, "error": "缺少 lng / lat 参数" }
HTTP 状态码与语义一致:400 参数问题、401/403 鉴权问题、429 限流、500 服务端异常。业务上以 ok 字段为准。
坐标转换
| 参数 | 必填 | 说明 |
|---|---|---|
lng | 是 | 经度 |
lat | 是 | 纬度 |
from | 是 | 源坐标系 |
to | 是 | 目标坐标系 |
GET /api/coord/convert?lng=116.39124&lat=39.90749&from=WGS84&to=GCJ02
{
"ok": true,
"from": "WGS84",
"to": "GCJ02",
"input": { "lng": 116.39124, "lat": 39.90749 },
"output": { "lng": 116.397428, "lat": 39.908838 }
}
一次返回所有坐标系下的表示,并附带与 WGS84 的偏移量(米),便于直观对照。
GET /api/coord/all?lng=116.39124&lat=39.90749&from=WGS84
{ "ok": true, "crs": ["WGS84","GCJ02","BD09",...], "data": {...}, "offsets": { "GCJ02": 559, "BD09": 622 } }
地理编码
| 参数 | 说明 |
|---|---|
q | 关键词,如「天安门」 |
limit | 返回条数,默认 10 |
crs | 输入坐标系,默认 WGS84 |
center | 周边搜索中心,格式 lng,lat |
radius | 周边半径(米),配合 center 使用 |
polygon | 多边形范围,lng,lat;lng,lat;… 分号分隔(不是 JSON) |
bbox | 矩形范围。服务端不换算,需自己转成 WGS84 |
mode | auto / remote / local |
center 与 polygon 会由服务端按 crs 换算;
bbox 直接喂给空间索引不换算 —— 这是刻意的不一致,
因为 bbox 通常来自地图视口,已经是 WGS84。
参数 lng / lat / crs / mode。在线失败会降级到本地 POI 库:按 300m → 1km → 3.4km → 11km 逐级放大找最近的地标。
降级结果带 "source": "local-reverse" 与 "degraded": true,地址由「省 市 区 名称」拼成(离线库没有门牌号)。
mode=local 会跳过上游、只用离线库,响应稳定在毫秒级。
上游不可达时远程要等满超时才降级(实测 8 秒),
而「给标注起个名字」这类用途用本地 93 万条 POI 完全够 —— 前端加标注走的就是这条。
输入联想,只回 name / city / category / lng / lat,响应体小,适合边输入边查。
瓦片
{
"ok": true,
"sources": [{
"id": "osm",
"name": "OpenStreetMap 标准",
"maxZoom": 19,
"attribution": "© OpenStreetMap contributors",
"kind": "raster",
"proxyUrl": "/api/tiles/osm/{z}/{x}/{y}.png"
}]
}
取瓦片。服务端先查本地磁盘缓存,未命中再回源,失败时渲染兜底瓦片(不会返回 404 空白图)。响应头 X-Tile-Cache 标识命中情况:HIT / MISS / FALLBACK。
静态地图
| 参数 | 说明 |
|---|---|
center | lng,lat,地图中心 |
zoom | 缩放级别 |
size | 尺寸,如 640x360 |
markers | 标注,lng,lat,label 多个用 | 分隔 |
path | 折线,lng,lat;lng,lat;… |
crs | 输入坐标系,默认 WGS84 |
GET /api/staticmap?center=116.397,39.909&zoom=12&size=640x360&markers=116.397,39.909,天安门
路线规划
自研离线引擎,基于本地 OSM 路网构建图结构,驾车 / 骑行 / 步行三种出行方式, 不调用任何外部路径服务。
| 参数 | 说明 |
|---|---|
from | 起点,lng,lat |
to | 终点,lng,lat |
profile | car(驾车)/ bike(骑行)/ foot(步行) |
crs | 输入坐标系,结果按它转回 |
标注
列出全部标注。带登录态(站点 Cookie)创建时会自动记上 owner,未登录创建的标注 owner 为空串。
{
"name": "公司前台",
"lng": 116.397, "lat": 39.909,
"crs": "GCJ02", // 输入坐标系,服务端统一存 WGS84
"icon": "pin", "color": "#d33a2c",
"note": "快递放这里"
}
商户认证
商户由商家自主提交,平台只做形式审核。通过后的商户进入独立认证图层与搜索结果, 带「认证」角标。
只返回已审核通过的商户。参数 bbox(矩形过滤)、q(名称关键词)、limit(默认 300,上限 2000)。
{
"name": "示例餐厅(望京店)",
"category": "餐饮",
"lng": 116.47, "lat": 39.99,
"address": "北京市朝阳区望京街 1 号",
"phone": "010-12345678",
"description": "营业时间 10:00-22:00",
"images": ["https://…/a.jpg"] // 最多 6 张
}
提交后状态为 pending;管理员通过后变 approved,驳回为 rejected 并附 review.reason。
| 状态 | 含义 | 可操作 |
|---|---|---|
pending | 待审核 | 可修改 |
approved | 已通过,公开展示 | 可下架 |
rejected | 已驳回 | 改后可重新提交 |
offline | 商家自行下架 | 改后可重新提交 |
我提交的全部商户(含待审与驳回),按 owner 隔离。
修改自己的商户,仅 pending / rejected 状态可改。修改后状态回到 pending。
站点账号接口
面向「控制台」的一组接口,用 HttpOnly Cookie(oms_portal)维持会话,
不是给第三方服务端调用的 —— 需要服务端集成请用 API Key。
| 方法 | 路径 | 说明 |
|---|---|---|
| POST | /api/portal/register | 注册(成功后直接下发会话) |
| POST | /api/portal/login | 登录 |
| POST | /api/portal/logout | 退出 |
| GET | /api/portal/me | 当前登录用户 |
| GET | /api/portal/keys | 我的 Key 列表 |
| POST | /api/portal/keys | 创建 Key(明文仅返回一次) |
| DELETE | /api/portal/keys/:id | 删除 Key |
| GET | /api/portal/usage | 用量统计(汇总自己全部 Key) |
| GET | /api/portal/markers | 我的标注 |
data/portal/,
管理员存 data/auth/,会话 Cookie 也不同。门户用户默认没有任何后台权限。
限流与错误码
| 状态码 | 含义 | 常见原因 |
|---|---|---|
400 | 参数错误 | 缺少必填参数、坐标超范围、图片数量超限 |
401 | 未登录 | 调用需登录接口但没有会话 Cookie |
403 | 无权限 | scope 不匹配、操作别人的资源 |
404 | 不存在 | 资源 ID 错误,或不属于当前用户 |
429 | 限流 | 超过 Key 每日配额或每 IP 频率上限 |
500 | 服务端异常 | 见服务端日志 |
公开接口另有 IP 白名单 + 每 IP 限流,默认关闭,部署公网后可在后台「访问控制」页开启。