【问题标题】:Mapbox Icon-Image Dynamic Symbol (icon) Loading with SpriteMapbox Icon-Image Dynamic Symbol (icon) Loading with Sprite
【发布时间】:2021-04-21 18:15:02
【问题描述】:

我正在尝试做一些我觉得很简单的事情,但似乎我显然误解了 mapbox addlayer 功能的关键部分。

目标

根据特征数据值(例如 geojson 特征数据值 title: "walmart")创建动态识别的图标。本质上只是在通过 tilequery 查询这些位置时从精灵图像中添加动态商店图标。 picture representation here

问题

尝试使用样式中的精灵值时,我不断收到错误消息。错误:util.js:349 Image "airport-11" could not be loaded. Please make sure you have added the image with map.addImage() or a "sprite" property in your style. You can provide missing images by listening for the "styleimagemissing" map event.

我看到很多资源都在谈论精灵,但没有人讨论如何以这种方式准确地实现它们。我什至尝试查询精灵,然后使用点符号添加值来访问精灵值。这给出了“未定义”和无效值的错误。

示例代码:

      map.addLayer({
    id: "tilequery-points",
    type: "symbol",
    source: "tilequery", // Set the layer source
    layout: {
      "icon-image": [
        "match",
        ["get", "title"],
        ["HEB"],
        "H-E-B_logo",
        ["Pilot Flying j"],
        sprite.Pilot_Travel_Centers_logo,
        // "Pilot_Travel_Centers_logo",
        ["Dollar General"],
        "Dollar_General_logo",
        ["Cumberland Farms Corp"],
        "Cumberland_Farms_logo (1)",
        ["CEFCO"],
        "CEFCO-convenience-stores-Logo_510px",
        ["BJs Wholesale Inc"],

问题

如何访问精灵值而不出错?!!! 谢谢您的帮助!我不会问我是否不需要它!

更新

我发现要在任何层内使用精灵图像,如果您在 Mapbox 工作室精灵图像集合中有图像,这些图像将自动可用。令人困惑的是,以前,我无法从链接中使用它们。但是,它应该会自动运行。

希望对你有帮助!

【问题讨论】:

    标签: maps mapbox mapbox-gl-js mapbox-gl mapbox-marker


    【解决方案1】:

    关于精灵的文档确实不是很清楚。我会尝试总结一下(简化一点)。

    一个 Mapbox GL 样式有一个精灵。这是一个包含所有图标的 PNG,以及一个 JSON 文件,该文件指定每个图标的名称(其图标 ID)以及它在 PNG 中的位置。通过将 URL 指定为 sprite 属性来指定精灵:https://docs.mapbox.com/mapbox-gl-js/style-spec/sprite/

    您还可以在地图加载后动态向精灵添加图像,使用map.loadImagemap.addImage,指定图标ID。

    要显示图标,请在符号层中使用相同的 ID:"icon-image": "myicon"

    当您尝试将自己的图标与 Mapbox 底图中的图标(名称类似于 `airport-11' 的 Maki 图标)组合时,可能会遇到麻烦。

    要将它们组合起来,您可以执行以下三件事之一:

    • 将您的图标上传到 Mapbox Studio 中的样式
    • 动态加载您的图标
    • 离线生成一个新的精灵表,使用类似mbsprite

    我不知道您所说的“点符号”是什么意思,但不,这不是正确的路径。

    【讨论】:

    • 感谢史蒂夫的回答!我现在理解得更好了,但是,我对这里的主要问题仍然有些困惑。我应该在哪里插入“sprite”链接,因为这将允许我在符号内按名称引用这些图像。它是在符号addLayer 或符号属性中的某处吗?还是使用样式自动查询?还是应该以其他方式引用它?再次感谢!
    • 如果您从头开始创建整个样式(即,您有一个“my-style.json”文件),那么它位于最顶部。阅读样式规范,包括我提供的链接。
    • 可以理解。我很抱歉拖延了这个,但我真的无法理解这一点。我希望在我的 tilequery map.addLayer 元素中使用精灵图像。您能从这个codepen link 中查看我在这段代码中的代码吗?它有我正在努力解决的确切位置,所以我们都在同一页面上,手头的确切问题是什么。如果 sprite 链接没有在 vanilla JS 或其他东西中使用,那么我们如何从 mapbox 工作室本地引用它?再次感谢!!!
    • 请仔细阅读文档。 每个样式都有一个精灵文件。不,您不能将精灵传递给addLayer
    • 我同意@DOZBORNE,你的回答不清楚,文档不包含从外部文件加载精灵的任何具体答案。于是他求助于如何使用它!
    猜你喜欢
    • 1970-01-01
    • 2011-10-02
    • 2014-02-13
    • 2011-08-21
    • 1970-01-01
    • 1970-01-01
    • 2022-12-27
    • 2019-08-15
    • 1970-01-01
    相关资源
    最近更新 更多