Mapbox: одновременное отображение нескольких стилей в MGLStyle (создание слоя с помощью styleUrl)

#swift #mapbox

#swift #mapbox

Вопрос:

Я пытаюсь добавить несколько стилей в Mapbox MGLMapView . Я понимаю, что это невозможно напрямую, поскольку MGLMapView.style требуется только один styleURL , поэтому я пытался обойти это, добавив слой к стилю с помощью a styleURL .

Небольшое объяснение, почему:

Как показано в документах Mapbox offline maps, вы можете загрузить только MGLTilePyramidOfflineRegion с помощью a styleURL . Однако позже я хочу иметь возможность отображать несколько этих автономных регионов одновременно (регионы с разными URL-адресами). URL-адреса, которые я использую в настоящее время, относятся к сателлиту, гибриду и строке свойств. Я хотел бы иметь возможность отображать линейную карту свойств поверх спутниковой или гибридной карты. В настоящее время я могу показывать только по одному за раз, изменяя MGLMapView.style.styleURL .

Что я пробовал:

 guard let layer = (notification.userInfo?["layer"])! as? Layer,
      let url = layer.url,
      let style = mapView.style
else { return }

switch layer.id {
    case .initial, .satellite:
        mapView.styleURL = url
        break
    case .property:

       // 1)
       let source = MGLRasterTileSource(identifier: "(layer.identifier)Style", configurationURL: URL)
       let layer = MGLRasterStyleLayer(identifier: "(layer.identifier)Layer", source: source)

       // 2)
       let source = MGLVectorTileSource(identifier: "(layer.identifier)Style", configurationURL: URL)
       let layer = MGLLineStyleLayer(identifier: "(layer.identifier)Layer", source: source)

       // When testing either 1 or 2 is commented out
       style.addSource(source)
       style.insertLayer(layer, at: UInt(style.layers.count - 1))
}
  

Вспомогательный код:

 enum LayerType: Int64 {
    case hybrid = 0
    case satellite = 1
    case property = 2
}

struct Layer {
    var id: LayerType
    var identifier: String
    var name: String
    var url: URL?
}

let layers = [
    Layer(id: .hybrid, identifier: "hybrid", name: "Hybrid", url: URL(string: "mapbox://styles/XXX")),
    Layer(id: .satellite, identifier: "sat", name: "Satellite", url: URL(string: "mapbox://styles/XXX")),
    Layer(id: .property, identifier: "property", name: "Property", url: URL(string:  "mapbox://styles/XXX"))
]
  

Есть ли какой-либо другой способ показать две загруженные карты одновременно, если у них разные URL-адреса?

Ответ №1:

Вы пытались добавить эти слои в свой стиль в Mapbox Studio? Во время выполнения вы можете включать и выключать их, как описано в примере ниже:

https://docs.mapbox.com/ios/maps/examples/runtime-toggle-layer/

Это позволит вам загрузить автономную область, которая включает все слои.

Комментарии:

1. У меня есть гибридный стиль, стиль спутника и стиль посылки. Я надеялся, что смогу переключать стиль посылки поверх стиля satellite или hybrid, это избавило бы меня от необходимости создавать стили hybrid, satellite, hybrid-parcel и satellite-parcel.

2. Проблема заключается в автономном кэше, который для одного региона может иметь только определенный стиль. Кроме того, насколько мне известно, невозможно отобразить 2 стиля одновременно на одной карте.