我正在使用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将标记添加到现有图层?
答案 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上创建一个示例,但是今天它们已经关闭了,所以我无法创建测试用例。上面的代码是否已经快速记忆而无法测试,所以请原谅我,如果我犯了任何错误。