3D складка в виде карты местоположения пользователя ios

#ios #swift #xcode #mapbox #mapbox-ios

Вопрос:

Я использую Mapbox Maps iOS для создания пользовательской 3d-складки и использую ее для отображения местоположения пользователя.

Кажется, все работает, камера перенаправляется на местоположение пользователя, складка успешно загружается. Однако у меня возникли проблемы с настройкой местоположения складки в соответствии с местоположением пользователя.

Вы можете видеть, что от меня требуется установить location морщинку в Model экземпляре в loadCharacter() функции. Но я не уверен, как связать это с текущим местоположением пользователя.

Пожалуйста, помогите!!!

 // ViewController.swift

import UIKit
import MapboxMaps


public class ViewController: UIViewController {
    internal var mapView: MapView!
    internal var cameraLocationConsumer: CameraLocationConsumer!

    override public func viewDidLoad() {
        super.viewDidLoad()

        let options = MapInitOptions(cameraOptions: CameraOptions(zoom: 16))

        mapView = MapView(frame: view.bounds, mapInitOptions: options)
        mapView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
        view.addSubview(mapView)
        
        
        mapView.mapboxMap.onNext(.styleLoaded) { _ in
            self.loadCharacter()
        }
        
        cameraLocationConsumer = CameraLocationConsumer(mapView: mapView)
        
        mapView.mapboxMap.onNext(.mapLoaded) { _ in
            self.mapView.location.addLocationConsumer(newConsumer: self.cameraLocationConsumer)
        }
    }
    
    
    internal func loadCharacter() {

        let uri = Bundle.main.url(forResource: "race_car_model",
                                  withExtension: "gltf")

        // Instantiate the model
        let myModel = Model(uri: uri,
                            position: [-77.150925, 39.085006],
                            orientation: [0, 0, 180])

        // Setting an expression to  scale the model based on camera zoom
        let scalingExpression = Exp(.interpolate) {
            Exp(.linear)
            Exp(.zoom)
            0
            Exp(.literal) {
                [256000.0, 256000.0, 256000.0]
            }
            4
            Exp(.literal) {
                [40000.0, 40000.0, 40000.0]
            }
            8
            Exp(.literal) {
                [2000.0, 2000.0, 2000.0]
            }
            12
            Exp(.literal) {
                [100.0, 100.0, 100.0]
            }
            16
            Exp(.literal) {
                [7.0, 7.0, 7.0]
            }
            20
            Exp(.literal) {
                [1.0, 1.0, 1.0]
            }
        }

        let configuration = Puck3DConfiguration(model: myModel, modelScale: .expression(scalingExpression))
        mapView.location.options.puckType = .puck3D(configuration)

    }
}


// Create class which conforms to LocationConsumer, update the camera's centerCoordinate when a locationUpdate is received
public class CameraLocationConsumer: LocationConsumer {
    weak var mapView: MapView?

    init(mapView: MapView) {
        self.mapView = mapView
    }
    

    public func locationUpdate(newLocation: Location) {

        mapView?.camera.ease(
            to: CameraOptions(center: newLocation.coordinate, zoom: 16, pitch: 50.0),
            duration: 1.3)

    }
}
 

Ответ №1:

В Mapbox есть репозиторий с примерами вариантов использования навигации, которые вы можете попробовать, включая образец 3D-шайбы.

Обратите внимание, что в этом примере используется API из Navigation SDK, который, в свою очередь, использует API SDK карт внутри. К счастью, навигационный SDK с открытым исходным кодом, вы всегда можете посмотреть, как он отображает текущее местоположение пользователя здесь.