2012-05-07 260 views
4

編輯︰它現在可以工作,但不會加載如果用戶不允許或具有基於位置的服務。查看jsfiddle示例的已接受答案評論。Google Maps API(v3)添加/更新標記

我已經看過了幾個教程和問題,但我無法安靜地瞭解發生了什麼(或在這種情況下,沒有發生)。當用戶點擊鏈接時,我正在加載我的地​​圖。這會將用戶當前位置放置在中心的地圖以及用戶位置的標記。但是,if (navigation.location)之外的任何標記似乎都不會加載。以下是我當前的代碼:

function initialize() { 
     // Check if user support geo-location 
     if (navigator.geolocation) { 
      navigator.geolocation.getCurrentPosition(function(position) { 
       var point = new google.maps.LatLng(position.coords.latitude, position.coords.longitude); 
       var userLat = position.coords.latitude; 
       var userLong = position.coords.longitude; 
       var mapOptions = { 
        zoom: 8, 
        center: point, 
        mapTypeId: google.maps.MapTypeId.HYBRID 
       } 

      // Initialize the Google Maps API v3 
      var map = new google.maps.Map(document.getElementById("map"), mapOptions); 

      // Place a marker 
      new google.maps.Marker({ 
       position: point, 
       map: map, 
       title: 'Your GPS Location' 
      }); 
     }); 
    } else { 
     var userLat = 53; 
     var userLong = 0; 
     var mapOptions = { 
      zoom: 8, 
      center: new google.maps.LatLng(userLat, userLong), 
      mapTypeId: google.maps.MapTypeId.HYBRID 
     } 
     // Place a marker 
     new google.maps.Marker({ 
      position: point, 
      map: map, 
      title: 'Default Location' 
     }); 
     // Initialize the Google Maps API v3 
     var map = new google.maps.Map(document.getElementById("map"), mapOptions); 
    } 
    <? 
    for ($i = 0; $i < sizeof($userLocations); $i++) { 
     ?> 
     var userLatLong = new google.maps.LatLng(<? echo $userLocations[$i]['lat']; ?>, <? echo $userLocations[$i]['long']; ?>); 
     new google.maps.Marker({ 
      position: userLatLong, 
      map: map, 
      title:"<? echo $userLocations[$i]['displayName'] . ', ' . $userLocations[$i]['usertype']; ?>" 
     }); 
     <? 
    } 
    ?> 
} 

function loadMapScript() { 
    if (typeof(loaded) == "undefined") { 
     $("#showMap").css("display", "none"); 
     $("#showMapLink").removeAttr("href"); 
     $("#map").css("height", "600px"); 
     $("#map").css("width", "600px"); 
     var script = document.createElement("script"); 
     script.type = "text/javascript"; 
     script.src = "http://maps.googleapis.com/maps/api/js?key=MY_API_KEY&sensor=true&callback=initialize"; 
     document.body.appendChild(script); 
     loaded = true; 
    } else { 
     alert("Map already loaded!"); 
    } 
} 

loadMapScript()在用戶單擊鏈接時調用。 php for循環通過預先創建的數組與所有信息進行循環。
我猜我不完全理解,因爲當如果我把:

var userLatLong = new google.maps.LatLng(53, 0); 
      new google.maps.Marker({ 
       position: userLatLong, 
       map: map, 
       title:"Title" 
      }); 

到控制檯(谷歌瀏覽器),我得到的錯誤:

Error: Invalid value for property <map>: [object HTMLDivElement] 

我不噸,但是,否則會得到任何錯誤。任何幫助將非常感激! :)

+0

如何調用loadMapScript()? –

+0

當用戶點擊的鏈接'loadMapScript()' –

回答

8

navigator.geolocation.getCurrentPosition()是異步的。

重新組織你的代碼是這樣的:

var mapOptions = { 
    zoom: 8, 
    mapTypeId: google.maps.MapTypeId.HYBRID 
} 

function initialize() { 
    // Check if user support geo-location 
    if (navigator.geolocation) { 
     navigator.geolocation.getCurrentPosition(function(position) { 
      makeMap(position.coords.latitude, position.coords.longitude, 'Your GPS Location'); 
     }); 
    } else { 
     makeMap(53, 0, 'DefaultLocation'); 
    } 
} 

