You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP调用Google API转地址经纬度时遇Over_Query_Limit错误求助

解决Google API Over_Query_Limit错误的实用方案

你遇到的OVER_QUERY_LIMIT是Google Maps API最常见的限制类问题,结合你的代码情况,我整理了几个关键修复和优化步骤,帮你彻底解决这个问题:

1. 必须添加有效的Google API密钥

现在Google Maps旗下的所有API(包括Geocoding和Distance Matrix)都强制要求使用API密钥,无密钥的请求配额极低(几乎无法满足正常使用需求),这是触发限制的核心原因之一。

操作步骤:

  • 登录Google Cloud Console,找到并启用Geocoding API和Distance Matrix API
  • 创建一个API密钥(建议设置IP或应用限制,防止密钥被盗用)
  • 在所有API请求的URL末尾添加&key=你的API密钥参数

2. 优化请求频率与重试机制

你代码里的sleep(2)只能应付单次请求的简单延迟,但面对配额限制远远不够,尤其是批量处理场景。建议实现指数退避重试策略:

关键优化点:

  • 当API返回OVER_QUERY_LIMIT状态时,不要直接放弃,而是先等待一段时间再重试,每次等待时间翻倍(比如第一次等2秒,第二次4秒,第三次8秒,最多重试3-5次)
  • 提前确认Google给的配额:免费层Geocoding API每天2500次请求,Distance Matrix API每天1000次,启用计费后配额会大幅提升

3. 修复代码中的潜在问题

你的代码还有几个小细节问题,可能间接导致请求效率低或异常:

  • file_get_contents请求Geocoding API稳定性不足,建议统一换成curl(和Distance Matrix的请求方式保持一致)
  • 距离计算函数的参数顺序容易混淆,调整得更直观
  • 增加错误分支处理,避免因API返回异常导致脚本崩溃

修改后的完整代码示例:

<?php
// 替换成你的Google API密钥
$apiKey = "YOUR_GOOGLE_API_KEY";
$address = 'iqra university islamabad';

// 使用curl请求Geocoding API,替代file_get_contents提升稳定性
$geocodeUrl = "https://maps.google.com/maps/api/geocode/json?address=" . urlencode($address) . "&sensor=false&key=" . $apiKey;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $geocodeUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
$geocodeResponse = curl_exec($ch);
curl_close($ch);

$response = json_decode($geocodeResponse);
if ($response->status == 'OK') {
    $latitude = $response->results[0]->geometry->location->lat;
    $longitude = $response->results[0]->geometry->location->lng;
    
    // 调整参数顺序为:起点经纬度、终点经纬度,更直观
    GetDrivingDistance(33.651936, 73.064366, $latitude, $longitude, $apiKey);
    
    echo '<br />';
    echo 'Latitude: ' . $latitude;
    echo '<br />';
    echo 'Longitude: ' . $longitude;
} else {
    // 明确输出错误状态,方便调试
    echo 'Geocoding API Error: ' . $response->status;
}

function GetDrivingDistance($originLat, $originLng, $destLat, $destLng, $apiKey) {
    $distanceUrl = "https://maps.googleapis.com/maps/api/distancematrix/json?origins=" . $originLat . "," . $originLng . "&destinations=" . $destLat . "," . $destLng . "&mode=driving&language=pl-PL&key=" . $apiKey;
    
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $distanceUrl);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    $response = curl_exec($ch);
    curl_close($ch);
    
    $response_a = json_decode($response, true);
    
    // 增加距离API的错误检查
    if (isset($response_a['status']) && $response_a['status'] == 'OK') {
        $dist = $response_a['rows'][0]['elements'][0]['distance']['text'];
        $time = $response_a['rows'][0]['elements'][0]['duration']['text'];
        echo 'distance: ' . $dist;
        // return array($dist,$time);
    } else {
        echo 'Distance Matrix API Error: ' . $response_a['status'];
    }
}
?>

4. 额外注意事项

  • 登录Google Cloud Console的API配额页面,实时监控请求使用情况,提前预判配额耗尽风险
  • 如果是批量处理大量地址,使用批量Geocoding请求(一次最多处理50个地址),减少请求次数
  • 对频繁查询的地址,缓存经纬度结果(比如存入数据库),避免重复调用Geocoding API浪费配额

内容的提问来源于stack exchange,提问作者user9706969

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 09:08:31