2012-05-27 55 views
3

在我的腳本中,當您將人員放到地圖上時,它會使用自定義小地圖加載街景視圖。你可以看到對手的小地圖,並將其移動到街景視圖,並且工作正常。街景視圖API 3(添加自定義小地圖)關閉按鈕街景視圖和Pegman

但是,當您單擊街景視圖上的關閉按鈕時,小地圖和街景視圖會很好地關閉,但是人員不會返回到其默認位置。它停留在地圖上,不能重新放置。

當街景視圖關閉時,我想要將人員移回到默認位置,並且如果您再次將其放置在地圖上以像第一次一樣加載街景視圖。

在線代碼http://jsbin.com/ayejim/edit#preview

這是我的功能initialize

function initialize() { 
var lifestyle = [{}]; 
    var myOptions = { 
    zoom: CITY_MAP_ZOOMING_FACT, 
    center: new google.maps.LatLng(CITY_MAP_CENTER_LAT, CITY_MAP_CENTER_LNG), 
    mapTypeId: google.maps.MapTypeId.<?php echo $maptype;?> 

    } 
    map = new google.maps.Map(document.getElementById("map_canvas"),myOptions); 
    map.setOptions({styles: lifestyle}); 

    ///////////////////////////// 
    var g = google.maps; 
    var pano, mini; 
    var mapdiv = document.getElementById("map_canvas"); 

    pano = map.getStreetView(); 


    /** Listen to panorama's visibility changes to detect 
    * when pegman is dropped onto the map 
    * and when Street view is closed 
    */ 

    g.event.addListener(pano, "visible_changed", function() { 
    // Street view activated by dropping pegman 
    if (!mini && pano.getVisible()) { 
    // Container for mini map and close button 

    var c = document.createElement("div"); 
    c.id = "minimap"; 
    c.style.visibility = "visible"; 

    var d = document.createElement("div"); 
    d.id = "closebutton"; 
    d.onclick = function() { 
    // Toggles button icon and moves copyright notice 
    var terms = document.getElementById("note"); 
// var terms = mapdiv.childNodes[1].childNodes[2]; 
     if (c.style.visibility == "visible") { 
     c.style.visibility = "hidden"; 
     d.className = "closed"; 
     terms.style.marginRight = "24px"; 
     } 
     else { 
     c.style.visibility = "visible"; 
     d.className = ""; 
     terms.style.marginRight = "170px"; 
     } 
    }; 

    c.appendChild(d); 
    mapdiv.appendChild(c); 
    mapdiv.appendChild(d); 

    mini = new g.Map(c, { 
     center: pano.getPosition(), 
     zoom: 15, 
     mapTypeId: "roadmap", 
     disableDefaultUI: true, 
     streetViewControl: true, 
     streetView: pano, 
     styles: lifestyle 

    }); 

    /** Moves the 'Terms' notice to the left 
    * to ensure it's not covered up. 
    * There are two such notices in the document. 
    * Make sure to catch the right ones. 
    */ 
    g.event.addListener(mini, "tilesloaded", function() { 
    var terms = mini.getDiv().firstChild.childNodes[2]; 
    terms.style.marginRight = "24px"; 
    var sv_terms = mapdiv.childNodes[1].childNodes[2]; 
    sv_terms.id = "note"; 
    sv_terms.style.marginRight = "170px"; 
    sv_terms.style.zIndex = "1"; 
    }); 
    // Binds mini map's center to pano position 
    mini.bindTo("center", pano, "position"); 

    // Street view finished by click on Street view close button 
    } else if (mini instanceof g.Map && !pano.getVisible()) { 
    mapdiv.removeChild(document.getElementById("minimap")); 
    **//initialize(); if try call initialize again pegman back default position but map back to default position too like the first time.and markers hide , i don't know why this happens** 
    } 
}); 
///////////////////////// 
    mgr = new MarkerManager(map); 
    google.maps.event.addListener(mgr, 'loaded', function() { 
     if (markers) { 
     for (var level in markers) { 
      google.maps.event.addDomListener(document.getElementById(level), 'click', function() { 
       setCategoryVisiblity(this.id, this.checked); 
      }); 
      for (var i = 0; i < markers[level].length; i++) { 

       var details = markers[level][i]; 
       var image = new google.maps.MarkerImage(details.icons,new google.maps.Size(PIN_POINT_ICON_WIDTH, PIN_POINT_ICON_HEIGHT)); 
       var myLatLng = new google.maps.LatLng(details.location[0], details.location[1]); 
       <?php if(get_current_city_set_zooming_opt() == '1') { ?> 
       multimarkerdata[i] = new google.maps.LatLng(details.location[0], details.location[1]); 
       <?php } ?> 
       markers[level][i] = new google.maps.Marker({ 
        title: details.name, 
        position: myLatLng, 
        icon: image, 
        clickable: true, 
        draggable: false, 
        flat: true, 
        animation: google.maps.Animation.DROP 
       }); 


      attachMessage(markers[level][i], details.message); 
      } 
      mgr.addMarkers(markers[level], 0); 
     } 
      <?php if(get_current_city_set_zooming_opt() == '1') { ?> 
      var latlngbounds = new google.maps.LatLngBounds(); 

      for (var j = 0; j < multimarkerdata.length; j++) 
       { 
       latlngbounds.extend(multimarkerdata[ j ]); 
       } 
       map.fitBounds(latlngbounds); 
      <?php } ?> 
     mgr.refresh(); 
     } 
    }); 

    // but that message is not within the marker's instance data 
    function attachMessage(marker, msg) { 
     var myEventListener = google.maps.event.addListener(marker, 'click', function() { 
     if (pano.getVisible()) { 
     infowindow.open(pano, marker); 
     } else { 
     infowindow = new google.maps.InfoWindow(
      { content: String(msg) 
      }); 
     infowindow.open(map, marker); 
     } 
     if (infowindow) infowindow.close(); 
     infowindow = new google.maps.InfoWindow(
      { content: String(msg) 
      }); 
     infowindow.open(map,marker); 
     }); 
    } 

} 

