2013-02-07 14 views
5

リーフレットを持っているChoropleth tutorial特定のマップエリアでクリックイベントをエミュレートする必要があります。例:「05」私はクリックする必要がIDです: 私は、次のコードリーフレットの地図アイテムをエミュレートする

{"type":"Feature","id":"05","properties":{"name":"Arkansas","density":56.43},"geometry":{"type":"Polygon","coordinates":[...} 
「idは」

によって定義された地図領域をクリックしますclickOnMapItem(itemId)のような機能を持っている必要があります

に私のコードの残りの部分は、例のようである:

状態data.js:

var statesData = {"type":"FeatureCollection","features":[ 
{"type":"Feature","id":"01","properties":{"name":"Alabama","density":94.65},"geometry":{"type":"Polygon","coordinates":[[[-87.359 and so on 

HTML:

...

<!-- language:lang-html --> 
    <body> 
     <div id="map"></div> 

     <script src="dist/leaflet.js"></script> 

     <script type="text/javascript" src="us-states.js"></script> 
     <script type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js"></script> 
     <script type="text/javascript"> 

      var map = L.map('map').setView([37.8, -96], 4); 

      var cloudmade = L.tileLayer('http://{s}.tile.cloudmade.com/{key}/{styleId}/256/{z}/{x}/{y}.png', { 
       attribution: 'Map data &copy; 2011 OpenStreetMap contributors, Imagery &copy; 2011 CloudMade', 
       key: 'BC9A493B41014CAABB98F0471D759707', 
       styleId: 22677 
      }).addTo(map); 


      // control that shows state info on hover 
      var info = L.control(); 

      info.onAdd = function (map) { 
       this._div = L.DomUtil.create('div', 'info'); 
       this.update(); 
       return this._div; 
      }; 

      info.update = function (props) { 
       this._div.innerHTML = '<h4>US Population Density</h4>' + (props ? 
        '<b>' + props.name + '</b><br />' + props.density + ' people/mi<sup>2</sup>' 
        : 'Hover over a state'); 
      }; 

      info.addTo(map); 


      // get color depending on population density value 
      function getColor(d) { 
       return d > 1000 ? '#800026' : 
         d > 500 ? '#BD0026' : 
         d > 200 ? '#E31A1C' : 
         d > 100 ? '#FC4E2A' : 
         d > 50 ? '#FD8D3C' : 
         d > 20 ? '#FEB24C' : 
         d > 10 ? '#FED976' : 
            '#FFEDA0'; 
      } 

      function style(feature) { 
       return { 
        weight: 2, 
        opacity: 1, 
        color: 'white', 
        dashArray: '3', 
        fillOpacity: 0.7, 
        fillColor: getColor(feature.properties.density) 
       }; 
      } 
      //ON HOVER HANDLER 
      function highlightFeature(e) { 
       var layer = e.target; 
       layer.setStyle({ 
        weight: 5, 
        color: '#666', 
        dashArray: '', 
        fillOpacity: 0.7 
       }); 

       if (!L.Browser.ie && !L.Browser.opera) { 
        layer.bringToFront(); 
       } 

       info.update(layer.feature.properties); 
      } 

      var geojson; 

      function resetHighlight(e) { 
       geojson.resetStyle(e.target); 
       info.update(); 
      } 

      function zoomToFeature(e) { 

       map.fitBounds(e.target.getBounds()); 
      } 
      //setting click handlers 
      function onEachFeature(feature, layer) { 

       layer.on({ 
        mouseover: highlightFeature, 
        mouseout: resetHighlight, 
        click: zoomToFeature 
       }); 
      } 

      geojson = L.geoJson(statesData, { 
       style: style, 
       onEachFeature: onEachFeature 
      }).addTo(map); 

      map.attributionControl.addAttribution('Population data &copy; <a href="http://census.gov/">US Census Bureau</a>'); 


      var legend = L.control({position: 'bottomright'}); 

      legend.onAdd = function (map) { 

       var div = L.DomUtil.create('div', 'info legend'), 
        grades = [0, 10, 20, 50, 100, 200, 500, 1000], 
        labels = [], 
        from, to; 

       for (var i = 0; i < grades.length; i++) { 
        from = grades[i]; 
        to = grades[i + 1]; 

        labels.push(
         '<i style="background:' + getColor(from + 1) + '"></i> ' + 
         from + (to ? '&ndash;' + to : '+')); 
       } 

       div.innerHTML = labels.join('<br>'); 
       return div; 
      }; 

      legend.addTo(map); 


     </script> 
    </body> 

ommitedヘッダは、事前にありがとうございます!

答えて

1

クリックイベントをエミュレートしたいですか?なぜリーフレットを使用しないのですかfireEventmap.fireEvent('click',{latlng:[x,y]})

おそらく、オブジェクトのパラメータにlayerPointとcontainerPointを入力する必要があります。

は@snkashisに追加するにはhttp://leafletjs.com/reference.html#mouse-event

+0

イベント引数に 'layer'プロパティがないことがわかりました:http://stackoverflow.com/q/44053812/688080 – ziyuang

6

を参照してください:あなたが入力右の種類を場合fireEventのみ動作します。

var latlngPoint = new L.LatLng(x, y); 
    map.fireEvent('click', { 
     latlng: latlngPoint, 
     layerPoint: map.latLngToLayerPoint(latlngPoint), 
     containerPoint: map.latLngToContainerPoint(latlngPoint) 
    }); 

あなたはまた、それがマップに追加されます場合はどのような特定のマーカー/層のためにこれを行うことができます。これを行うことを意味します 。

8

申し訳ありませんが、それは3歳の質問ですが、私はここでそれに答えることをしようとします:

まず、以下のコードを更新:

//setting click handlers 
function onEachFeature(feature, layer) { 
    layer.on({ 
    mouseover: highlightFeature, 
    mouseout: resetHighlight, 
    click: zoomToFeature 
    }); 
    //add this line 
    layer._leaflet_id = feature.id; 
} 

を上に新しい行があなたを「割り当て」になります

function clickOnMapItem(itemId) { 
    var id = parseInt(itemId); 
    //get target layer by it's id 
    var layer = geojson.getLayer(id); 
    //fire event 'click' on target layer 
    layer.fireEvent('click'); 
} 
ので

、不要tはありません:あなたの層のleaflet_idようにGeoJSONの「ID」は、 は、このような新しい機能を作りますすべての座標を設定する

希望すると助かります!

関連する問題