2012-07-10 33 views
16

Tôi đang cố gắng tìm ra cách kích hoạt các sự kiện theo cách thủ công cho các đa giác Leaflet (được nạp thông qua GeoJSON).Làm thế nào để kích hoạt các sự kiện trên các đa giác bản đồ của Leaflet?

Tóm lại, tôi có một bản đồ Leaflet với nhiều đa giác. Tôi cũng có một siêu liên kết thông thường bên ngoài bản đồ mà khi được nhấp, nên kích hoạt sự kiện di chuột (hoặc bất kỳ sự kiện nào thực sự) trên một đa giác cụ thể.

Làm cách nào để gán ID cho tất cả các đa giác của mình để tôi có thể liên kết (các) siêu kết nối với sự kiện của đa giác cụ thể? Hay đó là cách hợp lý nhất để làm điều này?

Cuối cùng, tôi đang cố gắng tạo bản đồ với nhiều đa giác cùng với một bảng văn bản HTML nhãn được liên kết với mỗi đa giác. Khi nhấp vào văn bản bảng HTML, tôi muốn kích hoạt các sự kiện trên đa giác bản đồ (và ngược lại). Tôi chỉ không biết cách tham khảo mỗi đa giác.

Đây là HTML rất đơn giản của tôi:

<body> 

    <div id="map" style="height: 550px; width:940px"></div> 

    <a href="#" id="testlink">Click to trigger a specific polygon mouseover event</a> 

</body> 

Đây là JS rất đơn giản của tôi:

$(document).ready(function() { 

// build the map and polygon layer 
function buildMap(data) { 

    var map = new L.Map('map'); 

    var cloudmadeUrl = 'http://{s}.tile.cloudmade.com/***yourkeyhere***/66267/256/{z}/{x}/{y}.png', 
     cloudmadeAttribution = '', 
     cloudmade = new L.TileLayer(cloudmadeUrl, {maxZoom: 18, attribution: cloudmadeAttribution}); 

    var mapLoc = new L.LatLng(43.675198,-79.383287); 
    map.setView(mapLoc, 12).addLayer(cloudmade); 

    var geojsonLayer = new L.GeoJSON(null, {}); 

    geojsonLayer.on("featureparse", function (e){ 

     // apply the polygon style 
     e.layer.setStyle(polyStyle); 

     (function(layer, properties) { 
      layer.on("mouseover", function (e) { 
       // change the style to the hover version 
       layer.setStyle(polyHover); 
       }); 
      }); 
      layer.on("mouseout", function (e) { 
       // reverting the style back 
       layer.setStyle(polyStyle); 
      }); 
      layer.on("click", function (e) { 
       // do something here like display a popup 
       console.log(e); 
      }); 
     })(e.layer, e.properties); 

    }); 

    map.addLayer(geojsonLayer); 

    geojsonLayer.addGeoJSON(myPolygons);  

} 

// bind the hyperlink to trigger event on specific polygon (by polygon ID?) 
$('#testlink').click(function(){ 
    // trigger a specific polygon mouseover event here 
}); 

}); 

Trả lời

16

OK, I'v e tìm ra nó.

Bạn cần tạo sự kiện nhấp cho mỗi đa giác mở cửa sổ bật lên và chỉ định một ID duy nhất cho mỗi đa giác để bạn có thể tham chiếu sau này và kích hoạt cửa sổ bật lên theo cách thủ công.

Sau đây thực hiện việc này:

var polyindex = 0; 

    popup = new L.Popup(); 

    geojsonLayer = new L.GeoJSON(null, {}); 

    geojsonLayer.on("featureparse", function (e){ 

     (function(layer, properties) { 

      //click event that triggers the popup and centres it on the polygon 
      layer.on("click", function (e) { 
       var bounds = layer.getBounds(); 
       var popupContent = "popup content here"; 
       popup.setLatLng(bounds.getCenter()); 
       popup.setContent(popupContent); 
       map.openPopup(popup); 
      }); 

     })(e.layer, e.properties); 

     //assign polygon id so we can reference it later 
     e.layer._leaflet_id = 'polyindex'+polyindex+''; 

     //increment polyindex used for unique polygon id's 
     polyindex++; 
    }); 

    //add the polygon layer 
    map.addLayer(geojsonLayer); 
    geojsonLayer.addGeoJSON(neighbourhood_polygons); 

Sau đó, để tự kích hoạt một lớp cụ thể bấm kiện, chỉ cần gọi nó như thế này:

map._layers['polyindex0'].fire('click'); 

Tất cả mọi thứ giữa dấu ngoặc vuông là ID duy nhất của lớp bạn muốn kích hoạt. Trong trường hợp này, tôi sẽ kích hoạt sự kiện nhấp chuột của lớp ID polyindex0.

Hy vọng thông tin này sẽ giúp người khác ra ngoài!

+0

Có cách nào để thực hiện điều đó mà không cần đi sâu vào các thuộc tính nền không? – sidonaldson

+1

Tôi tin rằng điều này cần cập nhật với API mới, featureparse dường như không kích hoạt và addGeoJSON dường như không phải là chức năng – masterchief

+0

Cảm ơn bạn rất nhiều Tôi đã tìm kiếm một cái gì đó tương tự như thế này .. map._layers ['polyindex0' .fire ('click'); – EvilInside

1
function clickMarker(i){ 
var popupContent = "content here or html format", 
popup = new L.Popup({offset:new L.Point(0,-28)}); 

popup.setLatLng(LatLng); 
popup.setContent(popupContent); 
map.panTo(LatLng); 
map.openPopup(popup); } 

i = bị một tương ứng với tọa độ được LatLng

0

Vì vậy, hãy cập nhật nhanh.

Chỉ cần gọi fireEvent (hoặc bí danh fire) trên bất kỳ lớp nào bạn cần.

Bạn không cần phải mạo hiểm ._private [Vars], chỉ cần tham chiếu đến lớp mục tiêu và kích hoạt, ví dụ:

var vectorLayer = map.getLayer('myVectorLayer'); 
vectorLayer.fire('click'); 
Các vấn đề liên quan