Openlayers 3 Add Movable Marker with Icon and Text
Asked Answered
K

1

5

In OL3, I've succeeded at making a map on which there are movable markers:

var mapVectorSource = new ol.source.Vector({
    features: []
});
var mapVectorLayer = new ol.layer.Vector({
    source: mapVectorSource
});
map.addLayer(mapVectorLayer);

function makeMovable(feature) {
    var modify = new ol.interaction.Modify({
        features: new ol.Collection([feature])
    });

    feature.on('change',function() {
        console.log('Feature Moved To:' + this.getGeometry().getCoordinates());
    }, feature);
    return modify;
}

function createMarker(location, style){
    var iconFeature = new ol.Feature({
        geometry: new ol.geom.Point(location)
    });
    iconFeature.setStyle(style);

    return iconFeature
}

iconStyle = new ol.style.Style({
    image: new ol.style.Icon(/** @type {olx.style.IconOptions} */ ({
        anchor: [0.5, 1],
        anchorXUnits: 'fraction',
        anchorYUnits: 'fraction',
        src: '/static/img/marker-icon.png',
    }))
});
var marker = createMarker(ol.proj.transform([38, 50], 'EPSG:4326', 'EPSG:3857'), iconStyle);
mapVectorSource.addFeature(marker);
var modifyInteraction = makeMovable(marker);
map.addInteraction(modifyInteraction);

But I want to add >10 markers, so I need to label them with numbers or text. Is there any way to add text to the overlay? If I inspect iconStyle, I see that it has a getText() function, but that function always just returns undefined and there is no accompanying setText() function. It would also seem natural to define it like this:

iconStyle = new ol.style.Style({
    image: new ol.style.Icon(/** @type {olx.style.IconOptions} */ ({
        anchor: [0.5, 1],
        anchorXUnits: 'fraction',
        anchorYUnits: 'fraction',
        src: '/static/img/marker-icon.png',
    })),
    text: "Hello, Marker"    // <- operative line
});

But that doesn't seem to be allowed. Another natural option might be to attach an html element to the style so that we can render anything we want, but there doesn't seem to be a way to do that.

So, how do I create a marker that has a text label?

Kinnon answered 23/10, 2014 at 0:57 Comment(0)
K
15

As seen in this example, the solution is to use a list of styles instead of just a single style.

In this case it's very simple:

iconStyle = [
    new ol.style.Style({
        image: new ol.style.Icon(/** @type {olx.style.IconOptions} */ ({
            anchor: [0.5, 1],
            anchorXUnits: 'fraction',
            anchorYUnits: 'fraction',
            src: '/static/img/marker-icon.png',
        }))
    }),
    new ol.style.Style({
        text: new ol.style.Text({
            text: "Wow such label",
            offsetY: -25,
            fill: new ol.style.Fill({
                color: '#fff'
            })
        })
    })
];
Kinnon answered 28/10, 2014 at 0:18 Comment(1)
Saved the day for meGive

© 2022 - 2024 — McMap. All rights reserved.