如何限制 mapbox MGLMapView 中的地图边界?

How to limit map bounds in mapbox MGLMapView?

我正在使用 mapbox-iOS-SDK 3.2.3,但找不到任何类似的属性或类似的东西来控制地图边界。我需要限制用户的可见区域。在当前的 SDK 版本中可以吗?

当前版本的 Mapbox 中没有任何内置功能看起来可以满足您的要求。您可能可以在

之前得到类似的东西
  1. 在地图视图委托中实施 mapViewRegionIsChanging:mapView:regionDidChangeAnimated:
  2. 在那些方法中,检查当前区域。如果它在所需区域之外,请将地图视图重置为所需区域内的某个内容。也就是说,一旦地图视图开始移出区域,就让它返回。

这可能会起作用,但如果用户试图滚动到目标区域之外,它可能会使视图 "stutter"。我不知道你的应用程序做了什么,但可能值得考虑 (a) 这是否真的有必要,以及 (b) 是否有比限制地图视图滚动更好的方法来避免你期望的任何问题。

我从 中吸取了想法并实现了委托,目的是查看在将用户保持在已知 Mapbox 范围内的同时有多少卡顿或动画卡顿。我赞成他的回答,但也想分享这个例子。

这里是 Swift 委托,填写 mapViewRegionIsChanging

的委托
  • 主要目标是测试体验是否仍令客户满意(是)
  • 委托能否在不频繁调用委托的情况下将用户适当地保持在范围内? (还有待验证)
  • 使用 Balboa Park 作为方形 Mapbox MGLCoordinateBounds
  • 仅检查客户是否向北滚动太远
  • 概念太远了被一些公差检查了,epsilon
  • 在四个方面检查越界应该很简单

    func mapViewRegionIsChanging (mapView: MGLMapView) {
    
      let viewBounds = mapView.visibleCoordinateBounds
    
      // Set the map's bounds to Balboa Park, San Diego
      let boundsBalboaPark = MGLCoordinateBounds(
        sw: CLLocationCoordinate2D(latitude: 32.71942, longitude: -117.15914),
        ne: CLLocationCoordinate2D(latitude: 32.74093, longitude: -117.13374))
    
      let deltaNorth = viewBounds.ne.latitude - boundsBalboaPark.ne.latitude
    
      let epsilon = 0.025  // Magic number for tolerance of how far 'north' we allow (in degrees); Q.E.D meters
      if( deltaNorth > epsilon) {
        mapView.setVisibleCoordinateBounds(boundsBalboaPark, animated: true)
      }
    }
    

此动画显示将 mapView 移到巴尔博亚公园以北太远的地方。您看到的口吃是真实的,但可以接受。