如何获取 mapboxgl.GeoJSONSource 对象的边界框?

2023-12-25

我正在设置一个 Mapbox GL JS 地图,如下所示:

mapboxgl.accessToken = 'pk.my_token';
var cityBoundaries   = new mapboxgl.GeoJSONSource({ data: 'http://domain.com/city_name.geojson' } );
var map              = new mapboxgl.Map({
  container: 'map',
  style: 'mapbox://styles/mapbox/streets-v8',
  center: [cityLongitude,cityLatitude],
  zoom: 13
});

然后我将 GeoJSON 数据加载到地图上,如下所示:

map.on('style.load', function(){
  map.addSource('city', cityBoundaries);
  map.addLayer({
    'id': 'city',
    'type': 'line',
    'source': 'city',
    'paint': {
      'line-color': 'blue',
      'line-width': 3
    }
  });
});

此时,我有一个以我在中指定的位置为中心的地图new mapboxgl.Map,缩放级别为 13。因此,地图上仅可见一部分 GeoJSON 数据。我想重新居中并重新缩放地图,以便整个 GeoJSON 数据可见。

在 Mapbox JS 中,我将通过将 GeoJSON 数据加载到featureLayer然后将地图拟合到其边界:

map.fitBounds(featureLayer.getBounds());

The fitBounds 文档 https://www.mapbox.com/mapbox-gl-js/api/#Map.fitBounds对于 Mapbox GL JS 表示它想要以下格式的边界[[minLng, minLat], [maxLng, maxLat]].

有没有办法确定此 GeoJSON 层的混合/最大纬度和经度值?


基于“获取边界框”部分这个帖子 http://mikefowler.me/2014/06/10/drawing-geojson-in-a-canvas/,我已经想出了这个过程......

map.on('style.load', function(){
  $.getJSON('http://citystrides.dev/city_name.geojson', function(response){
    var boundingBox = getBoundingBox(response);
    var cityBoundary = new mapboxgl.GeoJSONSource({ data: response } );

    map.addSource('city', cityBoundary);
    map.addLayer({
      'id': 'city',
      'type': 'line',
      'source': 'city',
      'paint': {
        'line-color': 'blue',
        'line-width': 3
      }
    });
    map.fitBounds([[boundingBox.xMin, boundingBox.yMin], [boundingBox.xMax, boundingBox.yMax]]);
  })
});

function getBoundingBox(data) {
  var bounds = {}, coords, point, latitude, longitude;

  for (var i = 0; i < data.features.length; i++) {
    coords = data.features[i].geometry.coordinates;

    for (var j = 0; j < coords.length; j++) {
      longitude = coords[j][0];
      latitude = coords[j][1];
      bounds.xMin = bounds.xMin < longitude ? bounds.xMin : longitude;
      bounds.xMax = bounds.xMax > longitude ? bounds.xMax : longitude;
      bounds.yMin = bounds.yMin < latitude ? bounds.yMin : latitude;
      bounds.yMax = bounds.yMax > latitude ? bounds.yMax : latitude;
    }
  }

  return bounds;
}

