2013-08-05 2 views
2

George MacKerron의 위대한 spiderfier 인 https://github.com/jawj/OverlappingMarkerSpiderfier-Leaflet 을 사용하면 문제가 있습니다.전단지 마커 click spiderfy

핀을 클릭하면 팝업이 표시됩니다. 그건 내가 멋지다 핀이 겹치지 않는 한 멋지다. spiderfied 핀의 문제는 spiderfied 세트의 다른 핀들과 겹치지 만 첫 번째 클릭시 열리는 팝업입니다.

따라서 spiderfying 직후에 팝업을 닫을 수있는 spiderfy-listener에 대한 클릭 콜백이 필요합니다. 또는 더 나은, 직접 spiderfying하기 전에.

질문은 : 어떻게하면 spiderfy-listener에서 콜백을 얻을 수 있습니까? 글쎄, 어쩌면 그 일을하는 것은 벙어리 일 수도 있습니다. 그 경우에는 무엇을해야할 지 말해주세요. 감사합니다 :)

괴팍스러운 20ms의 내가 유지하려는하지는 바닥에 해킹 사용

내 코드 :

// Kartendarstellung mit Spiderfier 
    var map = L.map('basicMap').setView(new L.LatLng(position[0][0], position[0][1]), 13); 
    map.doubleClickZoom.disable(); 
    var oms = new OverlappingMarkerSpiderfier(map, { 
     keepSpiderfied: true, 
     nearbyDistance: 25, 
     legWeight: 2 
    }); 

    L.tileLayer('http://{s}.tile.cloudmade.com/BC9A493B41014CAABB98F0471D759707/997/256/{z}/{x}/{y}.png', { 
     maxZoom: 18, 
     attribution: 'Kartendaten &copy; <a href="http://openstreetmap.org">OpenStreetMap</a> und Mitwirkende, Lizenz: <a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, Bilddaten © <a href="http://cloudmade.com">CloudMade</a>' 
    }).addTo(map);  

    for (var i = 1; i < <?php echo count($pos);?>; i++){ 
     switch(position[i][3]){ 
      case "B": 
       marker = L.marker([position[i][0], position[i][1]],{icon: BIcon}).addTo(map); 
       break; 
      case "S": 
       marker = L.marker([position[i][0], position[i][1]],{icon: SIcon}).addTo(map); 
       break;  
     } 
     // Marker ungeöffnet auf Karte setzen 
     var popup = new L.popup(); 
     var content = position[i][2]; 
     // Marker-Inhalt zuweisen 
     marker.bindPopup(content); 
     // Spiderfier Marker setzen 
     oms.addMarker(marker); 
    } 

    oms.addListener('spiderfy', function() { 
     // Hack als Ersatz zu fehlendem Spiderfy-Marker-Click-Callback 
     setTimeout(function() { 
      map.closePopup(); 
     }, 20); 
    }); 

답변

0

나는 문제는 마커 때 직접 팝업 결합되는 것을 믿습니다 oms 레이어를 클릭 할 때 동적으로 바인딩하지 않고 만듭니다. 이것은 내가이 테스트를하지 않은 https://github.com/jawj/OverlappingMarkerSpiderfier-Leaflet

OMS 설명서의 권장되는 방법이지만, 코드는 다음과 같이 보일 것입니다 :

for (var i = 1; i < <?php echo count($pos);?>; i++){ 
    switch(position[i][3]){ 
     case "B": 
      marker = L.marker([position[i][0], position[i][1]],{icon: BIcon}).addTo(map); 
      break; 
     case "S": 
      marker = L.marker([position[i][0], position[i][1]],{icon: SIcon}).addTo(map); 
      break;  
    } 

    // In your loop, store the popup content as a property of the marker 
    marker.desc = position[i][2]; 

    // Spiderfier Marker setzen 
    oms.addMarker(marker); 
} 

// Delegate the click to the oms layer and dynamically create the popup based on the 
var popup = new L.Popup(); 
oms.addListener('click', function(marker) { 
    // Set the popup content using the marker property set in the loop 
    popup.setContent(marker.desc); 
    popup.setLatLng(marker.getLatLng()); 
    map.openPopup(popup); 
}); 
관련 문제