2016-07-15 3 views
1

У меня есть GeoJSON, которые я добавил к featuregroup в моей карте MapBox так:доступа GeoJSON свойство слоя в featuregroup в MapBox

var featureCollection = { 
    "type": "FeatureCollection", 
    "features": [{ 
    "type": "Feature", 
    "properties": { 
     "id": 1 
    }, 
    "geometry": { 
     "type": "Point", 
     "coordinates": [0, 0] 
    } 
    },{ 
    "type": "Feature", 
    "properties": { 
     "id": 2 
    }, 
    "geometry": { 
     "type": "Point", 
     "coordinates": [30, 30] 
    } 
    },{ 
    "type": "Feature", 
    "properties": { 
     "id": 3 
    }, 
    "geometry": { 
     "type": "Point", 
     "coordinates": [-30, -30] 
    } 
    }] 
}; 
var geojson = L.geoJson(featureCollection); 
var featureGroup = L.featureGroup().addTo(map); 
featureGroup.addLayer(geojson); 

Теперь я хочу, чтобы получить доступ к свойству идентификатора каждого слоя в то время как цикл через featuregroup, так что я могу передать его как аргумент другой функции. В случае featurelayer, я могу легко получить доступ к нему, используя что-то вроде этого:

var featureLayer = L.mapbox.featureLayer(featureCollection).addTo(map); 
featureLayer.eachLayer(function (layer) { 
    layer.on('click', function (e) { 
    console.log('Clicked feature ID: ' + e.target.feature.properties.id); 
    }); 
}); 

Но я хочу, чтобы иметь возможность доступа к нему в то время как цикл внутри featuregroup, а также я хочу быть в состоянии сделать это без «клик» или любое подобное событие. Например, в идеале я бы использовал примерно следующее:

featureGroup.eachLayer(function (layer) { 
    var id = layer.feature.properties.id; 
    testfunction(id); 
}); 

Я не смог понять, как это сделать. Я пробовал искать в Интернете, но поскольку я новичок в этом, я, вероятно, не использовал правильные ключевые слова в моем поиске.

+1

Можете ли вы опубликовать jsfiddle или другой пример демонстрационного сайта, когда мы увидим это в действии, потому что ваш предложенный цикл должен работать нормально. – snkashis

+0

Это [jsfiddle] (https://jsfiddle.net/r8rd1x3p/1/) того, что я пытаюсь сделать. По какой-то причине карта не отображается. Но в любом случае, когда я пытаюсь это сделать, он просто сообщает мне, что layer.feature не определен. – Raj

ответ

2

geojson вложен в featureGroup, поэтому при запуске вашей eachLayer функции, она не работает от индивидуальных особенностей в geojson, но вместо этого на самом geojson. Чтобы извлечь свойство каждой функции id, вам нужно пройти на один уровень глубже и перебрать функции в пределах geojson.

К счастью, the L.GeoJson class также поддерживает метод eachLayer (так как он является расширением L.FeatureGroup, которое само по себе расширение L.LayerGroup). Для печати id каждой функции, вы могли бы просто использовать метод eachLayer непосредственно на geojson:

geojson.eachLayer(function (layer) { 
    var id = layer.feature.properties.id; 
    testfunction(id); 
}); 

Или, если у вас есть куча L.GeoJson объектов, вложенных в featureGroup, вы можете использовать:

featureGroup.eachLayer(function (layer) { 
    layer.eachLayer(function (layer) { 
    var id = layer.feature.properties.id; 
    testfunction(id); 
    }); 
}); 
+0

Это потрясающе! Большое спасибо! – Raj