Mapbox GL 集群缩放

2023-12-30

我试图在用户单击群集时显示所有标记。

这是我到目前为止所做的:

map.on('click', function (e) {
    var cluster_features = map.queryRenderedFeatures(e.point, {
        layers: [
            'cluster-0',
            'cluster-1',
            'cluster-2'
        ]
    });
    var cluster_feature = cluster_features[0];
    if (cluster_feature && cluster_feature.properties.cluster) {
        map.jumpTo({
            around: e.lngLat,
            zoom: map.getZoom() + 2
        });
    }
});

每次用户单击标记时,都会添加 2 级缩放。它有效,但有时我需要放大更多才能看到标记。

关于如何通过单击缩放到实际标记有什么建议吗?


考虑到 Mapbox-gl 的当前版本,这是一个有点复杂的解决方案0.37.0.

我试图在用户单击群集时显示所有标记

鉴于这一陈述,有两种可能的解决方案。

  1. 在下一个缩放级别显示标记和簇或
  2. 显示所有标记(无论缩放级别如何)。

In mapbox-gl,聚类功能由超星团 https://github.com/mapbox/supercluster.

As of 0.37.0,当您通过以下方式设置源时,没有直观的 API 可以自定义超级集群的工作方式map.addSource...

因此,您可能需要在入口文件中使用/导入 supercluster 作为库依赖项,其中mapbox-gl使用(通过 npm 或其他方式)。

1. 使用超聚类来查找标记非聚类时的下一个缩放级别。

