后端与接口
用 Mapbox 构建门店定位器时如何展示标记…
在 Mapbox GL JS 应用中实现门店/餐厅/地点查找器:标记展示、筛选、距离计算与地图-列表联动。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 59/100 ×0.15
适用场景
用 Mapbox 构建门店定位器时如何展特定
解决思路
- 安装依赖:npm install mapbox-gl @turf/turf(Mapbox GL JS v3.x + Turf.js 用于距离等空间计算)
- 用 GeoJSON FeatureCollection 组织地点数据,每个 Feature 的 geometry 为 Point、coordinates 为 [longitude, latitude],properties 包含 id、name、address、category 及 hours、phone、website 等自定义字段
- 初始化地图:设置 mapboxgl.accessToken,用 new mapboxgl.Map({ container, style: 'mapbox://styles/mapbox/standard', center, zoom }) 创建实例
- 按地点数量选择标记策略:少于 100 个用 HTML Markers(完全 DOM/CSS 控制);100–1,000 个用 Symbol Layer(GPU/WebGL 渲染,单个 canvas,无逐点 DOM);超过 1,000 个用 Clustering(减少视觉杂乱)
- Symbol Layer 实现:map.addSource('stores', { type: 'geojson', data: stores }),再用 map.loadImage 加载自定义图标并 map.addImage('custom-marker', image),然后 map.addLayer 添加 type: 'symbol' 图层,layout 中配置 icon-image、icon-size、icon-allow-overlap、text-field: ['get', 'name']、text-font、text-offset、text-anchor、text-size
- 标记点击优先用 Interactions API:map.addInteraction('store-click', { type: 'click', target: { layerId: 'stores-layer' }, handler: (e) => { flyToStore(e.feature); createPopup(e.feature); } });也可用传统 map.on('click', 'stores-layer', ...)
- 用 map.on('mouseenter'/'mouseleave', 'stores-layer') 切换 map.getCanvas().style.cursor 为 pointer/空,实现悬停手型光标
- 构建交互列表:遍历 stores.features,为每个地点创建 listing 容器(id 为 listing-${id})与链接(id 为 link-${id}),填充名称、地址、电话;点击链接时调用 flyToStore、createPopup 并 highlightListing
- flyToStore 用 map.flyTo({ center: store.geometry.coordinates, zoom: 15, duration: 1000 }) 平滑定位
- createPopup 先移除已有 .mapboxgl-popup,再用 new mapboxgl.Popup({ closeOnClick: true }).setLngLat(...).setHTML(...).addTo(map) 展示详情(名称、地址、电话、可选网站链接)
- highlightListing 必须先移除已有 .active 类,再给目标 listing 添加 .active,并调用 listing.scrollIntoView({ behavior: 'smooth', block: 'nearest' })——缺少 scrollIntoView 时点击地图标记不会滚动侧栏到对应条目
- 在地图 load 事件中调用 buildLocationList(stores) 构建列表
- 用户定位蓝点直接用内置 mapboxgl.GeolocateControl,比自定义标记更简单
- 按需加载参考文件:markers.md(HTML Markers 与 Clustering)、search-filter.md(文本搜索、分类筛选)、geolocation-directions.md(用户定位、距离计算、路线导航)、styling-layout.md(HTML/CSS 布局与自定义标记样式)、optimization-a11y.md(防抖搜索、数据管理、错误处理、无障碍)、variations-react.md(移动优先、全屏、纯地图、React 实现)
适用边界 · 注意事项
- 不使用 Mapbox GL JS 或无法提供 Mapbox access token 的项目
- 地点数量极少且不需要地图交互、仅需静态展示的场景
- 无法引入 @turf/turf 等空间计算依赖时,距离计算等能力受限