Php 如何使用Bing地图在CSV文件中快速对地址进行地理编码
我正在创建一个应用程序,允许用户上传一个CSV文件,并从每一行读取一个地址并进行地理编码 我最初尝试使用GoogleMapAPI来实现这一点。但经过一些研究,我发现谷歌地图api有很多局限性。例如,您一天只能执行2500个查询,而且每个查询都需要一个时间延迟 这是我迄今为止编写的代码: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
<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并在地图上查看它,而无需编写任何代码。以下是电源图上的一些有用资源: