#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 стиля одновременно на одной карте.