how to add text for display on map to a geojson object in leaflet

后端 未结 3 1887
孤独总比滥情好
孤独总比滥情好 2021-02-02 14:17

So I have a geojson layer in leaflet, and I can add geojson objects to this layer for display on the resulting map.

Now I\'d like to add a text label to display near the

相关标签:
3条回答
  • 2021-02-02 14:37

    I was looking for the same question recently and just implemented it yesterday based on a posting in the google group. https://groups.google.com/forum/#!topic/leaflet-js/sA2HnU5W9Fw

    Thanks to Adrian for the original code sample.

    Here's the solution:

    Extend the following class as below:

    <script>
    
        L.LabelOverlay = L.Class.extend({
            initialize: function(/*LatLng*/ latLng, /*String*/ label, options) {
                this._latlng = latLng;
                this._label = label;
                L.Util.setOptions(this, options);
            },
            options: {
                offset: new L.Point(0, 2)
            },
            onAdd: function(map) {
                this._map = map;
                if (!this._container) {
                    this._initLayout();
                }
                map.getPanes().overlayPane.appendChild(this._container);
                this._container.innerHTML = this._label;
                map.on('viewreset', this._reset, this);
                this._reset();
            },
            onRemove: function(map) {
                map.getPanes().overlayPane.removeChild(this._container);
                map.off('viewreset', this._reset, this);
            },
            _reset: function() {
                var pos = this._map.latLngToLayerPoint(this._latlng);
                var op = new L.Point(pos.x + this.options.offset.x, pos.y - this.options.offset.y);
                L.DomUtil.setPosition(this._container, op);
            },
            _initLayout: function() {
                this._container = L.DomUtil.create('div', 'leaflet-label-overlay');
            }
        });   
    
    </script>
    

    Furthermore add this css:

    <style>
        .leaflet-popup-close-button {
            display:none;
        }
    
        .leaflet-label-overlay {
            line-height:0px;
            margin-top: 9px;
            position:absolute;
        }
    </style>
    

    And then display the text labels as below:

    <script>
        var map = L.map('map').setView([51.898712, 6.7307100000001], 4);
    
        // add markers
        // ...
    
        // add text labels:
        var labelLocation = new L.LatLng(51.329219337279405, 10.454119349999928);
        var labelTitle = new L.LabelOverlay(labelLocation, '<b>GERMANY</b>');
        map.addLayer(labelTitle);
    
    
        var labelLocation2 = new L.LatLng(47.71329162782909, 13.34573480000006);
        var labelTitle2 = new L.LabelOverlay(labelLocation2, '<b>AUSTRIA</b>');
        map.addLayer(labelTitle2);
    
        // In order to prevent the text labels to "jump" when zooming in and out,
        // in Google Chrome, I added this event handler:
    
        map.on('movestart', function () {
            map.removeLayer(labelTitle);
            map.removeLayer(labelTitle2);
        });
        map.on('moveend', function () {
            map.addLayer(labelTitle);
            map.addLayer(labelTitle2);
        });
    </script>
    

    Result:

    enter image description here

    0 讨论(0)
  • 2021-02-02 14:42

    Label Overlay in Leaflet Using Marker Class and DivIcon Class With 'html' Property

    Personally, I use this method to implement text labels on the map. This way I get to use all of the existing Marker Class methods and events with no extra effort. It's a bit like just using a text label in replace of an icon, I guess.

            var textLatLng = [35.1436, -111.5632];  
            var myTextLabel = L.marker(textLatLng, {
                icon: L.divIcon({
                    className: 'text-labels',   // Set class for CSS styling
                    html: 'A Text Label'
                }),
                zIndexOffset: 1000     // Make appear above other map features
            });
    

    My CSS looks like:

            .text-labels {
                font-size: 2em;
                font-weight: 700;
                color: white;
                /* Use color, background, set margins for offset, etc */
            }
    

    Also, I haven't explored this yet, but maybe you can add a png to the CSS and then offset the text, so that you can wrap an icon and label in the same Marker object using the Leaflet DivIcon class?? This would be easy with a div shape (e.g. box, circle), but I'm not sure about adding a png to the CSS for the Marker object - because I am not a CSS guru by any means.

    0 讨论(0)
  • 2021-02-02 15:00

    I'm adopt this code for current version.

        <style>
            .leaflet-popup-close-button {
                display:none;
            }
    
            .leaflet-label-overlay {
                line-height:0px;
                margin-top: 9px;
                position:absolute;
            }
        </style>    
    
        <script>
            L.LabelOverlay = L.Layer.extend({
                initialize: function(/*LatLng*/ latLng, /*String*/ label, options) {
                    this._latlng = latLng;
                    this._label = label;
                    L.Util.setOptions(this, options);
                },
                options: {
                    offset: new L.Point(0, 2)
                },
                onAdd: function(map) {
                    this._map = map;
                    if (!this._container) {
                        this._initLayout();
                    }
                    map.getPanes().popupPane.appendChild(this._container);
                    this._container.innerHTML = this._label;
                    map.on('movestart', this._update_start, this);
                    map.on('moveend', this._update_end, this);
                    this._update_end();
                },
                onRemove: function(map) {
                    map.getPanes().popupPane.removeChild(this._container);
                    map.off('movestart', this._update_start, this);
                    map.off('moveend', this._update_end, this);
                },
                _update_start: function(){
                    L.DomUtil.setPosition(this._container, 0);
                },
                _update_end: function() {
                    var pos = this._map.latLngToLayerPoint(this._latlng);
                    var op = new L.Point(pos.x + this.options.offset.x, pos.y - this.options.offset.y);
                    L.DomUtil.setPosition(this._container, op);
                },
                _initLayout: function() {
                    this._container = L.DomUtil.create('div', 'leaflet-label-overlay');
                }
            });   
        </script>   
    
    0 讨论(0)
提交回复
热议问题