当前位置: 首页 > 知识库问答 >
问题:

Mapbox有时不加载标记

师腾
2023-03-14

我正在使用Mapbox,在我的本地主机中,它总是正确加载我的标记。然而,现在我部署了我的应用程序,它没有。

至少有时候,

我注意到,如果我加载页面,然后就在页面加载之前,我切换到另一个选项卡,然后等待5秒钟,然后回到我的应用所在的选项卡。它确实工作并加载标记。

此外,我得到的错误:源用户不存在于地图的样式中。当我试图设置一个功能状态(当你悬停在侧边栏项目上,在标记没有加载的情况下):map.setFeatureState({Source:'user', id: i},{hover: true})

我还注意到映射。on('load',fn)在标记未加载时不触发,因为如果我添加控制台。将日志记录在其中。。。它不会被记录(当标记未加载时)

所以源代码没有加载。。。

所以,我猜这是某种类型的异步问题,或者是map的问题。on('load',fn)可能会遇到某些竞争条件:https://github.com/mapbox/mapbox-gl-js/issues/6707.

这就是为什么当我给它一些时间,通过去另一个标签,然后回来,它工作。

但是我想不出解决办法。

我有这个loadUser函数,它对我的后端进行API调用,获取用户,然后调用map.on('load', fn)

当我得到用户时,我使用等待:

     const res = await axios.get(`${apiUrl}?lat=${lat}&lng=${lng}`)
     const users = res.data;
     ...

有人知道问题在哪里吗?为什么我的标记没有加载?

我的现场直播在这里:https://jamsesssion.com/

如果您检查并搜索文件:usersMap,您可以在那里看到代码。在chrome控制台中按cmd p并搜索文件。

这是代码:

async function loadUsers(map, lat = 52.5, lng = 13.4, apiUrl = `/api/users/near?lat=${lat}&lng=${lng}`) {
  const res = await axios.get(`${apiUrl}?lat=${lat}&lng=${lng}`)

      const users = res.data;
      if (!users.length) {
        alert('Oooops! \n\nThere are no registered users in the place you searched yet, If you live there, register to Jamsession and tell your friends!');
        return;
      }

      const geoJsonMarkers = users.map( (place, i ) => {
        const [placeLng, placeLat] = place.location.coordinates;
        const position = { lat: placeLat, lng: placeLng };

        return {
          'type': 'Feature',
          'geometry': {
            'type': 'Point',
            'coordinates': [position.lng, position.lat]
          },
          'id': i,
          'properties': {
            'name': place.name,
            'genres': place.genres,
            'photo': place.photo,
            'slug': place.slug,
          }
        }
      })
      let markers = { 'features': geoJsonMarkers }

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

        map.addSource('users', {
        type: "geojson",
        data: markers,
        cluster: true,
        clusterMaxZoom: 22,
        clusterRadius: 50,
        })

          map.addLayer({
            id: "singles",
            type: "circle",
            source: "users",
            filter: ["!has", "point_count"],
            paint: {
                'circle-radius': {
                    'base': 10,
                    'stops': [[5, 20], [13, 50], [14, 60]]
                },
                // 'circle-color': '#ddffc8',
                'circle-color':  ["case",
                ["boolean", ["feature-state", "hover"], false],
                '#ff4da6',
                '#ddffc8'
                ],
              }
          });
}

共有1个答案

葛飞扬
2023-03-14

您可能需要放置地图。在(‘加载’…) loadUsers函数之外执行code>request,以便映射等待loadUsers请求完成。您还可以创建一个单独的函数来添加也等待loadUsers请求的源和层。所以它可能看起来像:

map。on('load',function(){loadUsers(addSources)})

 类似资料:
  • 我试图弄清楚如何将lon/lat坐标上的GeoJSON列表加载到MapBox地图中。我想我已经很接近了,我只是不能让它真正起作用。 我在这里设置了一个演示页面:http://sandbox.charliehield.com/mapbox/ 这是GeoJSON文件: 超文本标记语言很简单: 和JS:

  • 我在视图中使用mapbox,需要从JSON添加多个标记 这是我的JSON 下面是我如何运行脚本添加地图到视图 但是我想知道,我如何需要添加标记到map(对于json中的每个元素,我需要获得lat和lon)来映射。因为医生说我需要这样的Json var Geojson={type:'FeatureCollection',特性:[{type:'Feature',几何:{type:'Point',坐标:

  • 我对mapbox/传单还不熟悉,我认为这是一个相当基本的问题,我在过去两天里一直在努力解决,尽管我已经尝试了几种方法,但我还是无法完全理解。 我正在通过geojson加载标记: 然后尝试根据Geojson数据中使用的标题更改大小或颜色等属性: geojson如下所示: 我错过了什么吗,因为我也试图通过使用 setIcon函数中的某个地方,但似乎没有工作。如果有人能给我指出正确的方向。这真的很合适。

  • 拒绝加载脚本'https://api.mapbox.com/mapbox-gl-js/v2.1.1/mapbox-gl.js',因为它违反了以下内容安全策略指令:脚本-src'自己'。请注意,没有显式设置脚本-src-elem,因此脚本-src被用作后备选项。

  • 我一直在使用mapbox户外光栅瓷砖服务器处理传单地图。Mapbox有一些现成的样式,其中大部分都列在这个答案中。这个的代码/url是这样的: 我喜欢这种风格。但我的问题是,我试图添加一个图像。我希望imageoverlay位于地图地形图形之上,但位于标签之下。所以我所做的就是进入mapbox studio创建这两种样式-基本上是户外样式,标签分开: 没有标签 仅标签 旧样式在左侧,带有分离图层的

  • 我在GeoJSON上遇到了麻烦,是否有一个标记属性将标记不透明度设置为零?我目前正在使用mapbox加载标记,我的标记代码如下: 有人知道mapbox是否识别gejson中的不透明度属性吗?