#javascript #openlayers #openlayers-5
#javascript #openlayers #openlayers-5
Вопрос:
я пытаюсь показать только определенную функцию из моего векторного источника. итак, я создаю функцию, подобную этой:
function showUtility(id) {
utilitiesSource.forEach(function(i) {
//console.log(i.getFeatures());
i.forEachFeature(function(f) {
if (f.getProperties().id == id) {
f.setStyle(null);
} else {
f.setStyle([]);
}
});
});
}
откуда берется utilitiesSource:
utilitiesSource = [];
var utilitySource = new ol.source.Vector({
format: new ol.format.GeoJSON(),
projection: 'EPSG:4326',
url: 'someUrl',
extractStyles: false
});
utilitiesSource.push(utilitySource);
проблема в том, console.log(i.getFeatures())
что showUtility()
всегда выдает пустой массив, хотя это нормально, если бы я использовал его в eventlistener, подобном этому:
var selectCtrl = new ol.control.Select({
source: utilitiesSource,
property: $(".options select").val(),
selectLabel: 'Cari',
addLabel: 'Tambah Kondisi',
allLabel: 'Cocokkan Semua',
attrPlaceHolder: 'atribut',
valuePlaceHolder: 'nilai'
});
selectCtrl.on('select', function(e) {
select.getFeatures().clear();
utilitiesSource.forEach(function(i) {
//console.log(i.getFeatures()); --> gives array of feature
i.forEachFeature(function(f) {
f.setStyle([]);
});
})
e.features.forEach(function(f) {
f.setStyle(null);
});
});
var bar = new ol.control.Bar({
group: true,
controls: [
selectCtrl,
new ol.control.Button({
html: '<i class="fa fa-undo" ></i>',
title: 'Reset',
handleClick: function() {
select.getFeatures().clear();
utilitiesSource.forEach(function(i) {
//console.log(i.getFeatures()); --> gives array of feature
i.getFeatures().forEach(function(f) {
f.setStyle(null);
});
})
}
})
]});
и если я использую консоль браузера и выполняю utilitiesSource.forEach(function(i) { i.getFeatures().forEach(function(j){ if (j.getProperties().id == 100) {j.setStyle(null);} else {j.setStyle([])} });});
, я получаю то, что хочу
почему это? почему я не могу получить функции в showUtility (id)?
Комментарии:
1. Вы уверены, что векторные источники загрузили свои функции при вызове
showUtility(id)
метода?2. я уверен, что мои слои, источником которых является содержимое utilitiesSource, отображаются идеально. я также пытался вызвать функцию в последней строке моего кода, но по-прежнему безуспешно
3. Как вы можете быть уверены, что все ваши исходники были успешно загружены. Это асинхронная задача и не имеет ничего общего с вызовом вашего кода в последней строке.
4. извините, я не знал, что это асинхронная задача, и я был уверен, потому что мои слои отлично отображают функции из этого источника. итак, должен ли я использовать getState () или on (‘render’,function())?
5. Прежде всего попробуйте вызвать вашу функцию, как только увидите все векторы на своей карте, просто чтобы убедиться, что это ваша проблема. И тогда да, вам нужно вызвать
vectorSource.on('change', function(e) { if (vectorSource.getState() == 'ready') { ...call your method....