在超集群中,可以使用以下方法getClusterExpansionZoom(clusterId, clusterZoom),这为您提供了所选簇的下一个缩放,从中可以看到标记(无论是1,2,4,n zoomlevels from currentZoomLevel.

var supercluster = require('supercluster');

let features;

map.on('load', function(e) {
  features = supercluster().load(FEATURES);
});

// helper function
function findNearestCluster(map, marker, i) {
  let clusterSelected = marker;
  // get bounds
  let south = map.getBounds()._sw;
  let north = map.getBounds()._ne;
  let bounds = [south.lng, south.lat, north.lng, north.lat];

  let currentClusters = i.getClusters(bounds, Math.floor(map.getZoom()));

  let compare = {
    lng: clusterSelected.geometry.coordinates[0],
    lat: clusterSelected.geometry.coordinates[1]
  };

  let minClusters = currentClusters.map(cluster => {
    let lng = cluster.geometry.coordinates[0];
    let lat = cluster.geometry.coordinates[1];

    return {
      id: cluster.properties.cluster_id,
      geometry: cluster.geometry,
      value: Math.pow(compare.lng - lng,2) * Math.pow(compare.lat-lat,2)
    };
  });

  return minClusters.sort(function(a,b) {
    return a.value - b.value;
  });
}

map.on('click', function (e) {
  var cluster_features = map.queryRenderedFeatures(e.point, {
    layers: [
      'cluster-0',
      'cluster-1',
      'cluster-2'
    ]
  });

  var cluster_feature = cluster_features[0];

  // we need to find the nearest cluster as 
  // we don't know the clusterid associated within supercluster/map
  // we use findNearestCluster to find the 'nearest' 
  // according to the distance from the click
  // and the center point of the cluster at the respective map zoom

  var clusters = findNearestCluster(map, cluster_feature, features);
  var nearestCluster = clusters[0];

  var currentZoom = Math.floor(map.getZoom());
  var nextZoomLevel = supercluster()
      .getClusterExpansionZoom(nearestCluster.id, currentZoom);  

  if (cluster_feature && cluster_feature.properties.cluster) {
    map.jumpTo({
      around: e.lngLat,
      zoom: nextZoomLevel
    });
  }
});

2. 显示所有标记(无论缩放级别如何)。

我们做了与上面类似的事情,但不只是使用nextZoomLevel / getClusterExpansionZoom,我们可以使用getLeaves.

getLeaves 返回集群中的所有标记 -

var clusters = findNearestCluster(map, cluster_feature, features);
var nearestCluster = clusters[0];

var currentZoom = Math.floor(map.getZoom());

var getLeaves = supercluster()
    .getLeaves(nearestCluster.id, currentZoom, Infinity);  

从这里,您可以将叶子渲染为mapbox.Markers如果需要,类似于leaflet.markercluster.

第二种解决方案的问题是,每当视图发生更改时,您都需要删除/更新标记,以便反映地图视图的当前位置。

从自上而下的角度来看,这是可以的,但如果你开始旋转,视图渲染会有点卡顿,所以从 UI 角度来看我不建议这样做。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mapbox GL 集群缩放 的相关文章

  • Mapbox:如何避免当前缩放级别不可用的图块集的 JavaScript 错误?

    我正在使用 Mapbox GL JS 并从我的 Mapbox 帐户加载图块集图层 其中一些图块集图层仅适用于缩放级别 10 到 15 我的地图的默认缩放级别是 5 当我加载地图时 我收到一个 JavaScript 控制台错误 提示图块集出现
  • 在离线 iOS 应用程序中使用 MBTiles

    我已经有一个使用 MBTiles 格式存储的地图 我想在我正在制作的应用程序中使用它 应用程序在移动设备上没有信号 连接的情况下运行至关重要 Mapbox 之前有一个示例 介绍了如何将 MBTiles 与 RMMBTilesSource 一
  • 将geojson标记加载到mapbox中设置自定义图标图像

    我是mapbox 传单的新手 我认为这是一个非常基本的问题 我在过去的两天里一直在努力解决这个问题 尽管我尝试了几种方法 但我无法解决这个问题 我通过 geojson 加载标记 var ma 3 L mapbox featureLayer
  • 在 Mapbox 中使用 Leafletjs MarkerClusterGroup 和过滤器时出现问题

    我尝试过 Mapbox 及其 API 来创建交互式地图 目的是获取 geojson 文件中的点 并将其显示在地图上 它们必须通过标记图标进行过滤 并根据所应用的缩放进行分组 我在使用 MarkerClusterGroup 插件与 leafl
  • 创建自定义 UI 视图类以用作地图注释

    我使用故事板创建了一个自定义 UIView 我不希望它位于故事板中的坐标 但我希望能够在整个应用程序中的地图上不同位置重用它像这样 我还希望能够根据用户的请求更新其中的文本 并且只要单击绿色按钮 其中的数字就会增加 我也想自定义下面的图像
  • 带对话框的自定义标记

    我如何实现如上所示的对话框 到目前为止 这就是我现在能做的 map addLayer id markers type symbol source markers interactive true layout text field pric
  • Mapbox - 来自 GeoJson 属性的自定义标记图标

    我正在从一组 GeoJson 对象渲染标记 我想使用自定义图标作为标记 但无法确定正确的语法 下面是我用来渲染 geojson 的部分代码 asGeoJson gt type Feature properties title get lis
  • Mapbox GL JS 在图层中的特定功能上设置 Paint 属性

    我使用 Mapbox Studio 作为地图和样式的基础 然后使用 HTML 来实现其他地图功能 其中一项功能是在悬停或鼠标输入时更改图标不透明度 当您直接在 HTML 中创建它时 我检查了其他示例和所有其他参考功能 我设法改变不透明度 但
  • Mapbox GL JS:如果单击标记,则忽略地图单击事件

    我在地图上有一个标记 我想在单击它时更改其状态 并在单击地图上的其他位置时将其更改回来 问题是map on click console log 单击标记时也会触发 我只想查看标记单击事件 因为地图单击会调用状态回滚
  • Mapbox 与 Angular 6.“找不到地图容器”错误

    我正在开发我的第一个角度网络应用程序 我想介绍一些类似于谷歌地图的东西 由于新的计费策略 我不想使用最后一个 所以我尝试了 MapBox 按照教程 我成功创建了我需要的地图 问题是 我不知道如何在角度分量上显示它 我为地图生成了这个文件 并
  • Mapbox fitbounds() - 无效的 LngLat 对象:(NaN, NaN)

    在过去的几个小时里 我一直用头撞桌子 我试图让 Mapbox 放大所有标记的边界区域的负载 但是 这是我在下面的代码中遇到的错误 此错误出现在下面的控制台日志图像之后 因此 lat lng 坐标肯定存在 未捕获的错误 无效的 LngLat
  • “Mapbox 地图”的自动缩放

    在情节网站上Python 中的地图配置和样式 https plotly com python map configuration automatic zooming or bounds fitting描述了如何自动缩放 地理地图 impor
  • MapBox iOS MGLPolyline 跨越(180 或 -180)经度时出现问题

    在 MapBox iOS sdk 4 4 1 中 如果 MGLPolyline 穿过 180 或 180 经度 地图显示它正在绕地球走更长的路 而不是走更短的路 override func viewDidAppear animated Bo
  • 添加图层时,Mapbox 样式在缩放时发生变化/中断

    我有一个 mapbox 地图 使用 Outdoor v9 样式初始化 尝试了其他样式 相同的行为 当我向地图添加图层 标记或 geojson 源并缩放地图时 样式会发生变化或中断 我不确定是哪一个 This is the map befor
  • 使用 mapbox-gl-js 集群自定义 html 标记

    我正在使用 mapbox gl js API 并将其与 React 一起使用来创建一些自定义标记 如下所示 let div document createElement div let marker new mapboxgl Marker
  • 如何在mapbox ios sdk中向MGLFillStyleLayer添加线宽属性?

    我必须使用 MGLPolygonFeature 在 MGLFillStyleLayer 中添加多边形特征 但问题是我无法更改轮廓宽度 线宽为MGLFillStyleLayer目前无法更改 建议的解决方法是使用相同的源来创建MGLLineSt
  • Mapbox GL JS:将基础层设置为白色?

    我想显示带有白色背景的 Mapbox GL JS 地图 而不是地图背景 这是我现在的代码 mapboxgl accessToken mytoken var map new mapboxgl Map container map style m
  • MapBox水/陆检测

    我开始使用MapBox iOS SDK https www mapbox com mapbox ios sdk 有没有可能的方法通过坐标查询 MapView 并返回地形类型 水 土地 作为结果 我一直在读API doc https www
  • 从mapbox api获取建筑信息

    有没有办法从 Mapbox API 获取建筑信息 几何形状 高度等 我从这个例子开始 https www mapbox com mapbox gl js example 3d buildings https www mapbox com m
  • 如何修复 Mapbox GL 中的画布大小?

    我正在使用 Mapbox GL 显示地图并从其中心裁剪固定大小的图像 它非常适合我设计的特定分辨率 1920x1080 但是当我开始使页面响应时 地图样式width and height变化了 画布尺寸也开始变化了 因此 当我裁剪图像时 大

随机推荐

  • 在Vue Bootstrap中动态生成指令名称

    我正在使用 Vue bootstrap 中的下拉菜单 并且我想在其中包含可折叠元素 我想要完成的是有一个按钮可以打开和关闭可折叠列表中的每个元素 Vue bootstrap 执行此操作的方式是为可折叠元素提供一个与按钮的指令名称相匹配的 i
  • 在 OS X 上的 Qt 4.8.6 中更改 QGLWidgets 的 OpenGL 上下文版本

    我想使用 Qt 4 8 6 通过 QGLWidget 渲染 OpenGL 内容 我正在使用的机器是装有 OS X 10 9 4 的 MacBook Pro QGLWidget 是通过传递带有 3 2 核心配置文件的请求格式版本的 QGLFo
  • 使用 scala argonaut 编码嵌套类

    我正在尝试对以下案例类进行编码 解码 case class Person name String age Int childs List Person 使用以下代码 object Person implicit def PersonCode
  • 如何在 Scala/Java 方法中通过反射获取参数名称和类型?

    我们可以使用反射来获取方法名称 如下所示 object Foo def bar name String age Int val foo Foo getClass val methods foo getMethods filter getNa
  • 在 python x64 上安装 TA-Lib

    我正在尝试在 Python 上安装 TA Lib 我使用的是 x64 版本 因此无法使用 pip 安装 Ta Lib 我正在跟进these https github com afnhsn TA Lib x64运行它的步骤 但我还没有明确第
  • C 中的“++”操作是原子操作吗?

    我正在尝试确定是否有如下声明 value assuming value is a global variable 是一个原子操作 我需要知道该计算是否能够被写入同一全局变量的中断服务例程中断 对于没有原子类型的对象 标准从不将 定义为原子操
  • 模拟器不会在 Visual Studio 2010 中显示

    我已经遇到这个问题一周了 并在互联网上尝试了很多解决方法 但没有结果 这是我的情况 我正在尝试在 Windows 8 x64 主机上安装 Windows Phone SDK 7 1 我遵循的步骤是 为 Marketplace 客户端安装的
  • 为什么要定义教会数字

    我想了解为什么 Church 将这些数字定义为 0 f x x 1 f x f x 2 f x f f x 3 f x f f f x 4 f x f f f f x 背后的逻辑是什么 为什么0代表如下 0 f x x 丘奇并不想变得实际
  • XAML 绑定属性

    Hi 有人可以向我指出某种文档 其中包含 Binding 类提供的属性及其值类型的完整列表
  • 在 JavaFX 表中拖放?

    我正在将 JavaFX 2 表用于某种播放列表 并且我希望能够拖放表中的行 例如将第 3 行拖到第 2 行之前 就像您从典型媒体播放器的播放列表中拖放的内容一样 例如Winamp AIMP 那可能吗 有相关的代码示例吗 非常感谢 试试这个
  • 了解 kafka 流分区分配器

    我有两个主题 一个有 3 个分区 一个有 48 个分区 最初我使用默认分配器 但是当消费者 kubernetes 中的 pod 崩溃时我遇到了一些问题 发生的情况是 当 Pod 再次启动时 它从具有 3 个分区的主题重新分配分区 并从具有
  • Twitter Bootstrap:停止输入字段超出范围

    我在尝试解决此问题时遇到困难 文档说我应该将跨度设置为等于父跨度 但是 当我这样做时 它会延伸到井容器的右侧 在移动设备上查看时看起来不错 将适当的量延伸到右侧 填充井 但是 它在桌面上效果不佳 我希望字段延伸到井内 div class c
  • 使用 R 进行时间序列预测

    我有以下 R 代码 library forecast value lt c 1 2 1 7 1 6 1 2 1 6 1 3 1 5 1 9 5 4 4 2 5 5 6 5 6 6 2 6 8 7 1 7 1 5 8 0 5 2 4 6 3
  • 如何在触发器上将选定数据从一个工作表复制到另一个工作表

    我编写了一个脚本来通过全局变量收集数据 var row sheet getActiveSelection getRowIndex var mfg sheet getRange M row getValue toUpperCase var c
  • 列出文件时出现中文编码问题

    我正在运行 Java 应用程序Solaris10 with Chinese 现在目录下有一些中文文件名的文件 当我做files new File dir list 其中 dir 是包含该中文文件的父目录 我得到结果文件名files 0 as
  • 如果分支已更新特定目录中的文件,则运行 github 操作

    文件结构 apps app 1 app 2 libs lib 1 lib 2 我们有一些测试 只有在文件发生更改的情况下才应该运行lib 2 我尝试过做 on push paths libs lib 2 但它仅在文件来自lib 2被推送到提
  • 在 R 中安装 tabulizer 包

    我正在使用 R 版本 3 4 0 我的电脑是 64 位 Windows 10 我想在 R 中从 PDF 文档中提取数据帧 我尝试使用 github 安装 tabulizer 包 但出现以下错误 gt ghit install github
  • video.js - 控件在 IE8 中不显示

    我正在实现 videojs 并让它在所有浏览器中工作 但是控件不可见 并且播放按钮在 IE8 中被 Flash 后备损坏 经过一番挖掘 我通过链接到 cdn 确保使用最新版本的 js 和 css 看到了对 boxWidth box offs
  • C# 异步 TCP 套接字:处理缓冲区大小和大量传输

    当使用阻塞 TCP 套接字时 我不必指定缓冲区大小 例如 using var client new TcpClient client Connect ServerIp ServerPort using reader new BinaryRe
  • Mapbox GL 集群缩放

    我试图在用户单击群集时显示所有标记 这是我到目前为止所做的 map on click function e var cluster features map queryRenderedFeatures e point layers clus