【问题标题】:Add text to MapBox marker将文本添加到 MapBox 标记
【发布时间】:2020-06-17 02:55:56
【问题描述】:

我目前正在使用如下代码向 MapBox 地图添加具有不同图标的多个标记:

L.mapbox.accessToken = 'xxxx';
var map = L.mapbox.map('map')
.setView([XX.0309243, XX.2741612], 14)
.addLayer(L.mapbox.styleLayer('mapbox://styles/mapbox/streets-v11'));
var myLayer = L.mapbox.featureLayer().addTo(map);
var geoJson = {
type: 'FeatureCollection',
features: [
{
'type': 'Feature',
'geometry': {
'type': 'Point',
'coordinates': [XX.2741612, XX.0309243]
},
'properties': {
'title': '11-Jun 21:54:56',
'icon': {
'iconUrl': '/images/markers/marker_045.png',
'iconSize': [32, 32],
'iconAnchor': [25, 25],
'popupAnchor': [0, -25],
'className': 'dot'
}
}
}
]
};
// Set a custom icon on each marker based on feature properties.
myLayer.on('layeradd', function(e) {
var marker = e.layer,
feature = marker.feature;
marker.setIcon(L.icon(feature.properties.icon));
});
// Add features to the map.
myLayer.setGeoJSON(geoJson);

我可以对此代码进行任何更改,以便在每个标记附近添加一个标签。现在,要查看需要单击标记的文本。

【问题讨论】:

    标签: javascript mapbox


    【解决方案1】:

    我认为您必须在标记之前创建一个弹出实例并事先将其添加到地图中。之后您可以将其附加到标记上

    var popup = new mapboxgl.Popup()
      .setText('Description')
      .addTo(map);
    
    let marker = new mapboxgl
      .Marker()
        .setLngLat([-96, 37.8])
        .addTo(map)
        .setPopup(popup);
    

    我为你创建了一个fiddle。您可以从 sn-p 创建一个方法,并在每次要添加弹出窗口和标记时调用该例程。在您的特定情况下,您可能必须进行迭代,您不能直接添加图层,但必须在两者之间构建一些逻辑。

    【讨论】:

    • 感谢您的明确解释。有没有办法显示文本但不在弹出窗口中?无论如何,我都计划添加弹出窗口,但它们会在单击标记时显示,并显示更多详细信息。但是,我需要一个小文本,其名称始终显示并且理想情况下比弹出窗口占用更少的空间。
    • 嘿@Osprey 你找到解决办法了吗?我也在寻找一种在没有弹出窗口的情况下仅在标记旁边添加文本的方法
    【解决方案2】:

    嗯,这听起来很棘手,我想你可以试试这个来解决你的问题 它被称为text-variable-anchor,它允许高优先级标签移动位置以留在地图上。

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8" />
    <title>Variable label placement</title>
    <meta name="viewport" content="initial-scale=1,maximum-scale=1,user-scalable=no" />
    <script src="https://api.mapbox.com/mapbox-gl-js/v1.11.0/mapbox-gl.js"></script>
    <link href="https://api.mapbox.com/mapbox-gl-js/v1.11.0/mapbox-gl.css" rel="stylesheet" />
    <style>
        body { margin: 0; padding: 0; }
        #map { position: absolute; top: 0; bottom: 0; width: 100%; }
    </style>
    </head>
    <body>
    <div id="map"></div>
    
    <script>
        // TO MAKE THE MAP APPEAR YOU MUST
        // ADD YOUR ACCESS TOKEN FROM
        // https://account.mapbox.com
        mapboxgl.accessToken = '<your access token here>';
        var places = {
            'type': 'FeatureCollection',
            'features': [
                {
                    'type': 'Feature',
                    'properties': {
                        'description': "Ford's Theater",
                        'icon': 'theatre'
                    },
                    'geometry': {
                        'type': 'Point',
                        'coordinates': [-77.038659, 38.931567]
                    }
                },
                {
                    'type': 'Feature',
                    'properties': {
                        'description': 'The Gaslight',
                        'icon': 'theatre'
                    },
                    'geometry': {
                        'type': 'Point',
                        'coordinates': [-77.003168, 38.894651]
                    }
                },
                {
                    'type': 'Feature',
                    'properties': {
                        'description': "Horrible Harry's",
                        'icon': 'bar'
                    },
                    'geometry': {
                        'type': 'Point',
                        'coordinates': [-77.090372, 38.881189]
                    }
                },
                {
                    'type': 'Feature',
                    'properties': {
                        'description': 'Bike Party',
                        'icon': 'bicycle'
                    },
                    'geometry': {
                        'type': 'Point',
                        'coordinates': [-77.052477, 38.943951]
                    }
                },
                {
                    'type': 'Feature',
                    'properties': {
                        'description': 'Rockabilly Rockstars',
                        'icon': 'music'
                    },
                    'geometry': {
                        'type': 'Point',
                        'coordinates': [-77.031706, 38.914581]
                    }
                },
                {
                    'type': 'Feature',
                    'properties': {
                        'description': 'District Drum Tribe',
                        'icon': 'music'
                    },
                    'geometry': {
                        'type': 'Point',
                        'coordinates': [-77.020945, 38.878241]
                    }
                },
                {
                    'type': 'Feature',
                    'properties': {
                        'description': 'Motown Memories',
                        'icon': 'music'
                    },
                    'geometry': {
                        'type': 'Point',
                        'coordinates': [-77.007481, 38.876516]
                    }
                }
            ]
        };
    
        var map = new mapboxgl.Map({
            container: 'map',
            style: 'mapbox://styles/mapbox/light-v9',
            center: [-77.04, 38.907],
            zoom: 11.15
        });
    
        map.on('load', function() {
            // Add a GeoJSON source containing place coordinates and information.
            map.addSource('places', {
                'type': 'geojson',
                'data': places
            });
    
            map.addLayer({
                'id': 'poi-labels',
                'type': 'symbol',
                'source': 'places',
                'layout': {
                    'text-field': ['get', 'description'],
                    'text-variable-anchor': ['top', 'bottom', 'left', 'right'],
                    'text-radial-offset': 0.5,
                    'text-justify': 'auto',
                    'icon-image': ['concat', ['get', 'icon'], '-15']
                }
            });
    
            map.rotateTo(180, { duration: 10000 });
        });
    </script>
    
    </body>
    </html>
    

    在此处查看更多信息: https://docs.mapbox.com/mapbox-gl-js/example/variable-label-placement/

    【讨论】:

    • 据我所知,主题启动者询问 Mapbox,而不是 Mapbox-gl
    • 我不知道如何将它集成到我的代码中。我不断收到错误消息“提供的对象不是图层。”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-15
    • 2011-05-12
    • 2019-05-07
    相关资源
    最近更新 更多