У меня есть массив с множеством разных мест, с именами и фотографиями и, конечно, долготой и широтой. Если я наберу их непосредственно на карту, она будет захламлена. Поэтому я стараюсь использовать Clusters.Получение функций из кластеров в OpenLayers?
Начните с создания features:
for(var i = 0; i < points.length; i++){
features[i] = new ol.Feature({
population: 4000,
name : points[i].name,
geometry: new ol.geom.Point(
ol.proj.transform([
points[i].long,
points[i].lat],
'EPSG:4326', oProjection))
});
}
Я тогда заселить кластеры с вектором с функциями:
var vSource = new ol.source.Vector({ features: features});
var vFeatures = vSource.getFeatures();
var clusterSource = new ol.source.Cluster({
distance: 20,
source: vSource});
Я тогда стиль кластеры с некоторыми иконками
var clusters = new ol.layer.Vector({
source: clusterSource,
style : new ol.style.Style({
image: new ol.style.Icon(({
src: 'image/image.png'})),
text: new ol.style.Text({
font: '18px Helvetica, Arial Bold, sans-serif',
text: size.toString(),
fill: new ol.style.Fill({
color: '#fff'
})
})
map.add(clusters)
I позже есть метод onclick, который должен получить «имя» из Feature, но единственное, что он может распечатать, это геометрия, это похоже на то, что имя объекта исчезает из кластеров. Например, выполнение clusterSource.getFeatures()
возвращает пустой вектор, []
.
function addOverlays(points){
for(var i = 0; i<points.length;i++){
var element = document.getElementById(points[i].id);
var popup = new ol.Overlay({
element: element,
positioning: 'bottom-center',
stopEvent: false
});
map.addOverlay(popup);
// display popup on click
}
// display popup on click
map.on('click', function(evt) {
var feature = map.forEachFeatureAtPixel(evt.pixel,
function(feature, layer) {
console.log("feature on click: ",feature);
return feature;
});
if (feature) {
var geometry = feature.getGeometry();
var coord = geometry.getCoordinates();
popup.setPosition(coord);
console.log(feature.get('name'));
$(element).popover({
'placement': 'bottom',
'html': true,
'content': feature.get('name') //THIS IS THE TROUBLE
});
$(element).popover('show');
} else {
$(element).popover('destroy');
}
});
}
Метод addOverlay не может получить имя функции, она возвращает «неопределенный», который очень странно. Помогите? Любая помощь, пожалуйста? Это похоже на то, что функции перестают существовать при добавлении в кластер.
очень хорошее решение, но у меня есть некоторые проблемы с ним с некластерными исключительными функциями, но в конечном итоге они попадут. – radhoo
@radhoo Я знаю, что это уже давно, но я наткнулся на ту же проблему, и я решил ее, заменив 'feature.get ('name')' на 'feature.get ('features'). Get ('name')' in остальное. надеюсь, что это поможет –
Код Тима уже исправлен для поддержки как особых функций, так и кластеров. Ваш комментарий верен и соответствует опубликованному коду. – radhoo