2012-03-26 57 views
1

我已經創建一個基於這個例子從麥克威廉姆斯V3谷歌地圖http://www.geocodezip.com/v3_MW_example_linktomap.html傳遞XML標記,以谷歌地圖

我雖然遇到了一點問題。如果我的網址中沒有參數,那麼我會收到錯誤「id is undefined idmarkers [id.toLowerCase()] = marker;」在Firebug中只會出現一個標記。如果我有一個參數(例如,?id = 105),那麼所有邊欄鏈接都會說105(或者URL中的任何參數),而不是XML文件中列出的各自的標籤,並且將會打開一個隨機的infowindow,而不是在URL中的ID窗口。下面是我的javascript:

 var map = null; 
     var lastmarker = null; 
       // ========== Read paramaters that have been passed in ========== 

       // Before we go looking for the passed parameters, set some defaults 
       // in case there are no parameters 
     var id; 
     var index = -1; 

       // these set the initial center, zoom and maptype for the map 
       // if it is not specified in the query string 
     var lat = 42.194741; 
     var lng = -121.700301; 
     var zoom = 18; 
     var maptype = google.maps.MapTypeId.HYBRID; 

     function MapTypeId2UrlValue(maptype) { 
      var urlValue = 'm'; 
      switch (maptype) { 
      case google.maps.MapTypeId.HYBRID: urlValue = 'h'; 
       break; 
      case google.maps.MapTypeId.SATELLITE: urlValue = 'k'; 
       break; 
      case google.maps.MapTypeId.TERRAIN: urlValue = 't'; 
       break; 
      default: 
      case google.maps.MapTypeId.ROADMAP: urlValue = 'm'; 
       break; 
      } 
      return urlValue; 
     } 
       // If there are any parameters at eh end of the URL, they will be in location.search 
       // looking something like "?marker=3" 

       // skip the first character, we are not interested in the "?" 
     var query = location.search.substring(1); 

       // split the rest at each "&" character to give a list of "argname=value" pairs 
     var pairs = query.split("&"); 
     for (var i = 0; i < pairs.length; i++) { 
      // break each pair at the first "=" to obtain the argname and value 
      var pos = pairs[i].indexOf("="); 
      var argname = pairs[i].substring(0, pos).toLowerCase(); 
      var value = pairs[i].substring(pos + 1).toLowerCase(); 

      // process each possible argname - use unescape() if theres any chance of spaces 
      if (argname == "id") { id = unescape(value); } 
      if (argname == "marker") { index = parseFloat(value); } 
      if (argname == "lat") { lat = parseFloat(value); } 
      if (argname == "lng") { lng = parseFloat(value); } 
      if (argname == "zoom") { zoom = parseInt(value); } 
      if (argname == "type") { 
       // from the v3 documentation 8/24/2010 
       // HYBRID This map type displays a transparent layer of major streets on satellite images. 
       // ROADMAP This map type displays a normal street map. 
       // SATELLITE This map type displays satellite images. 
       // TERRAIN This map type displays maps with physical features such as terrain and vegetation. 
       if (value == "m") { maptype = google.maps.MapTypeId.ROADMAP; } 
       if (value == "k") { maptype = google.maps.MapTypeId.SATELLITE; } 
       if (value == "h") { maptype = google.maps.MapTypeId.HYBRID; } 
       if (value == "t") { maptype = google.maps.MapTypeId.TERRAIN; } 

      } 
     } 

       // this variable will collect the html which will eventually be placed in the side_bar 
     var side_bar_html = ""; 

       // arrays to hold copies of the markers and html used by the side_bar 
       // because the function closure trick doesnt work there 
     var gmarkers = []; 
     var idmarkers = []; 

       // global "map" variable 
     var map = null; 
     // A function to create the marker and set up the event window function 
     function createMarker(point, icon, label, html) { 
      var contentString = html; 
      var marker = new google.maps.Marker({ 
       position: point, 
       map: map, 
       title: label, 
       icon: icon, 
       zIndex: Math.round(point.lat() * -100000) << 5 
      }); 
      marker.id = id; 
      marker.index = gmarkers.length; 
      google.maps.event.addListener(marker, 'click', function() { 
       lastmarker = new Object; 
       lastmarker.id = marker.id; 
       lastmarker.index = marker.index; 
       infowindow.setContent(contentString); 
       infowindow.open(map, marker); 
      }); 
      // save the info we need to use later for the side_bar 
      gmarkers.push(marker); 
      idmarkers[id.toLowerCase()] = marker; 
      // add a line to the side_bar html 
      side_bar_html += '<a href="javascript:myclick(' + (gmarkers.length - 1) + ')">' + id + '<\/a><br>'; 
     } 

       // This function picks up the click and opens the corresponding info window 
     function myclick(i) { 
      google.maps.event.trigger(gmarkers[i], "click"); 
     } 

     function makeLink() { 
      var mapinfo = "lat=" + map.getCenter().lat().toFixed(6) 
       + "&lng=" + map.getCenter().lng().toFixed(6) 
        + "&zoom=" + map.getZoom() 
         + "&type=" + MapTypeId2UrlValue(map.getMapTypeId()); 
      if (lastmarker) { 
       var a = "/about/map/default.aspx?id=" + lastmarker.id + "&" + mapinfo; 
       var b = "/about/map/default.aspx?marker=" + lastmarker.index + "&" + mapinfo; 
      } else { 
       var a = "/about/map/default.aspx?" + mapinfo; 
       var b = a; 
      } 

      document.getElementById("idlink").innerHTML = '<a href="' + a + '" id=url target=_new>- Link directly to this page by id</a> (id in xml file also entry &quot;name&quot; in sidebar menu)'; 
      document.getElementById("indexlink").innerHTML = '<a href="' + b + '" id=url target=_new>- Link directly to this page by index</a> (position in gmarkers array)'; 
     } 


     function initialize() { 
      // create the map 
      var myOptions = { 
       zoom: zoom, 
       center: new google.maps.LatLng(lat, lng), 
       mapTypeId: maptype, 
       mapTypeControlOptions: { style: google.maps.MapTypeControlStyle.DROPDOWN_MENU }, 
       navigationControl: true, 
       mapTypeId: google.maps.MapTypeId.HYBRID 
      }; 
      map = new google.maps.Map(document.getElementById("map_canvas"), 
       myOptions); 
      var stylesarray = [ 
       { 
        featureType: "poi", 
        elementType: "labels", 
        stylers: [ 
         { visibility: "off" } 
        ] 
       }, 
       { 
        featureType: "landscape.man_made", 
        elementType: "labels", 
        stylers: [ 
         { visibility: "off" } 
        ] 
       } 
      ]; 
      var options = map.setOptions({ styles: stylesarray }); 
      // Make the link the first time when the page opens 
      makeLink(); 

      // Make the link again whenever the map changes 
      google.maps.event.addListener(map, 'maptypeid_changed', makeLink); 
      google.maps.event.addListener(map, 'center_changed', makeLink); 
      google.maps.event.addListener(map, 'bounds_changed', makeLink); 
      google.maps.event.addListener(map, 'zoom_changed', makeLink); 

      google.maps.event.addListener(map, 'click', function() { 
       lastmarker = null; 
       makeLink(); 
       infowindow.close(); 
      }); 
      // Read the data from example.xml 
      downloadUrl("example.xml", function (doc) { 
       var xmlDoc = xmlParse(doc); 
       var markers = xmlDoc.documentElement.getElementsByTagName("marker"); 
       for (var i = 0; i < markers.length; i++) { 
        // obtain the attribues of each marker 
        var lat = parseFloat(markers[i].getAttribute("lat")); 
        var lng = parseFloat(markers[i].getAttribute("lng")); 
        var point = new google.maps.LatLng(lat, lng); 
        var html = markers[i].getAttribute("html"); 
        var label = markers[i].getAttribute("label"); 
        var icon = markers[i].getAttribute("icon"); 
        // create the marker 
        var marker = createMarker(point, icon, label, html); 
       } 
       // put the assembled side_bar_html contents into the side_bar div 
       document.getElementById("side_bar").innerHTML = side_bar_html; 
       // ========= If a parameter was passed, open the info window ========== 
       if (id) { 
        if (idmarkers[id]) { 
         google.maps.event.trigger(idmarkers[id], "click"); 
        } else { 
         alert("id " + id + " does not match any marker"); 
        } 
       } 
       if (index > -1) { 
        if (index < gmarkers.length) { 
         google.maps.event.trigger(gmarkers[index], "click"); 
        } else { 
         alert("marker " + index + " does not exist"); 
        } 
       } 
      }); 
     } 

     var infowindow = new google.maps.InfoWindow(
      { 
       size: new google.maps.Size(150, 50) 
      }); 

     google.maps.event.addDomListener(window, "load", initialize); 

