腾讯逆地理编码需用GET请求,参数含location(纬度,经度)、key(WebService SDK密钥)和coord_type(1为GPS),响应中取result.address和result.ad_info,cURL调用更可靠。

腾讯位置服务 PHP 逆地理编码接口怎么调用
直接用 file_get_contents() 或 cURL 发 GET 请求就行,但必须带 location(纬度,经度)、key 和 coord_type,缺一不可。腾讯的逆地理接口不认 POST,也不接受 JSON body,只吃 query string。
-
location格式必须是"纬度,经度"(注意:先纬后经,和常见 GPS 设备顺序相反) -
coord_type值填1(GPS 原始坐标),如果用高德或百度导出的坐标,得先转成腾讯系坐标系,否则地址偏差几百米起步 -
key必须是控制台申请的「WebService SDK」密钥,不能用 JS SDK 的 key,否则返回{"status":310,"message":"invalid key"} - 请求 URL 示例:
https://apis.map.qq.com/ws/geocoder/v1/?location=39.984127,116.307453&key=YOUR_KEY&coord_type=1
PHP 解析逆地理响应时为什么总拿不到 formatted_addresses
因为腾讯返回结构里没有这个字段——这是高德/百度的命名习惯。腾讯用的是 result.formatted_addresses.recommend 和 result.formatted_addresses.national,而且这两个字段只在部分城市返回,不是必有。
- 真正稳定可用的是
result.address(字符串,如“北京市朝阳区建国路87号”) - 行政区划要从
result.ad_info里取:province、city、district,注意ad_info.city可能为空(比如直辖市下的区) - 如果
result为空,先检查status是否为 0;非 0 就别解析了,直接看message字段,常见"KEY ERROR"或"OVER_QUERY_LIMIT" - 别用
json_decode($res, true)后直接['result']['formatted_addresses']——先isset($data['result'])再取
用 cURL 调用比 file_get_contents 好在哪
主要是可控性和容错:腾讯接口偶尔超时或返回空响应,file_get_contents 默认没超时设置,容易卡住;且无法设 User-Agent,某些网络环境会被拦截。
- 必须加
CURLOPT_TIMEOUT(建议 ≤10),否则 PHP 默认无限等待 - 加
CURLOPT_USERAGENT,值设成常见浏览器 UA,能绕过部分 CDN 拦截 - 加
CURLOPT_RETURNTRANSFER,不然curl_exec直接输出内容,没法解析 - 示例关键片段:
$ch = curl_init();<br>curl_setopt($ch, CURLOPT_URL, $url);<br>curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);<br>curl_setopt($ch, CURLOPT_TIMEOUT, 10);<br>curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0');<br>$res = curl_exec($ch);<br>curl_close($ch);
逆地理结果不准?先查这三件事
坐标不准、坐标系不对、请求参数拼错,三者占了 90% 的“地址不对”问题。
立即学习“PHP免费学习笔记(深入)”;
- 确认原始坐标来源:手机
Geolocation API返回的是 WGS84,腾讯要求coord_type=1;微信getLocation返回的是 GCJ-02,得设coord_type=5 - 用腾讯地图 App 手动点选同一位置,对比接口返回的
result.location(经纬度)是否和你传入的一致,偏差 >0.001° 就说明坐标被悄悄转换过了 - 检查 URL 中的
&是否被 PHP 的http_build_query编码成%26——腾讯接口不认 URL 编码后的分隔符,得用原生字符串拼接或手动urldecode
坐标准确性比代码逻辑重要得多,接口本身没玄学,传进去什么,它就按什么算。坐标错了,再好的 PHP 封装也救不回来。











