2015-11-17 1 views
0

Это глупый вопрос, в моем проекте лифлета/javascript у меня есть сотня слоев (я еще не создал, однако мне нужно работать над ним), разделенный между LayerGroup, FeatureGroup, MarkerCluster и GeoJSON, мне нужно создать одноуровневый корень, содержащий всю информацию для проведения некоторых исследований, а затем, как только я найду информацию, я хочу получить один слой, содержащий эту информацию. Таким образом, чтобы сделать слой слияния я сделать следующий код:Лучший способ поиска/извлечения исходного контейнера Листовой слой из коллекции слоя

//My 100 Layer.... 
var library = new L.MarkerClusterGroup(/*some layer options*/); 
var restaurant = new L.FeatureGroup(/*some layer options*/); 
var house = new L.LayerGroup(/*some layer options*/); 
var notClassified = new L.geoJson(content,/*some layer options*/); 
//...... 

Так что теперь я хочу, чтобы объединить все эти слои с уникальным слоем, L.geoJson и L.MarkerClusterGroup расширяет L.FeatureGroup, в L.FeatureGroup расширяет L.LayerGroup, поэтому корневой слой должен быть L.LayerGroup, если кто-то не имеет лучший совет:

var worldLayer = new L.LayerGroup(/*some layer options*/); 
for(var layer in listOfAllLayers){ 
    worldlayer.addLayer(layer); 
} 
map.addLayer(worldLayer); 

Дополнительный вопрос: это лучший способ сделать это?

После создания моего worldLayer я делаю некоторые исследования, например. отслеживать идентификатор, назначенный конкретному L.Marker или конкретному объекту Json на GeoJson мирового уровня. Поэтому я думаю, что лучший способ работы на GeoJSON результате WorldLayer:

//Get json content from the worldlayer Layer 
var json = worldLayer.toGeoJSON(); 
var key =..., 
var value = ..-; 
for(var i =0; i < json.features.length; i++){ 
    var resulJson = searchJsonByKeyAndValue(json.features[i],key,value); 
    //now work with resultJson.... 
} 

//key is the id and the value is what i looking for e.g. 456 
function searchJsonByKeyAndValue(json,key,value){ 
    for (var i = 0; i < json.length; i++) { 
     try { 
      if (json[i].hasOwnProperty(key)) { 
       if (json[i][key] == value) { 
        return json[i]; 
       } 
      } 
     }catch(e){ 
      alert(e.message); 
     } 
    } 
    return null; 
} 

Дополнительный вопрос 2: это лучший способ сделать это?

Мой вопрос: Среди другой информации есть способ найти конкретный исходный уровень информации о объекте json? Например, «worldLayer», я знаю, что конкретная информация присутствует также в «библиотеках», поэтому я хочу удалить значения «библиотеки» или библиотеки объектов Layer. Теперь я решил, добавив к каждой Особенности различных слоев дополнительную информацию в вызове объекта функции json «originLayers», поэтому, когда я восстанавливаю json-объект с помощью процедуры, которую я проиллюстрировал, я восстанавливаю даже нужную информацию; но для этого мне нужно пойти на анализ GeoJSON всех слоев (не очень маленький), и для каждой отдельной функции добавьте новую информацию. Есть альтернативный способ улучшить все? Ty за любую помощь.

ответ

1

Я думаю, что the hasLayer method of layerGroup - это то, что вам нужно вместо вашей функции псевдо-ретривера, чтобы отслеживать маркер.

Например:

var map = map(); 
var a = layerGroup().addTo(map); 
var b = featureGroup().addTo(a); 
var c = featureGroup().addTo(a); 
var marker = marker().addTo(b); 

a.hasLayer(marker); // true 
b.hasLayer(marker); // true 
c.hasLayer(marker); // false 
+0

Спасибо так много, на самом деле, мне кажется, решение ближе к тому, что мне нужно, (конечно, гораздо лучше использовать петлю для т.д.), я отметить этот ответ как правильный ответ, но я остаюсь открытым для других рекомендаций и предложений. – 4535992

+0

hasLayer только что подготовлен для вас. Он работает с большим объектом, в котором идентификаторы листовок хранятся в виде ключей, поэтому вам не нужно зацикливать его. –

Смежные вопросы