Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何使用Bing地图在CSV文件中快速对地址进行地理编码_Php_Google Maps_Csv_Bing Maps_Bing Api - Fatal编程技术网

Php 如何使用Bing地图在CSV文件中快速对地址进行地理编码

Php 如何使用Bing地图在CSV文件中快速对地址进行地理编码,php,google-maps,csv,bing-maps,bing-api,Php,Google Maps,Csv,Bing Maps,Bing Api,我正在创建一个应用程序,允许用户上传一个CSV文件,并从每一行读取一个地址并进行地理编码 我最初尝试使用GoogleMapAPI来实现这一点。但经过一些研究,我发现谷歌地图api有很多局限性。例如,您一天只能执行2500个查询,而且每个查询都需要一个时间延迟 这是我迄今为止编写的代码: <script src="http://maps.googleapis.com/maps/api/js"></script> <script src="https://ajax.go

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

我最初尝试使用GoogleMapAPI来实现这一点。但经过一些研究,我发现谷歌地图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地图API实现这一点

以下是一个示例CSV文件:


Bing地图不会限制您每天的请求数量,但是在免费使用条款下使用该服务时会有限制。基于Web的应用程序每年的交易量限制为125000笔

使用Bing地图有三种方法进行地理编码。第一种方法是使用基于REST的服务,类似于您在Google地图上使用的服务。您可以在此处找到有关此服务的文档:

如果您使用此服务,我还建议您查看最佳实践文档:

您还可以在此处找到有关如何在PHP中使用此服务的一些提示:

可以使用地理编码的第二种方法是使用Bing地图中的搜索模块。搜索模块包装REST服务并将其公开为易于使用的JavaScript库

第三种选择是使用Bing空间数据服务并对数据进行批量地理编码。如果您有大型数据集,这就是要使用的服务。一次请求最多可以传入200000行数据。此服务支持一种CSV文件格式,您可以轻松地遵守该格式。但是,如果您在免费使用条款下使用该服务,则最多只能使用50行数据

以下是有关如何在PHP中使用此服务的一些信息:

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

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

了解速率限制也很好。基本账户(免费账户)受利率限制。当您的帐户在很短的时间内发出大量请求时,或者当服务器承受来自基本帐户的大量负载时,就会发生这种情况。发生的情况是,一些请求将返回空响应。响应的标头将有一个标志,指示请求受到限制。您可以在此处找到此文档:

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