我正在创建一个应用程序,允许用户上传CSV文件并从每行读取地址并进行地理编码。
我最初尝试使用Google地图API执行此操作。但经过一些研究后我发现谷歌地图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
答案 0 :(得分:0)
Bing Maps不会限制您每天发出的请求数量,但在免费使用条款下使用该服务时存在限制。基于Web的应用程序每年限制为125,000次交易。
使用Bing Maps,有三种方法可以进行地理编码。第一种方法是使用基于REST的服务,类似于您在Google地图中使用的服务。您可以在此处找到有关此服务的文档: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
第三个选项是使用Bing Spatial Data Services并批量地对您的数据进行地理编码。如果您有大型数据集,则这是要使用的服务。您可以在一个请求中传递最多200,000行数据。此服务支持CSV文件格式,您可能很容易遵守该格式。但是,如果您在免费使用条款下使用该服务,则限制为50行数据。 https://msdn.microsoft.com/en-us/library/ff701733.aspx
以下是有关如何在PHP中使用此服务的一些信息:https://msdn.microsoft.com/en-us/library/ff817006.aspx
使用任何这些服务时,有几点需要注意。首先,您只能将数据与Bing Maps一起使用。您无法使用Bing地图服务对数据进行地理编码,然后在Google地图或任何其他不使用Bing地图的地图平台上显示坐标。
第二个是Bing Maps允许您存储地理编码器的结果。在大多数应用程序中使用的标准优化包括提前对数据进行地理编码。这将减少每次需要数据时重新对数据进行地理编码的需要。现在,在您的情况下,任何人都可以上传CSV文件。您可以根据需要对所有行进行地理编码,但这会产生大量事务,并可能导致您快速达到免费使用条款限制。另一种选择是将结果存储在数据库中,然后在对数据进行地理编码之前检查数据库,然后再将请求发送到Bing Maps。这将节省您重新对任何数据进行地理编码。
了解速率限制也很好。基本帐户(免费帐户)受限于费率。当您的帐户在很短的时间内发出大量请求或服务器受到基本帐户的大量负载时,就会发生这种情况。会发生一些请求将返回空响应。响应的标头将有一个标志,表明请求是有限的。您可以在此处找到文档:https://msdn.microsoft.com/en-us/library/ff701703.aspx
最后,如果您只是想在地图上查看数据而且不必基于网络。请查看Power Map for Excel 2013及更高版本。您可以在几分钟内获取CSV并在地图上查看,而无需编写任何代码。以下是Power Map上的一些有用资源:
https://www.microsoft.com/en-us/download/details.aspx?id=38395