通过 mapbox gl js 在 mapbox 中向地图添加一些基本标记

Add some basic markers to a map in mapbox via mapbox gl js

提问人:CafeHey 提问时间:2/7/2016 更新时间:2/11/2016 访问量:11020

问:

我有一张用 mapbox studio 设置样式的地图,但是我甚至很难向其添加基本标记,但是文本出现在标记应该在的位置,这表明标记会在那里。

因此,下面是具有该地图样式的代码:

mapboxgl.accessToken = 'pk.eyJ1Ijoic21pY2tpZSIsImEiOiJjaWtiM2JkdW0wMDJudnRseTY0NWdrbjFnIn0.WxGYL18BJjWUiNIu-r3MSA';
var map = new mapboxgl.Map({
    container: 'map',
    style: "mapbox://styles/smickie/cikb3fhvi0063cekqns0pk1f1",
    center: [-30.50, 40],
    zoom: 2,
    interactive: false
});

这里是从 api 中的一个示例中添加的一些标记:

map.on('style.load', function () {

    map.addSource("markers", {
        "type": "geojson",
        "data": {
            "type": "FeatureCollection",
            "features": [{
                "type": "Feature",
                "geometry": {
                    "type": "Point",
                    "coordinates": [-77.03238901390978, 38.913188059745586]
                },
                "properties": {
                    "title": "Mapbox DC",
                    "marker-symbol": "monument"
                }
            }, {
                "type": "Feature",
                "geometry": {
                    "type": "Point",
                    "coordinates": [-122.414, 37.776]
                },
                "properties": {
                    "title": "Mapbox SF",
                    "marker-color": "#ff00ff"
                }
            }]
        }
    });

    map.addLayer({
        "id": "markers",
        "type": "symbol",
        "source": "markers",
        "layout": {
            "icon-image": "{marker-symbol}-15",
            "text-field": "{title}",
            "text-font": ["Open Sans Semibold", "Arial Unicode MS Bold"],
            "text-offset": [0, 0.6],
            "text-anchor": "top"
        }
    });
});

但是,只显示文本,而不显示图标。

问题是:我如何向这张地图添加一个普通的基本彩色标记,甚至不是一个特殊的图标?

谢谢。

JavaScript 映射框

评论


答:

12赞 iH8 2/11/2016 #1

这里的问题是,Mapbox Studio 中样式的起点(您选择的模板)没有您在图层布局中引用的字形/精灵。如果切换到他们在示例中使用的相同样式:您将看到标记将出现。这是因为它们已被添加到该样式中。如果你切换回你的风格,它们又消失了。mapbox://styles/mapbox/streets-v8

下面是样式精灵的控制台 .log:

enter image description here

下面是Mapbox街道精灵的控制台.log:

enter image description here

正如你所看到的,你只有两个,而mapbox有几十个(比截图上更多)。您只需使用 propertynames: 和 :default_markersecondary_marker

{
    "type": "Feature",
    "geometry": {
        "type": "Point",
        "coordinates": [-77.03238901390978, 38.913188059745586]
    },
    "properties": {
       "title": "Mapbox DC",
       "marker-symbol": "default_marker"
    }
}

map.addLayer({
    "id": "markers",
    "source": "markers",
    "type": "symbol",
    "layout": {
        "icon-image": "{marker-symbol}",
        "text-field": "{title}",
        "text-font": ["Open Sans Semibold", "Arial Unicode MS Bold"],
        "text-offset": [0, 0.6],
        "text-anchor": "top"
    }
});

Plunker 上的示例:http://plnkr.co/edit/W7pfGHVBzJj8U3AmPyzf?p=preview

如果你需要更多,你必须在Mapbox studio中将你想使用的精灵/字形添加到你的风格中。不幸的是,这与“编程”关系不大,因为它与Mapbox Studio有关,Mapbox Studio是一个软件工具,因此在stackoverflow上有点“题外话”。

如果你甚至不需要精灵/字形,你也可以使用和属性来创建简单的圆圈:type: circlepaint

map.addLayer({
    "id": "markers",
    "source": "markers",
    "type": "circle",
    "paint": {
        "circle-radius": 10,
        "circle-color": "#007cbf"
    }
});

Plunker 上的示例:http://plnkr.co/edit/QDtIBtDIimKy6TUmKxcC?p=preview

有关样式和精灵的更多信息,请参见此处:

评论

2赞 oelna 2/23/2017
小心,已更名。stackoverflow.com/a/38061574/3625228我花了一段时间才弄清楚为什么它不起作用。default_markermarker-15
1赞 Seph Reed 11/11/2020
这些不是默认标记。默认标记是你得到的,就像这个 docs.mapbox.com/mapbox-gl-js/example/add-a-marker 一样。使用 addLayer() 似乎不可能做到这一点......但我还是不敢相信。