兼容替换
您无需学习这个 API 就能使用它。针对其他十七个地理编码和 IP 查询 API,我们各运行一个主机,接受该服务商的请求格式并以该服务商的响应格式作答,背后是我们的数据。这些服务商提供的 JavaScript 地图库也同样适用。迁移只需更改主机名。
工作原理
每个兼容替换主机都完整实现了一家服务商的公开 HTTP 接口:相同的路径、相同的查询参数、相同的 JSON 字段名、嵌套结构和类型、相同的状态词汇以及相同的错误结构。数值来自我们。您的客户端代码、解析代码和错误处理都无需改动。
- 更改主机。
maps.googleapis.com改为gapi.mygeocode.com,dev.virtualearth.net改为bing.mygeocode.com,依此类推。下表列出了所有对应关系。 - 替换密钥,或者去掉它。把您的 My Geocode 密钥放在原密钥所用的参数中(
key、apiKey、access_token、token……)。任何地址无需密钥每天即可获得 2,500 个免费请求,每个密钥还自带 2,500 个,因此迁移和测试不花一分钱。 - 对比。用一批真实请求样本同时请求两个主机。由于数据不同,坐标会略有差异;字段名则不会。
$ curl "https://maps.googleapis.com/maps/api/geocode/json?address=10+Downing+St+London&key=GOOGLE_KEY"$ curl "https://gapi.mygeocode.com/maps/api/geocode/json?address=10+Downing+St+London&key=MYGEOCODE_KEY"所有兼容替换主机
每个主机都与 api.mygeocode.com 运行在相同的基础设施上,使用相同的数据、相同的免费配额和相同的价格。点击某个服务商可查看其端点列表、示例响应和已知差异。
| 服务商和查询类型 | 原始主机 | 兼容替换主机 | 密钥参数 |
|---|---|---|---|
| Google Maps Platform 正向、逆向、自动补全、时区、海拔 | maps.googleapis.com | gapi.mygeocode.com | key |
| Bing Maps REST Services 正向、逆向、自动补全、时区、海拔 | dev.virtualearth.net | bing.mygeocode.com | key |
| HERE Geocoding and Search 正向、逆向、自动补全 | geocode.search.hereapi.comrevgeocode.search.hereapi.comautosuggest.search.hereapi.comautocomplete.search.hereapi.com | here.mygeocode.com | apiKey |
| Mapbox Geocoding 正向、逆向、自动补全 | api.mapbox.com | mapbox.mygeocode.com | access_token |
| Geocode.Farm 正向、逆向 | api.geocode.farmwww.geocode.farm | farm.mygeocode.com | key |
| OpenStreetMap Nominatim 正向、逆向 | nominatim.openstreetmap.org | osm.mygeocode.com | 无;添加 key 或请求头 |
| OpenCage 正向、逆向 | api.opencagedata.com | opencage.mygeocode.com | key |
| LocationIQ 正向、逆向、自动补全、时区 | us1.locationiq.comeu1.locationiq.com | locationiq.mygeocode.com | key |
| Geoapify 正向、逆向、自动补全、IP 查询 | api.geoapify.com | geoapify.mygeocode.com | apiKey |
| TomTom Search 正向、逆向、自动补全 | api.tomtom.com | tomtom.mygeocode.com | key |
| MapQuest Geocoding 正向、逆向 | www.mapquestapi.comopen.mapquestapi.com | mapquest.mygeocode.com | key |
| Geocodio 正向、逆向 | api.geocod.io | geocodio.mygeocode.com | api_key |
| PositionStack 正向、逆向 | api.positionstack.com | positionstack.mygeocode.com | access_key |
| ip-api.com IP 查询 | ip-api.compro.ip-api.com | ipapi.mygeocode.com | key |
| ipinfo.io IP 查询 | ipinfo.io | ipinfo.mygeocode.com | token |
| ipstack IP 查询 | api.ipstack.com | ipstack.mygeocode.com | access_key |
| Open-Elevation Elevation | api.open-elevation.com | openelevation.mygeocode.com | 无;添加 key 或请求头 |
JavaScript 地图库
更换服务商最麻烦的地方在浏览器端,那里地图、地理编码组件和计费纠缠在一起。对于下列库,库本身从我们的主机加载(对于 MapLibre、Mapbox GL 和 Leaflet,则通过配置指向我们的主机),并保留其公开 API:google.maps.Map、Microsoft.Maps.Map、H.Map 等。瓦片、地理编码、自动补全和海拔数据都来自我们。地图加载和瓦片免费;地理编码调用照常计数。
| 库 | 原加载地址 | 改为从此加载 | 继续可用的功能 |
|---|---|---|---|
| Google Maps JavaScript API 地图库 | maps.googleapis.com | gapi.mygeocode.com | 使用我们瓦片的 google.maps.Map(roadmap、satellite 和 terrain 地图类型) |
| Bing Maps V8 Web Control 地图控件 | www.bing.com | bing.mygeocode.com | Microsoft.Maps.Map、Location、LocationRect、Pushpin、Infobox、Polyline、Polygon 和 Layer |
| Mapbox GL JS 和 mapbox-gl-geocoder | | mapbox.mygeocode.com | 矢量瓦片样式:streets、light、dark 和 outdoors,遵循 Mapbox 样式规范 |
| Leaflet 地理编码插件 | tile.openstreetmap.org | tiles.mygeocode.com | Leaflet Control Geocoder:nominatim、google、bing、mapbox、here、opencage、latLng 和 mapquest 地理编码器,各自指向对应的 www.mygeocode.com 主机 |
| HERE Maps API for JavaScript 地图库 | js.api.here.com | here.mygeocode.com | H.Map, H.map.Marker, H.map.Polyline, H.map.Polygon, H.map.Group |
| MapQuest.js | api.mqcdn.com | mapquest.mygeocode.com | L.mapquest.map 和 tileLayer(map、hybrid、satellite、light、dark) |
JavaScript 兼容替换页面提供了修改前后的代码片段、每个库包含和不包含的功能列表,以及瓦片和样式 URL。
密钥放在哪里
每个主机都在原服务商期望的位置接受密钥,同时也接受 X-API-Key 请求头。密钥是可选的:每个地址每天 2,500 个请求无需密钥。免费密钥一分钟即可获取,并带来额度、套餐和使用记录。按量付费密钥在每滚动 24 小时内可从两个 IP 地址使用,Unlimited 密钥可从三个 IP 地址使用;如需更多地址,请使用更多密钥或套餐(请参阅身份验证)。
| 参数 | 使用者 |
|---|---|
key | Google Maps、Bing Maps、Geocode.Farm、OpenCage、LocationIQ、TomTom、MapQuest、ip-api(pro) |
apiKey | HERE、Geoapify |
access_token | Mapbox |
api_key | Geocodio |
access_key | PositionStack、ipstack |
token 或 Authorization: Bearer | ipinfo、HERE |
| 无 | Nominatim、Open-Elevation。在查询中添加 key=... 或发送 X-API-Key 请求头。 |
兼容替换主机上的配额和错误
每日配额与其他地方相同,按密钥计算,未发送密钥时则按地址计算,涵盖 api.mygeocode.com 和所有兼容替换主机:每天免费 2,500 个,之后使用额度或 Unlimited 密钥。所有主机都会发送 X-Quota-* 和 X-Key-IPs-* 响应头,因此无论响应正文是什么格式,您都可以从响应头读取真实状态。在响应正文中,限制按服务商自己的方式报告:
| 主机 | 额度用尽(402) | 密钥错误、缺失或受 IP 限制 | 无效请求 |
|---|---|---|---|
| gapi.mygeocode.com | HTTP 200,"status": "OVER_QUERY_LIMIT" | "status": "REQUEST_DENIED" | "status": "INVALID_REQUEST" |
| bing.mygeocode.com | 响应结构中的 "statusCode": 429 | "statusCode": 401, authenticationResultCode: InvalidCredentials | "statusCode": 400,附带 errorDetails |
| here.mygeocode.com | HTTP 429,{"title": "Too Many Requests", "status": 429} | HTTP 401,附带 error_description | HTTP 400,附带 title 和 cause |
| mapbox.mygeocode.com | HTTP 429,{"message": "Rate limit exceeded"} | HTTP 401,{"message": "Not Authorized - Invalid Token"} | HTTP 422,附带 message |
| osm.mygeocode.com | HTTP 429,{"error": {"code": 429, "message": "..."}} | 不适用 | HTTP 400,{"error": {"code": 400, "message": "..."}} |
| ipapi.mygeocode.com | HTTP 200,{"status": "fail", "message": "quota"} | {"status": "fail", "message": "invalid key"} | {"status": "fail", "message": "invalid query"} |
| 其他 | 与服务商文档一致;请参阅各主机的页面 |
哪些一致,哪些不一致
完全一致
- 服务商文档中记载的路径、方法和查询参数。
- 响应结构:字段名、嵌套、数组、类型、坐标顺序(包括 Mapbox 的
[lon, lat])。 - 状态和置信度词汇(
ROOFTOP、High、houseNumber、EXACT_MATCH……),由我们的precision和confidence映射而来。 - 错误结构,因此现有的错误处理可以继续使用。
- 价格和配额:使用兼容替换主机不额外收费。
不同之处
- 数据。坐标、格式化字符串和置信度数值来自我们,不会与原服务商逐位一致。门牌级覆盖范围因国家而异;请参阅覆盖范围。
- 标识符。地点 ID 由我们生成且保持稳定,但不能发送给原服务商。
- 地理编码、自动补全、IP、时区和海拔以外的任何功能:路线规划、地点详情、照片、交通、街景。各主机的页面列出了缺少的功能。
- 密钥:按量付费密钥每滚动 24 小时可用于两个 IP 地址,Unlimited 密钥可用于三个,与我们自己的端点相同。
迁移清单
- 在您的代码和配置中搜索该服务商的主机名。它往往出现在不止一个地方:服务器代码、移动应用、CDN 规则、缓存的配置。
- 将其改为上表中的兼容替换主机。路径保持不变。
- 将密钥替换为 My Geocode 密钥。每台服务器使用一个密钥,最多两台共用一个;按量付费密钥每滚动 24 小时接受两个 IP 地址,Unlimited 密钥接受三个。
- 运行您现有的测试套件。它应该无需修改即可通过。如果您依赖的某个字段缺失,请查看该主机页面上的已知差异,并告诉我们。
- 用几百个真实请求同时请求两个主机,比较坐标以及您展示的字段。在兼容替换主机提供的地方查看
precision(表现为location_type、accuracy、resultType等)。 - 观察
X-Quota-Used一天,以确定您的方案:每天少于约 19,000 个请求时使用额度,高于此数时使用 Unlimited 密钥。 - 取消原来的计费。
服务商 SDK
大多数官方客户端库都支持自定义基础 URL,因此它们也能与兼容替换主机配合使用:Google Maps Services 客户端(Python 的 googlemaps、@googlemaps/google-maps-services-js)、Mapbox SDK(origin 选项)、HERE 的 REST 客户端、ipinfo 的库,以及 geopy 等 Nominatim 封装库(domain=)。将它们指向表中的主机,并在原服务商密钥的位置传入您的 My Geocode 密钥。
未列出的服务商
如果服务商的格式有文档记载,添加一个主机只需几天的工作。如果您使用的服务不在此列,请告诉我们是哪一家,以及您每天大约发送多少请求。最近新增的主机全都来自用户的请求。