以下是代码功能的演练,供需要详细解释的任何人使用:

  • map.on('style.load', function(){
    • 当地图加载时,让我们在这个函数中做一些事情。
  • $.getJSON('http://citystrides.dev/city_name.geojson', function(response){
    • 获取城市的 GeoJSON 数据。这是一个异步调用,因此我们必须将使用此数据的所有代码(response)在此函数内。
  • var boundingBox = getBoundingBox(response);
    • 获取此 GeoJSON 数据的边界框。这是调用, function(){出现在“样式加载映射”块之后。
  • var cityBoundary = new mapboxgl.GeoJSONSource({ data: response } );
    • 构建 Mapbox 的 GeoJSON 数据。
  • map.addSource('city', cityBoundary);
    • 将源添加到 Mapbox。
  • map.addLayer({
    • 将图层添加到 Mapbox。
  • map.fitBounds([[boundingBox.xMin, boundingBox.yMin], [boundingBox.xMax, boundingBox.yMax]]);
    • 调整地图以将 GeoJSON 数据固定在视图中。
  • function getBoundingBox(data) {
    • 此函数迭代返回的 GeoJSON 数据,查找最小和最大纬度和经度值。

中需要注意的一件事getBoundingBox函数是这一行:

coords = data.features[i].geometry.coordinates;

在上面链接的原始帖子中,这一行写为coords = data.features[i].geometry.coordinates[0];因为它们的坐标列表数据是数组的数组。我的数据不是这样格式化的,所以我不得不放弃[0]。如果你尝试这段代码并且它崩溃了,这可能就是原因。

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

如何获取 mapboxgl.GeoJSONSource 对象的边界框? 的相关文章

  • Mapbox GL 3D 单体建筑高光选择

    如何将鼠标悬停在一个 3D 建筑物上时突出显示它 OSM 建筑之类的东西突出了特色 看来mapbox street v7的建筑图层要素属性太少了 只包括 拉伸 高度 最小高度 类型 地下 没有任何独特的属性来区分这座建筑 有没有办法包含建筑
  • 在 Mapbox 中使用 Leafletjs MarkerClusterGroup 和过滤器时出现问题

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

    我如何实现如上所示的对话框 到目前为止 这就是我现在能做的 map addLayer id markers type symbol source markers interactive true layout text field pric
  • Leaflet/Mapbox渲染问题(灰色区域)

    由于某种原因 我的地图上有一个很大的灰色区域 直到我移动它使其出现 但乍一看 有一个部分缺失了 我以前在网上见过很多这样的情况 但直到现在才想知道如何解决它 这是一个使用 MarkerClusterGroup 作为集群的简单 Mapbox
  • 如何将 geojson 文件的内容分配给 Javascript 中的变量?

    显示的代码已经可以工作 但我想清理它 它声明了一个名为placez其中包含 geojson 格式的信息 供代码的下一部分使用过滤器读取和加载到地图上 但实际上 要映射的点数量超过 50 000 个 此处示例仅显示 2 个 我想知道的是如何加
  • Mapbox 与 Angular 6.“找不到地图容器”错误

    我正在开发我的第一个角度网络应用程序 我想介绍一些类似于谷歌地图的东西 由于新的计费策略 我不想使用最后一个 所以我尝试了 MapBox 按照教程 我成功创建了我需要的地图 问题是 我不知道如何在角度分量上显示它 我为地图生成了这个文件 并
  • 如何从纬度和经度找出地图瓦片坐标?

    我正在使用 Mapbox 矢量切片从后端进程收集特定数据 在示例中 他们提供了曼哈顿图块的链接 http a tiles mapbox com v3 examples map zr0njcqy 14 4823 6160 png http a
  • Mapbox fitbounds() - 无效的 LngLat 对象:(NaN, NaN)

    在过去的几个小时里 我一直用头撞桌子 我试图让 Mapbox 放大所有标记的边界区域的负载 但是 这是我在下面的代码中遇到的错误 此错误出现在下面的控制台日志图像之后 因此 lat lng 坐标肯定存在 未捕获的错误 无效的 LngLat
  • 使用 GoogleMap 或 MapBox Direction API 在我的应用程序中实现我自己的导航

    我想在我的 Android 应用程序中为驾驶员实现导航地图 我不想使用 URL 方案打开 google 地图应用程序来导航 我更喜欢在我的应用程序中实现此导航功能 就像 Google 地图一样 我的要求很简单 将用户从一个地方导航到另一个地
  • 如何在 Mapbox 3.6 中旋转汽车标记图像?

    我想根据路线方向旋转标记图像 我已经使用 Map box SDK 实现了地图 坐标和方向是通过网络服务获取的 我尝试了 imageForMarker 但没有成功 实现如下 func mapView mapView MGLMapView im
  • 来自调试器的消息:由于内存问题而终止

    我的应用程序正在使用Geojson文件 我用地图盒SDK https www mapbox com ios sdk examples line geojson to add MGLPolyline来映射 但问题是我的文件太大 导致应用程序崩
  • ngx-mapbox-gl 弹出窗口内的按钮单击事件未触发

    我正在使用这个用于地图框的角度库来渲染地图ngx mapbox gl https github com Wykks ngx mapbox gl我在 mouseenter 事件上显示一个弹出窗口 mapInstance on mouseent
  • 使用 mapbox-gl-js 集群自定义 html 标记

    我正在使用 mapbox gl js API 并将其与 React 一起使用来创建一些自定义标记 如下所示 let div document createElement div let marker new mapboxgl Marker
  • 如何在嵌套属性上使用mapbox“case”表达式?

    如何使用嵌套值来使用 case 运算符 就像是 this map setPaintProperty somelayer fill color case properties some prop someval 34c0dd 499bbc 其
  • 超集地图框工具提示的个性化

    根据超集拉取请求 可以使用一些 JavaScript 来个性化地理数据的工具提示 我尝试了很多方法来将点数据获取到工具提示 但没有一个起作用 Superset 在哪里存储额外的 JS 参数 The object props OwnData此
  • 如何在本机反应中使用 MapLibre GL Js

    我正在寻找一种在我的反应本机应用程序中使用 OpenStreetMap 数据的方法 在我最近的研究中 我发现MapLibre https maplibre org 这是基于MapBox GL旧版本的免费选项 我面临的问题是 除了 react
  • mapboxgl.Marker如何去除

    我习惯了 参考https docs mapbox com mapbox gl js example drag a marker https docs mapbox com mapbox gl js example drag a marker
  • 传单 GeoJSON 点*后面*多边形

    我有两个传单 geojson 层 它们都有点和多边形特征 我希望能够在地图上对它们进行排序 但是当我今天这样做时 尝试通过按特定顺序添加它们来排序它们 使用 BringToBack bringToFront 等 两个图层中的点图标都位于所有
  • 使用python在scattermapbox中围绕点绘制多边形

    我在用散点图箱 https plotly com python scattermapbox 在地图上绘制点 我想画出覆盖的多边形 x milePOI 的半径 dcc Graph id map graph application callba
  • 传单圆圈绘制/编辑问题

    我第一次制作传单 并面临绘制圆圈和编辑 更改圆圈位置 的问题 我面临的问题是 编辑 移动 圆从一个位置到另一位置会改变其半径 Note 请尝试在给定的小提琴中在地图顶部创建圆圈 然后通过单击编辑按钮将其移动到底部 如果我在地图的顶部创建圆圈

随机推荐

  • Fire and no-wait (without do!) vs Fire and wait (do!) 有巨大的性能差异吗?

    以下代码运行大约需要 20 秒 然而 取消注释后不到一秒钟do 为什么会有这么大的差异呢 Update 使用时需要9秒ag Add 我已经更新了代码 open FSharpx Control let test let ag new Bloc
  • kafka 上的无限期日志保留

    我正在使用 kafka 进行事件溯源 我意识到我们仍然需要配置日志保留时间 即log retention hours 如果我想无限期保留所有消息 最好使用什么值 示例配置为log retention bytes设置为 1 我可以在中也使用
  • TabWidget在Android底层不稳定?为什么?

    我将 tabWidget 设置在底部 当我想编辑编辑文本时 键盘会升起 但选项卡小部件位于键盘上方 为了支持多屏幕 我设置了 android layout weight 1 0 之后 我遇到了这个问题 我在下面添加了布局代码 有什么想法可以
  • Mysql 密码已过期。无法连接

    我刚刚擦除了我的 Mac 并重新安装了 El Capitan 我现在很难连接到Mysql 完成 Web 服务器设置过程后 我创建了一个简单的 PHP 测试文件 当我运行它时 我收到此错误 Warning mysqli mysqli HY00
  • 如何在 PyQt4 中杀死单次 QtCore.QTimer?

    因此 在我的应用程序中 我创建了一个QtCore QTimer对象 然后调用singleShot方法在 60 秒后调用一个函数 现在 在任何给定的时间点 如果我需要致电singleShot再次使用该方法并防止以前的singleShot方法生
  • 文件 MD5 校验和

    In 这个问题 https stackoverflow com questions 392657 md5 hashing in delphi 2009提到了wcrypt2 我需要的只是计算文件的MD5 如果我可以计算它而不需要保存它那就完美
  • 中间件和 Blazor 组件的范围

    我正在开发服务器端 Blazor 应用程序 并遇到了有关范围服务的一些问题 为了简单起见 我使用默认的 Blazor 模板 带有计数器的模板 重新创建了我的问题 我有一个服务 CounterService 它将计数器初始化为 1 并公开该计
  • 无法设置经度从 -180 到 0 的 LatLngBounds

    当尝试设置新的 LatLngBounds 时 对于世界的西南四分之一 西南经度自动设置在世界的另一侧 导致 LatLngBounds 不一致 西南比东北更东 a new google maps LatLng 90 180 true a ln
  • 为什么 C#.net 中的表达式主体不能使用 int、double 或 bool 类型的属性?

    我有一个功能 private string GetPropertyName Expression
  • Xcode 无法解析依赖项 Firebase - GoogleAppMeasurement 与要求不匹配

    我是 Xcode 编码新手 我尝试在我的项目上安装 Firebase 但遇到一个错误 我不知道如何解决 我已遵循 Firebase 的所有说明 但仍然存在问题 首要问题 无法解析依赖关系 因为 GoogleAppMeasurement 没有
  • PluginApplicationException:无法应用插件类“FlutterPlugin”

    我遇到了奇怪的错误 升级 Android Studio 后 我创建了一个Android项目 运行成功 然后我尝试导入Flutter Module到这个Android项目 我有这些例外 块引用 原因 org gradle api intern
  • Qt 中的 ODBC 驱动程序使用

    我想使用读取和写入mdb文件 Ms Access 文件 我是全新使用的ODBC in Qt 那么有人可以帮助我知道我是否需要下载驱动程序 如果是的话我可以从哪里下载 如果您了解连接性 那么我们将提供任何帮助 如果您需要使用 Qt 访问 MS
  • scanf 并将 char 保留为整数

    我就是无法理解 Char 是整数 对吗 所以我可以做 int var scanf d var I 65 printf c var o A 为什么这样做是错误的 char var scanf d var I A printf d var O
  • eslint-config-airbnb 扩展名“.js”的文件中不允许使用 JSX

    我已经安装了eslint config airbnb https github com airbnb javascript tree master packages eslint config airbnb应该为 React 预先配置 ES
  • 如何在 Codesys v3 中创建指向函数的指针

    你能给我一个例子来说明如何在我的库中声明函数指针吗 如何将函数指针传递给外部库 TL DR 在 CoDeSys v3 中可以使用 Totes 而且非常简单 在 CoDeSys 中 函数 实际上是存储在函数表中的函数指针 在 CodeSys
  • NSMutableArray 无法添加到

    我以前也遇到过这样的问题 但没有得到满意的答案 我有一个视图控制器 它有一个名为 counties 的属性 它是一个 NSMutableArray 我将深入导航屏幕 找到有关选择县进行地理搜索的视图 因此 搜索页面会深入到 选择县 页面 I
  • 获取应用程序开发人员名称[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想获取应用程序开发人员的名称 请有人告诉我如何得到这个 我尝试过 但只能获取已安装的应用程序及其图标 我想显示开发者名称 要获取已安
  • 如何在 DB2 上的多个表上使用 WHERE 条件执行安全的“SELECT FOR UPDATE”?

    Problem 在 DB2 版本 9 5 上的 SQL 语句 SELECT o Id FROM Table1 o Table2 x WHERE FOR UPDATE WITH RR 给我错误消息SQLSTATE 42829 不允许使用 FO
  • 更新实体框架中的嵌套对象

    最近我发现 EF 不更新嵌套对象 几天来我试图弄清楚如何做到这一点 但不幸的是我遇到了这个问题 我有对象 public class ProjectEntity AuditableEntity
  • 如何获取 mapboxgl.GeoJSONSource 对象的边界框?

    我正在设置一个 Mapbox GL JS 地图 如下所示 mapboxgl accessToken pk my token var cityBoundaries new mapboxgl GeoJSONSource data http do