2015-02-24 2 views
0

У моей карты есть простой фильтр для небольшого набора данных полигона GeoJSON, управляемый кнопками меню-ui.Как сохранить стиль GeoJSON после фильтра?

$('.menu-ui a').on('click', function() { 
    // For each filter link, get the 'data-filter' attribute value. 
    var filter = $(this).data('filter'); 
    $(this).addClass('active').siblings().removeClass('active'); 
    featureLayer.setFilter(function(f) { 
     // If the data-filter attribute is set to "all", return 
     // all (true). Otherwise, filter on markers that have 
     // a value set to true based on the filter name. 
     return (filter === 'all') ? true : f.properties.DISTRICT == filter; 
    }); 
    return false; 
}); 

стили многоугольники устанавливаются перед этим:

var featureLayer = L.mapbox.featureLayer() 
    .loadURL('citycouncils.geojson') 
    .addTo(map); 

function getMyColor(myargument) { 
    if (myargument === '1') { 
     return '#996767' 
    }; 
    if (myargument === '2') { 
     return '#679967' 
    }; 
    if (myargument === '3') { 
     return '#676799' 
    }; 
    if (myargument === '4') { 
     return '#676794' 
    }; 
    if (myargument === '5') { 
     return '#676799' 
    }; 
} 
featureLayer.on('ready', function() { 
    featureLayer.eachLayer(function(polygon) { 
     polygon.bindPopup('District ' + polygon.feature.properties.DISTRICT); 
     console.log(typeof setStyle); 
     polygon.setStyle({ 
      opacity: 0.55, 
       weight: 2, 
       opacity: 1, 
      fillOpacity: 0.55, 
      fillColor: getMyColor(polygon.feature.properties.DISTRICT), 
      color: 'white' 
     }); 
    }); 
}); 

Стили GeoJSON правильно на карте нагрузки, но они теряют стиль, когда меню пользовательский интерфейс переключается и GeoJSON фильтруется. Как сохранить стили в процессе фильтрации?

Редактировать: The filter function works fine. Как пройти стиль в процессе?

+0

Имеет ли 'setFilter' метод фильтра правильно? – iH8

+0

Да, setFilter работает: http://tinyurl.com/m3d5yy9 – Bergen88

+0

Хорошо, мне было интересно, что вы не приняли ответ, где я его предложил, и это может быть частью вашей текущей проблемы. Если вы принимаете ответы, это отличная обратная связь с ответчиком, плюс вы вносите свой вклад в SO, потому что, когда у других людей есть аналогичная проблема, они также могут найти приемлемое решение и не должны снова задавать один и тот же вопрос. Сохраняет чистоту и аккуратность. См. Http://stackoverflow.com/help/someone-answers – iH8

ответ

1

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

var featureLayer = L.mapbox.featureLayer('http://run.plnkr.co/1zb4Lj1NPtpu4MAM/data.geo.json').addTo(map); 

// Fetch available inputs 
var inputs = document.querySelectorAll('input.filter'); 

// Loop over inputs 
for (i = 0; i < inputs.length; i++) { 
    // Attach events 
    inputs[i].onchange = function() { 
    // Run filter on inputchange 
    filter(); 
    } 
} 

// Object to hold the colors 
var colors = { 
    '1': 'red', 
    '2': 'yellow', 
    '3': 'blue' 
}; 

// Method which applies style 
var setStyle = function() { 
    // Loop over layers in featureLayer 
    featureLayer.eachLayer(function (layer) { 
    // Set style on layer 
    layer.setStyle({ 
     // set colors from object 
     fillColor: colors[layer.feature.id], 
     color: colors[layer.feature.id] 
    }); 
    }); 
} 

// Filter function 
var filter = function() { 
    // Array for checked inputs 
    var checked = []; 
    // Loop over inputs 
    for (i = 0; i < inputs.length; i++) { 
    // See if input is checked 
    if (inputs[i].checked) { 
     // Is checked add to array 
     checked.push(Number(inputs[i].value)); 
    } 
    } 
    // Set filter function on array 
    featureLayer.setFilter(function (feature) { 
    // return true is feature.id is in checked array 
    return (checked.indexOf(feature.id) != -1); 
    }); 
    // Call style function 
    setStyle(); 
} 

// Run filter when featureLayer is ready 
featureLayer.on('ready', filter); 

Рабочий пример на Plunker: http://plnkr.co/edit/UToM2gtLHEI6EZyjvtGy?p=preview

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