function makeMap(lat, lng, text) { 
    var point = new google.maps.LatLng(lat, lng); 
    mapOptions.center = point; 
    map = new google.maps.Map(document.getElementById("map"), mapOptions); 
    new google.maps.Marker({ 
     position: point, 
     map: map, 
     title: text 
    }); 
    <?php for ($i = 0; $i < sizeof($userLocations); $i++): ?> 
    var userLatLong = new google.maps.LatLng(<? echo $userLocations[$i]['lat']; ?>, <? echo $userLocations[$i]['long']; ?>); 
    new google.maps.Marker({ 
     position: userLatLong, 
     map: map, 
     title:"<? echo $userLocations[$i]['displayName'] . ', ' . $userLocations[$i]['usertype']; ?>" 
    }); 
    <?php endforeach ?> 
} 

另外,還要考慮Bootstrap逼近$ userLocations成JavaScript變量是這樣的:

var userLocations = <?php print json_encode($userLocations) ?>; 

然後執行你的JavaScript中循環,而不是混合語言。

+1

小提琴:http://jsfiddle.net/eSnhg/1/ – benastan

+0

將'var mapOptions'移到'makeMap'的內部,以便在頁面加載後加載地圖。它現在(似乎)工作。非常感謝你! –

+0

對不起,我說謊。如果用戶不允許定位(它沒有位置啓用的瀏覽器),它仍然不會加載。可以在你的jsfiddle例子中重複使用。 –

0

變化:

var map = new google.maps.Map(document.getElementById("map"), mapOptions); 

要:

map = new google.maps.Map(document.getElementById("map"), mapOptions); 

因爲var,地圖變量綁initialize()的範圍。刪除它會將其設置爲全局地圖變量(或window.map),使其在initialize()函數之外可用。

發生了什麼事你有一個HTML元素<div id="map">。在許多瀏覽器中,全局變量是從html元素ID創建的,因此map等於document.getElementById('map')


編輯:其實,這只是說明了在Chrome控制檯您的問題。在嘗試將標記附加到標記之前,您需要設置map,正如您在if (navigator.geolocation) {}中所做的那樣。這也解釋了爲什麼沒有放置用戶位置標記。放置它們的代碼在initialize()之前運行。將此代碼放在initialize或其自己的函數內,並從initialize調用該函數。

+0

其將所述標記物的代碼是'初始化()'函數內,並且map'的'的聲明之後談到。我確實發現了你的第一個變化,但正如你所說,這不是問題。 –

+0

對不起。我也重新嘗試了初始更改,並在'initialize()'函數的頂部聲明'var map;',但沒有喜悅。 –

+0

您是否在瀏覽器上進行了未經地理位置檢測的測試? 'navigator.geolocation.getCurrentPosition()'是異步的,而繪製點的代碼是同步的。它在回調之前運行,其中您初始化您的谷歌地圖。 – benastan

0

它看起來像你正在創造的標記,但沒有做任何事情。嘗試改變你的新標記看起來像這樣:

var marker = new google.maps.Marker({ 
       position: point, // this won't actually work - point is out of scope 
       title: 'Your GPS Location' 
      }); 

marker.setMap(map); 

編輯:確保點位於地圖內!

var bounds = new google.maps.LatLngBounds(); 
bounds.extend(point); 
map.fitBounds(bounds); 
+0

這不是必需的;包括一個'map'屬性作爲傳遞給'google.maps.Marker'構造函數的'MapOptions'對象的一部分來處理它。它看起來像一個範圍問題。 –

+0

試過'變種userLatLong =新google.maps.LatLng(<回聲$ userLocations [$ i]於[ 'LAT'];?>,<?回聲$ userLocations [$ I] [ '長'];>); \t \t \t變種標記=新google.maps.Marker({ \t \t \t \t位置:userLatLong, \t \t \t \t圖:圖, \t \t \t \t標題:「<回聲$ userLocations [$ i]於[ '的displayName'] ' '$ userLocations [$ i]於[' 的用戶類型'];?>」 \t \t \t}); \t \t \t marker.setMap(地圖); \t \t \t的console.log(+ userLatLong '在userLatLong =添加標記');'這使得一個日誌中的控制檯,但沒有標記。編輯:哎呀,這不是很好格式化:( –

+0

嗯,我不記得爲什麼,但我在我的代碼上面,它的工作原理:)但問題可能是,點var不在範圍內。 – chris

1

你試過:

var map = null; 
function initialize() { ... } 

,然後改變裏面的代碼:

map = new google.maps.Map(...); //make this the first line 
if (navigator.geolocation) { 
    // Change the code from: 
    var map ... 
    // to: 
    map ... 

你剛纔引用的直接映射(不var)其他地方,所以應該工作。