【问题标题】:Parsing json data to a table but some rows are not fetched将 json 数据解析为表,但未获取某些行
【发布时间】:2013-05-26 16:13:27
【问题描述】:

我正在使用 google maps api 根据给定的经度和纬度获取地址。可以多次调用 api,经度和纬度从数据库中加载。

我想遍历所有的 api 调用并获取格式化的地址并将其显示在表格中。

表格布局如下:计数/参考/经度/纬度/地址

我的脚本如下:

<?php
$databasehost = "localhost";
$databasename = "...";
$databasetable = "import1";
$databasetable2 = "data1";
$databaseusername ="...";
$databasepassword = "...";


$con = @mysql_connect($databasehost,$databaseusername,$databasepassword) or die(mysql_error());
@mysql_select_db($databasename) or die(mysql_error());

$query = mysql_query("SELECT * from $databasetable;");

$data = array();

$index = 0;
while($row = mysql_fetch_assoc($query))
{
     $data[$index] = $row;
     $index++;
}
$count = 1;
?>
<table>
<?php
foreach ($data as $key) {
    $url = 'http://maps.googleapis.com/maps/api/geocode/json?latlng='.$key['latitude'].','.$key['longitude'].'&sensor=true';
    $json = file_get_contents($url);
    $dataReceived = json_decode($json, TRUE);

    if(!empty($dataReceived['results'][0]['formatted_address']))
    {
        $formattedAddress = $dataReceived['results'][0]['formatted_address'];
    }else{
        $formattedAddress = '';
    }
    ?>
    <tr>
        <td><?=$count?></td>
        <td><?=$key['id']?></td>
        <td><?=$key['latitude']?></td>
        <td><?=$key['longitude']?></td>
        <td><?=$formattedAddress?></td>
    </tr>
    <?php
    $count++;
}
?>
</table>
<?php
@mysql_close($con);
?>

现在,如果您转到此链接:http://www.ryansmurphy.com/crawler/get-data.php,问题就会变得清晰。有些行,没有地址。如果您不断刷新,您会注意到每次似乎都不同的行没有地址。它非常奇怪。

如果您选择其中没有地址的行并将经度和纬度放入 api 调用中,(请参阅上面脚本中 api 调用的链接)您会注意到格式化地址的数据。

我做错了什么?

所有行都应该返回地址。

【问题讨论】:

    标签: php json google-maps-api-3 html-table


    【解决方案1】:

    检查错误。地理编码器受到配额和速率限制。每次加载页面时对大量地址进行地理编码并不是一个好主意(其中一个大数字是大于 ~10 的数字)。

    【讨论】:

    • 那么您的建议是,对 long 和 lats 的数据库调用设置限制为 10?
    • 如果您有一个包含地址的数据库,请在其中缓存地理编码的坐标(以遵守使用条款,并定期对其进行重新地理编码)。使用数据库中的坐标,而不是通过对加载地址进行地理编码。或者,如果您这样做是为了填充数据库,那么可以一次执行 10 个,并且在 10 个组之间有延迟。尽管实际上我建议的是“检查错误”。如果您收到错误(这意味着您超出配额),请延迟一段时间并重试。
    • 这可能是一个解决方案,但它没有说明一次可以拨打多少电话的使用政策,它只说每天限制为 2500 次
    • 确实如此。未指定实际速率限制,并且可能随服务器负载而变化。数字 ~10 来自 v3 Google Maps Javascript API 中 javascript 地理编码服务的经验,网络服务可能有所不同。
    • 你启发,每 5 次计数,我实现了一个 5 秒睡眠定时器。谢谢你,我会接受你的回答,因为你的想法启发了我。
    猜你喜欢
    • 2020-08-01
    • 2017-07-21
    • 1970-01-01
    • 2019-05-24
    • 2021-11-25
    • 2023-03-27
    • 1970-01-01
    • 2017-03-25
    • 1970-01-01
    相关资源
    最近更新 更多