google.maps.event.addDomListener(window, 'load', initialize); 
+1

這是一個很好的概念,我嘗試了一些想法,我發現谷歌搜索「sticky pegman」和「pegman reset」,特別是手動設置'map.getStreetView()。setVisible(false);'。它沒有工作:(至少我可以做的是留下一個正在運行的「演示」,讓其他人看到並嘗試解決你的問題。你必須做的是放置pegman,關閉街景,然後返回到地圖,注意pegman如何「禁用」,移動它不會重新打開一個新的街景,並且您不能將他放回到他的出發地點。** DEMO HERE ** http://jsbin.com/ayejim /編輯#預覽 –

+0

謝謝莉莉亞娜,我在帖子中添加Demo,我希望有人能幫助我,這個概念很好,就像你說的 – Gustavo

+0

看看這個莉莉安娜,http://jsfiddle.net/spiderplant0/fubNj/7 /此演示使用setVisible(false),並且當您將pegman放置到默認的現場街景視圖時,也可以停止,但我無法在我的腳本中使其工作 – Gustavo

回答

6

不完全知道爲什麼當前的代碼不工作,但我也對你的做法」有點懷疑重新獲取當前的代碼。爲什麼不爲全景(streetview)製作單獨的div,並對map_canvas div做一些樣式來複制當前的方法(而不是使用minimap div)。我在這個jsfiddle(源代碼的http://jsfiddle.net/svigna/FnrbX/embedded/result/http://jsfiddle.net/svigna/FnrbX/)中創建了一個基礎,您可以檢查並可能將其用作解決方案的基礎。

允許我引導你瀏覽我的代碼 - 查看一下streetView類屬性和jQuery,我相信你的問題可以得到解決。

<body onload="initialize()"> 
    <div id="container"> 
    <div id="map_canvas" class="bigmap"></div> 
    <div id="pano" class="bigmap" style="display:none"></div> 
</div> 

第一件事就是第一,在我們想聲明的地圖和全景一個div,這將被綁定到地圖div的,加價。我們將其聲明在容器中用於樣式目的(當我們想要將地圖重疊在全景圖上時)。請注意,全景圖的樣式初始設置爲display:none,否則您將看到一個灰色區域(這是沒有任何位置數據的全景圖,因爲沒有設置對位圖)。

#container { 
    width: 940px; 
    height: 640px; 
    position: relative; 
} 
#map_canvas, 
#pano { 
    position: absolute; 
    top: 0; 
    left: 0; 
} 
#map_canvas { 
    z-index: 10; 
} 
.bigmap{ 
    width:100%; 
    height:100%; 
} 

