2012-07-05 54 views
4

so .. 我遇到了一個可能非常普遍的問題。zoom in google maps API - 城市vs國家不同

剛開始執行谷歌地圖API,而下面是我的代碼,以解決城市變成緯度/朗中心地圖有:

function SetMapAddress(address) { // "London, UK" for example 
    var geocoder = new google.maps.Geocoder(); 
    if (geocoder) { 
    geocoder.geocode({ 'address': address }, function (results, status) { 
    if (status == google.maps.GeocoderStatus.OK) { 
     var loc = results[0].geometry.location; 
     document.map.setCenter(new google.maps.LatLng(loc.lat(),loc.lng(), 13)); 
    } 

的問題是,我傳遞一個靜態變焦(13) 。

如果有人輸入國家的名稱,我想縮小更多。如果它是一個城市,我想放大更多等..

我唯一能想到的是找出適當的縮放每個城市和國家,將它們存儲在一些散列,並嘗試圖這是正在使用,通過適當的縮放。

也許谷歌想到更聰明的做法?

回答

6

地理編碼器返回"recommended" viewport

,你可以在你的SetMapAddress函數中使用這樣的:

function SetMapAddress(address) { // "London, UK" for example 
    var geocoder = new google.maps.Geocoder(); 
    if (geocoder) { 
     geocoder.geocode({ 'address': address }, function (results, status) { 
     if (status == google.maps.GeocoderStatus.OK) { 
      document.map.fitBounds(results[0].geometry.viewport); 
     } 
     }); 
    } 
} 
+0

真棒,完全工作。不過,我希望它放大一點。它現在可以進行可變縮放,但他的目標總是在地圖的中間60%。我希望它填充地圖..任何方式來做到這一點? –

+0

我想我可以在每次重置後在document.map.zoom上做一個++? –

+0

結果中還返回一個邊界,文檔將其描述爲「此GeocodeResult的精確邊界,如果適用」。它可能(如果存在的話)比「推薦」視口更接近縮放。 – geocodezip

1

地理編碼結果爲查詢提供了包含Address component typesaddress_components數組。

從我非常有限的測試中,查詢中添加的信息越多,address_components數組越長。當輸入「法國」時,它只是以下內容:

> Object 
long_name: "France" 
short_name: "FR" 

types: Array[2] 
> 0: "country" 
> 1: "political" 

當添加城市時,有一個名爲「locality」的類型。所以,你可以遍歷這個數組檢查long_names和用戶輸入的內容是否匹配,如果只輸入一個城市或國家,這很容易,但是可能有很多變化,比如羅馬/羅馬意大利(拼寫差異) ,如果用戶同時進入城市和鄉村,則必須優先考慮城市。

最後,這聽起來像是一種非常模糊的搜索與匹配,即使您構建了自己的散列以將用戶輸入與可能的場所表示相匹配。

這裏是我偷懶的辦法:

創建var mapZoom = 13;(假設它是一個城市)

檢查整個用戶輸入實際上是一個國家的名字:如果它匹配的LONG_NAME和條目的類型是「國家「,下圖縮放爲5.

將此setZoom變量應用於setCenter。

+0

很酷。將試驗這個! –

0

另一個(有時也會出現問題)的解決方案是算address_components數組的長度。

正如Tina CG Hoehr在不同的回答中所提到的,places對象有一個address_components數組。該數組包含地址的不同部分。

您可以測試address_components數組的長度並適當地設置縮放級別。

建立在你的代碼示例,

function SetMapAddress(address) { // "London, UK" for example 
    var geocoder = new google.maps.Geocoder(); 
    if (geocoder) { 
     geocoder.geocode({ 'address': address }, function (results, status) { 
     if (status == google.maps.GeocoderStatus.OK) { 
      var loc = results[0].geometry.location; 



      // Test address_components 
      var ac_length = results[0].address_components.length; 

      if (ac_length == 1) { 
       // Assume country 
       document.map.setCenter(new google.maps.LatLng(loc.lat(),loc.lng(), 3)); 

      } else if (ac_length == 2) { 
       // Assume city 
       document.map.setCenter(new google.maps.LatLng(loc.lat(),loc.lng(), 7)); 

      } else { 
       // Everything else can have a standard zoom level 
       document.map.setCenter(new google.maps.LatLng(loc.lat(),loc.lng(), 13)); 
      } 



     } 
    } 
} 

這種方法似乎工作沒關係。在澳大利亞的地址進行測試我發現有些郊區有郵編,有些則沒有 - 改變郵編的長度。沒有郵政編碼的人似乎是在人口較少的地區,因此對於這些人來說,縮放比例較低適合我的目的。