2015-09-26 72 views
-2

我正在創建一個應用程序,讓用戶可以上傳CSV文件並從每行讀取地址並進行地理編碼。如何使用Bing Maps快速地對CSV文件中的地址進行地理編碼

我最初試圖用google map 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地圖API。

下面是一個CSV文件示例:

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

回答

0

Bing地圖並不限制你每天做的請求數,下使用的自由條款使用服務時,但有限制。基於Web的應用程序每年僅限於125,000次交易。

有了Bing地圖,有三種方法可以進行地理編碼。第一種方法是使用基於REST的服務,類似於您在Google Maps中使用的服務。您可以在此服務在這裏找到文檔: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地圖。您無法使用Bing地圖服務對數據進行地理編碼,然後在Google地圖或任何其他未使用Bing地圖的地圖平臺上顯示座標。

第二是Bing地圖允許您存儲來自地理編碼器的結果。大多數應用程序使用的標準優化包括提前對地理編碼數據進行編碼。這將減少每次需要數據時重新對數據進行地理編碼的需求。現在,就你而言,它看起來像任何人都可以上傳CSV文件。您可以根據需要對所有行進行地理編碼,但這會產生大量交易,並可能導致您快速實現免費使用限額。另一個選擇是將結果存儲在數據庫中,然後在將請求發送到Bing地圖之前,在對數據進行地理編碼時檢查數據庫。這將節省您對任何數據進行重新地理編碼。

瞭解速率限制也很好。基本賬戶(免費賬戶)受限速。這發生在您的帳戶在很短的時間內發出大量請求或服務器負擔很大的基本帳戶時發生。會發生什麼是一些請求將返回空響應。響應的標題將會有一個標誌,表明請求是有限的。你可以在這裏找到文檔:https://msdn.microsoft.com/en-us/library/ff701703.aspx

最後,如果你只是想在地圖上看到你的數據,它不一定是基於web的。看看Power Map for Excel 2013及更高版本。您可以在幾分鐘內將您的CSV文件在地圖上查看,而無需編寫任何代碼。下面是對電力地圖一些有用的資源:

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

相關問題