,這裏是我的XML格式

<marker lat="42.196175" 
     lng="-121.699224" 
     html="This is the information about 104" 
     iconimage="/about/map/images/104.png" 
     label="104" /> 

UPDATE的例子:我有一個基本的地圖工作。我在這裏想要完成的是能夠爲標記分配ID,以便在從外部URL加載頁面時觸發特定的標記。它適用於示例頁面。我實際上已經在我的頁面上進行了部分工作(只要我不嘗試合併自定義圖標)。

+0

爲什麼要解析查詢字符串?您的ID是全球性的,無論是否定義,您都可以在createMarker中使用您的所有標記。 – 2012-03-27 10:40:53

+0

解析字符串的原因是,當頁面加載時(如上面的示例鏈接所示),可以使外部鏈接觸發特定標記/ infowindow以便打開。 – djmadscribbler 2012-03-27 15:57:47

回答

1

正如我試圖說的。你有一個全球的:

var id; 

而且它似乎設置(或不)的唯一地方是從查詢字符串。 然而,當你通過你的xml輸入循環時,你可以調用createMarker(),它使用全局id。

function createMarker(point, icon, label, html) { 
     var contentString = html; 
     var marker = new google.maps.Marker({ 
      position: point, 
      map: map, 
      title: label, 
      icon: icon, 
      zIndex: Math.round(point.lat() * -100000) << 5 
     }); 
     marker.id = id; 


.... 

因此,每個標記都獲得相同的ID。如果我是你,我會將「id」添加到xml文件中作爲另一個屬性,並從那裏設置它並使用查詢字符串id來執行您的選擇邏輯。

+0

謝謝埃裏克 - 這讓我看着正確的領域,現在我有它的工作。 – djmadscribbler 2012-03-28 18:19:56