Есть ли способ изменить Z-индексы слоев в OpenLayers3, как это было в старой версии?
map.setLayerIndex(markers, 99); //set the marker layer to an arbitrarily high layer index
Мне нужно изменить порядок слоев при использовании карты. Так что такая возможность, как определение z-index, не поможет
var geoLayer = new ol.layer.Vector({
source : new ol.source.GeoJSON({
projection : 'EPSG:900913',
url : './myGeoJson.json'
}),
style : function(feature, resolution) {
var text = resolution < 5000 ? feature.get('name') : '';
if (!styleCache[text]) {
styleCache[text] = [new ol.style.Style({
fill : new ol.style.Fill({
color : 'rgba(255, 255, 255, 0.1)'
}),
stroke : new ol.style.Stroke({
color : '#319FD3',
width : 1
}),
text : new ol.style.Text({
font : '12px Calibri,sans-serif',
text : text,
fill : new ol.style.Fill({
color : '#000'
}),
stroke : new ol.style.Stroke({
color : '#fff',
width : 3
})
}),
zIndex : 999
})];
}
}
});
javascript
layers
openlayers
z-index
анукет
источник
источник
Ответы:
Попробуйте что-то вроде:
map.getLayers().setAt(99, markers)
Список слоев находится в объекте, наследуемом от
ol.Collection
. Смотрите API документацию для этого.Будьте осторожны, я уверен, вы не можете использовать произвольное число, например, 99 в
setAt
: первый аргумент - это позиция в массиве слоев, а второй аргумент - это ссылка на элемент слоя, который вы хотите переместить. Чтобы получить количество слоев, просто используйтеmap.getLayers().getArray().length
Хотя вы видите, что мы можем получить массив JS для слоев, я не уверен, что манипулирование этим массивом напрямую - лучший способ, поскольку к слоям могут быть прикреплены события. Вы можете использовать
ol.Collection
методы вместо этого.источник
map.getOverlays()
возвращает такol.Collection
же, какmap.getLayers()
делает.Это не так просто, как раньше, но есть несколько вспомогательных методов для коллекции. Это должно позволить вам сделать то же самое, что и ThomasG77, описанный выше.
Предполагая, что у вас есть карта с именем map, с 4 слоями, т.е. [base_layer, coastlines, heatmap, маркеры]
Затем вы можете получить коллекцию через map.getLayers (), а массив слоев - через map.getLayers (). GetArray (), а отдельные слои - через.
Вы можете управлять порядком слоев с помощью методов сбора. Вероятно, это поможет создать некоторые вспомогательные функции, такие как:
Надеюсь, у вас есть возможность идентифицировать ваши слои и найти их, я устанавливаю идентификатор для создания, как layer.set ("layer_id" 44), который затем может быть получен через layer.get ("layer_id"). Затем вы можете создать вспомогательный цикл findLayer через массив слоев и вернуть индекс слоя.
Таким образом, у меня может быть что-то вроде moveLayerBefore (map, findLayer (44), findLayer (22));
В любом случае, в коллекции множество методов, но, надеюсь, это поможет вам начать работу. И извините, если в этом коде есть ошибки, все это скомпилировано ... :)
источник
основываясь на ответе srussking, я написал следующий код, предполагая, что основной объект карты называется map, и это глобальная переменная, я предпочел использовать слой find по имени, а не по id,
вот мой код:
источник
Нет необходимости обрабатывать индексы в коллекции через setAt или insertAt. Самый простой способ - использовать метод setZIndex на слое, как в API
источник
В моем случае ответ ThomasG77 вызвал
AssertionError
, потому что слой, который я собирался переместить наверх, уже был прикреплен к карте ( https://openlayers.org/en/v4.4.2/doc/errors/#58 ).Решение, которое сработало для меня:
(функция удаления возвращает удаленный слой). Онелинер тоже должен работать, но я этого не проверял.
источник