如何通过GeoJSON将标记添加到现有图层,而无需重置它

时间:2015-03-06 00:09:57

标签: maps mapbox geojson

我正在使用mapbox

我有一个包含我的标记的图层:

 map = L.mapbox.map(id, map_id...)
 map.featureLayer # this is the layer containing all my markers

我想要的是在不删除现有标记的情况下向该图层添加标记。但是我不想通过L.mapbox.Marker创建标记,我想通过GeoJSON添加它们,因为我想为它添加自定义属性。

我尝试创建一个新的featureLayer,通过setGeoJSON添加我的新标记的GeoJSON,然后将此图层添加到现有图层。如果我这样做,我的自定义过滤器(setFilter)不会应用于此子图层。

另一个想法是创建另一个图层,通过setGeoJSON将json添加到它,然后迭代它的标记并将它们添加到现有的featureLayer。这有可能吗?

如何通过GeoJSON将标记添加到现有图层?

1 个答案:

答案 0 :(得分:1)

你可以尝试这样的事情,这取决于从L.LayerGroup继承的两个函数removeLayer& addLayer

// Create featurelayer and add it to the map
var featureLayer1 = L.mapbox.featureLayer(mapid).addTo(map);

// Create another featurelayer, don't add it to the map
var featureLayer2 = L.mapbox.featureLayer(mapid);

// Wait until ready
featureLayer2.on('ready', function () {
    // Loop over the layers in the layer
    featureLayer2.eachLayer(function (layer) {
        // Remove them from this layer, this is important because a layer
        // (marker, polygon etc) can't be present in two layers at once
        featureLayer2.removeLayer(layer);
        // Add them to the other layer
        featureLayer1.addLayer(layer);
    }
});

就个人而言,我称之为快速入侵。我宁愿使用具有L.GeoJSON方法的addData,它可以添加功能或功能集,而无需删除已添加的功能。

// Creates empty GeoJSON layer
var geojson = L.geoJson().addTo(map);

// Creates GeoJSON layer with initial data
var geojson = L.geoJson(geojsonObject).addTo(map);

// Add data afterwards
geojson.addData(geojsonObject);

我无法从您获取初始数据的代码中获取,如果它是地图集地图中的功能,您可以像这样加载它们:

// Create a featureLayer which loads your features
var featureLayer = L.mapbox.featureLayer('examples.map-zr0njcqy');

// Create empty geojson layer
var geojsonLayer = L.geoJson().addTo(map); 

// Wait until everything is loaded 
featureLayer.on('ready', function() {
    // Turn layer's features back into geojson
    var features = featureLayer.getGeoJSON();
    // Add features to geojsonLayer
    geojsonLayer.addData(features);
});

// Now you can add more data afterwards
geojsonLayer.addData(moreFeatures);

您也可以使用jQuery的单个请求获取它们,例如:

$.getJSON('http://a.tiles.mapbox.com/v4/MAPID/features.json?access_token=TOKEN', function (data) {
    geojson.addData(data);
});

您可以使用L.GeoJSON进行过滤,方式几乎相同:

L.geoJSON(data, {
    'filter': function (feature) {
        //return true or false
    }
}).addTo(map);

参考:http://leafletjs.com/reference.html#geojson

教程:http://leafletjs.com/examples/geojson.html

通常情况下,我会在Plunker上创建一个示例,但是今天它们已经关闭了,所以我无法创建测试用例。上面的代码是否已经快速记忆而无法测试,所以请原谅我,如果我犯了任何错误。