【问题标题】:How do you geocode addresses in a CSV file fast with Bing Maps如何使用 Bing 地图快速对 CSV 文件中的地址进行地理编码
【发布时间】:2015-09-26 10:30:54
【问题描述】:

我正在创建一个应用程序,允许用户上传 CSV 文件并从每一行读取地址并进行地理编码。

我最初尝试使用 google map API 来执行此操作。但经过一番研究,我发现 google map api 有很多限制。例如,您一天只能进行 2500 次查询,而且每次查询都需要延迟时间。

这是我目前写的代码:

<script src="http://maps.googleapis.com/maps/api/js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<table width="600">
<form action="<?php echo $_SERVER["PHP_SELF"]; ?>" method="post" enctype="multipart/form-data">

<tr>
<td width="20%">Select file</td>
<td width="80%"><input type="file" name="file" id="file" /></td>
</tr>

<tr>
<td>Submit</td>
<td><input type="submit" name="submit" /></td>
</tr>

</form>
</table>

<?php    
if ( isset($_POST["submit"]) ) {

   if ( isset($_FILES["file"])) {

            //if there was an error uploading the file
        if ($_FILES["file"]["error"] > 0) {
            echo "Return Code: " . $_FILES["file"]["error"] . "<br />";

        }
        else {
                 //Print file details
             echo "Upload: " . $_FILES["file"]["name"] . "<br />";
             echo "Type: " . $_FILES["file"]["type"] . "<br />";
             echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
             echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";
             $name = $_FILES['file']['name'];
                $ext = strtolower(end(explode('.', $_FILES['file']['name'])));
                $type = $_FILES['file']['type'];
                $tmpName = $_FILES['file']['tmp_name'];

    // check the file is a csv
    if($ext === 'csv'){
        if(($handle = fopen($tmpName, 'r')) !== FALSE) {
            // necessary if a large csv file
            set_time_limit(0);
            $row = 1;
            while((($data = fgetcsv($handle, 1000, ',')) !== FALSE) && $row!=10) {
                // number of fields in the csv
                $col_count = count($data);
            $address=implode(",",$data);
            $geocode=file_get_contents("http://maps.google.com/maps/api/geocode/json?address=".$address."&sensor=false");
            print_r($geocode);
            $output= json_decode($geocode);

            $lat = $output->results[0]->geometry->location->lat;
            $lng = $output->results[0]->geometry->location->lng;
            sleep(1);
                        print_r($address);
                        echo "------".$lat."----".$lng;
                        echo "<br/>";
                $row++;
            }
            fclose($handle);
        }

}
        }
     } else {
             echo "No file selected <br />";
     }
}   
?>

我的问题是,我如何使用 Bing Maps API 做到这一点。

这是一个示例 CSV 文件:

https://drive.google.com/open?id=0Bx3FBqTEy_0MaHp1QVhiNkVTLU0

【问题讨论】:

    标签: php google-maps csv bing-maps bing-api


    【解决方案1】:

    Bing 地图不限制您每天发出的请求数量,但是根据免费使用条款使用该服务时存在限制。基于 Web 的应用程序限制为每年 125,000 笔交易。

    使用 Bing 地图,可以通过三种方式进行地理编码。第一种方法是使用类似于您在 Google 地图中使用的基于 REST 的服务。您可以在此处找到有关此服务的文档:https://msdn.microsoft.com/en-us/library/ff701711.aspx

    如果您使用此服务,我还建议您查看最佳实践文档:https://msdn.microsoft.com/en-us/library/dn894107.aspx

    您还可以在此处找到有关如何在 PHP 中使用此服务的一些提示:https://msdn.microsoft.com/en-us/library/ff817004.aspx

    可用于地理编码的第二种方法是使用 Bing 地图中的搜索模块。搜索模块包装了 REST 服务并将它们作为一个易于使用的 JavaScript 库公开。 https://msdn.microsoft.com/en-us/library/hh868062.aspx

    第三个选项是使用必应空间数据服务并对您的数据进行批量地理编码。如果您有大型数据集,这是要使用的服务。您可以在单个请求中传递多达 200,000 行数据。此服务支持一种 CSV 文件格式,您可能很容易遵守。但是,如果您在免费使用条款下使用该服务,您将被限制为 50 行数据。 https://msdn.microsoft.com/en-us/library/ff701733.aspx

    这里有一些关于如何在 PHP 中使用这个服务的信息:https://msdn.microsoft.com/en-us/library/ff817006.aspx

    在使用这些服务时需要注意一些事项。首先是您只能将数据与 Bing 地图一起使用。您无法使用 Bing 地图服务对数据进行地理编码,然后在 Google 地图或任何其他不使用 Bing 地图的地图平台上显示坐标。

    第二个是 Bing Maps 允许您存储来自地理编码器的结果。大多数应用程序中使用的标准优化包括提前对数据进行地理编码。这将减少每次需要数据时重新对数据进行地理编码的需要。现在,在您的情况下,看起来任何人都可以上传 CSV 文件。您可以根据需要对所有行进行地理编码,但这会产生大量事务,并可能导致您快速达到免费使用条款限制。另一种选择是将结果存储在数据库中,然后在对数据进行地理编码时检查数据库,然后再将请求发送到 Bing Maps。这将节省您对任何数据的重新地理编码。

    了解速率限制也很好。基本帐户(免费帐户)受费率限制。当您的帐户在很短的时间内发出大量请求或服务器承受基本帐户的大量负载时,就会发生这种情况。发生的情况是某些请求将返回空响应。响应的标头将带有一个标志,指示请求受到限制。你可以在这里找到文档:https://msdn.microsoft.com/en-us/library/ff701703.aspx

    最后,如果您只是想在地图上查看数据,而不必基于网络。查看 Excel 2013 及更高版本的 Power Map。您将能够在几分钟内获取您的 CSV 并在地图上查看它,而无需编写任何代码。以下是 Power Map 上的一些有用资源:

    https://www.microsoft.com/en-us/download/details.aspx?id=38395

    https://support.office.com/en-us/article/Get-started-with-Power-Map-88A28DF6-8258-40AA-B5CC-577873FB0F4A

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多