2015-11-02 64 views
1

我有一個GeoJSON對象,其中包含超過2000多個功能,每個功能都屬於一個類別(即「Electrical」,「Military」等)的一部分。總共有大約類別。單張:如何從單個集合切換GeoJSON要素屬性?

下面是我收集的模式比如:

{"type":"Feature","properties":{"category":"Electrical","Name":"Plant No 1"},"geometry":{"type":"Point","coordinates":[81.73828125,62.59334083012024]}},{"type":"Feature","properties":{"category":"Electrical","Name":"Plane No 2"},"geometry":{"type":"Point","coordinates":[94.5703125,58.722598828043374]}},{"type":"Feature","properties":{"category":"Military","Name":"Base 1"},"geometry":{"type":"Point","coordinates":[104.4140625,62.91523303947614]}} 

這裏是我的L.geoJson功能通過 集合迭代:

var allPoints = L.geoJson(myCollection, { 
    onEachFeature: function(feature, layer){ 
     layer.bindPopup(L.Util.template(popTemplate, feature.properties)); 
    }, 
    "stylel": function(feature){ 
     return { "color": legend[feature.properties.category] 
    } 
}}).addTo(map); 

哪有我分配每個category屬性到我的L.control功能,以便用戶可以打開/關閉集合中的各種類別?我可以做到這一點,如果我讓每個類別都是一個數據集和一個單獨的geoJSOn圖層,但是完成所有38個類別的工作太多了。

我嘗試:

L.control.layers({ 
    'Street Map': L.mapbox.tileLayer('mapbox.streets').addTo(map) 
},{ 
    'Electrical': myCollection[feature.properties.category["Electrical"]], 
    'Military': myCollection[feature.properties.category["Military"]] 
}); 

有沒有更好的方式來做到這一點?謝謝!

回答

3

您可以在onEachFeature函數中簡單地指定圖層。你甚至可以自動爲每個類別創建圖層組。

結果:

var categories = {}, 
    category; 

function onEachFeature(feature, layer) { 
    layer.bindPopup(L.Util.template(popTemplate, feature.properties)); 
    category = feature.properties.category; 
    // Initialize the category array if not already set. 
    if (typeof categories[category] === "undefined") { 
     categories[category] = []; 
    } 
    categories[category].push(layer); 
} 

// Use function onEachFeature in your L.geoJson initialization. 

var overlays = {}, 
    categoryName, 
    categoryArray; 

for (categoryName in categories) { 
    categoryArray = categories[categoryName]; 
    overlays[categoryName] = L.layerGroup(categoryArray); 
} 

L.control.layers(basemaps, overlays).addTo(map); 

編輯:取代overlays是一個映射,而不是陣列。

+0

是否也能提供onEachFeature函數內分配層,而不是自動它的一個例子嗎?這對我來說可能是一個更簡單的方法。 – redshift

+0

好吧,我得到了這個工作(自動化),但需要一些幫助打印控件中複選框旁邊的類別名稱。現在,只有數字在那裏。但切換確實有效。謝謝! – redshift

+1

我的不好,'疊加'應該是一個映射,而不是一個數組。我將更正上面的代碼以向您展示。 – ghybs

1

迭代您的GeoJSON集合並創建多個L.GeoJSON圖層,每個圖層一個,並將它們作爲疊加添加到您的L.Control.Layers實例中。

var controlLayers = L.control.layers({ 
    'Street Map': L.mapbox.tileLayer('mapbox.streets').addTo(map) 
}).addTo(map); 

// Object to store category layers 
var overlays = {}; 

// Iterate the collection 
collection.features.forEach(function (feature) { 

    var category = feature.properties.category; 

    // Check if there's already an overlay for this category 
    if (!overlays[category]) { 

     // Create and store new layer in overlays object 
     overlays[category] = new L.GeoJSON(null, { 
      'onEachFeature': function() {}, 
      'style': function() {} 
     }); 

     // Add layer/title to control 
     controlLayers.addOverlay(overlays[category], category); 
    } 

    // Add feature to corresponding layer 
    overlays[category].addData(feature); 
}); 

這裏有Plunker一個例子:http://plnkr.co/edit/Zv2xwv?p=preview

+0

謝謝,由於某種原因,我無法使用mapbox地圖工作。無論哪種方式,感謝您的幫助。 – redshift

+0

可以使用Mapbox:http://plnkr.co/edit/Zv2xwv?p=preview – iH8