.minimap{ 
    width:480px; 
    height:320px; 
} 

這裏的造型基本上設置爲有可能使當衣夾被丟棄的map_canvas提供DIV重疊在全景股利。我用這個解決方案的概念爲div重疊(How to overlay one div over another div)。 .minimap和.bigmap類可以輕鬆地將map_canvas從一個視圖切換到另一個視圖,這在下面的javascript部分中會更有意義。

function initialize() { 
    var fenway = new google.maps.LatLng(42.345573,-71.098326); 
    var panoramaOptions = { 
    enableCloseButton : true, 
    visible: false 
    }; 
    var panorama = new google.maps.StreetViewPanorama(document.getElementById("pano"), panoramaOptions); 
    var mapOptions = { 
    center: fenway, 
    zoom: 14, 
    mapTypeId: google.maps.MapTypeId.ROADMAP, 
    streetView : panorama 
    }; 
    var map = new google.maps.Map(document.getElementById("map_canvas"), mapOptions); 

至此在javascript中我們初始化了所有的地圖內容。這是相當自我解釋,看看在這裏設置的屬性看看谷歌地圖api v3參考 - 我發現它是非常有用的。

google.maps.event.addListener(panorama, "visible_changed", function() { 
    if (panorama.getVisible() && $("#pano").is(':visible')){ 
     //moving the pegman around the map 
    }else if(panorama.getVisible() && $("#pano").is(':hidden')){ 
     $("#pano").show();   
     $("#map_canvas").removeClass('bigmap'); 
     $("#map_canvas").addClass('minimap'); 
    } 
    google.maps.event.addListener(panorama, "closeclick", function() { 
     $("#pano").hide(); 
     $("#map_canvas").removeClass('minimap'); 
     $("#map_canvas").addClass('bigmap');   
    }); 
    });   
} 

注意:事件偵聽器仍在initialize()函數中聲明。但本質上,我們傾聽全景可見性的變化,但僅憑這一點還不足以確定pano div元素中是否存在實際數據。請記住,當我們將pano div顯示設置爲none時,我們可以使用jquery來檢查可見性。如果它是可見的,那意味着它不是pegman的初始放置 - 如果它隱藏了,那麼我們將map_canvas的類更改爲minimap。另請注意,我們正在偵聽「visible_changed」偵聽器中的closeclick。這是因爲visible_changed還包含closeclick動作,所以通過將其放入內部,我們將偵聽器綁定到另一個動作。一旦觸發closeclick,我們就會隱藏pano div並將map_canvas改回到正常大小。

這種方法的好處是在街景視圖上的本地「closeclick」動作將pegman從它設置的地圖上移開並將其返回到正常狀態(這是您的問題所在)。另外,要回到原來的位置,只需在「closeclick」事件監聽器上對初始位置執行map.panTo()即可。

我希望這是你正在尋找的東西,如果它遠離我的道歉!我知道它本質上是要求你重新設計你當前的代碼結構 - 但只是認爲這種方法簡單得多,而且似乎做了你想做的同樣的事情。

+1

這裏有一些好東西+1。但是,您可能需要確保API知道當事物被隱藏並重新顯示時,通過顯式觸發'resize'事件來調整地圖的尺寸​​(或者它可能只是一個artifa ct使用jsFiddle,但目前你的例子沒有得到大小正確的地圖顯示) –

+0

是的,謝謝你。我發現如果我把監視員從480x320視口中移出,地圖就會被切斷。但是調用resize事件可能會訣竅。 –

+1

我喜歡這個答案的簡單性:)我在這裏「增強」它http://jsbin.com/olayiw/edit#preview目標是爲了更接近Gustavo所擁有的行爲(比如中心pegman),並確保大部分例如,可用性很乾淨,將人員安置在河中將恢復到大地圖。不過,我不知道如何將佩格曼放在他的位置時達到這個結果。 –