Рисование маршрута в MapKit в iOS

Вы объявляете свои переменные глобально - используйте let, потому что это ограничено рамками (var является областью видимости функции):

for (let obj of objTasks) {
    let title = obj.title;
    let author = obj.author;
    let anchor = document.createElement("a");
    anchor.addEventListener("click", () => { task(title, author) });
}
54
задан Cœur 23 January 2019 в 16:58
поделиться

4 ответа

Это непростой вопрос. С MapKit это невозможно сделать: достаточно легко рисовать линии, когда вы знаете координаты, но MapKit не даст вам доступа к дорогам или другой информации о маршрутах. Я бы сказал, что вам нужно вызвать внешний API, чтобы получить ваши данные.

Я играл с API cloudmade.com. Сервер векторных потоков должен возвращать то, что вам нужно, а затем вы можете нарисовать это на своей карте. Однако расхождения между картами Google и картами OSM , используемыми cloudmade, могут побудить вас полностью использовать облачные карты: у них есть эквивалент MapKit.

P.S .: Другие поставщики картографии - Google, Bing и т. Д. Также могут предоставлять аналогичные каналы данных. Я только недавно смотрел OSM / Cloudmade.

P.P.S .: Все это мелочи для новичков! Удачи!

24
ответ дан 7 November 2019 в 07:53
поделиться

Согласно 2019, с iOS12 или iOS13, довольно легко потянуть маршрут между двумя точками. Вот, типичный мой код, который тянет маршрут между двумя ПОИ, CLLocation и CLPlacemark, который можно легко адаптировать к контексту.

/// The map view to use to draw the route
lazy var mapView: MKMapView = {
    let m = MKMapView()
    m.delegate = self

    // Attach to the controller view
    view.addSubview(m)
    // Don't forget to setup its details
    return m
}()

/// Having the source:
let from: CLLocation

/// And the destination
let to: CLPlacemark


/// Compute and draw the route between the two POI.
func getAndDrawRoute() {

    /// Get the route, driving

    let ok = route(from: from, to: to, transportType: .automobile) { routes, error in
        if let error = error {
            // *** Handle the error here
            print("\(type(of: self)).\(#function): *** Error: \(error)")

            // blah blah
            return
        }

        // Get the route among the multiple possibilities. Here we take the first one to keep this sniper short

        guard let route = routes.first else {
            // *** Handle the error: no route exits
            print("\(type(of: self)).\(#function): *** Warning: no route exits")
            // blah blah
            return 
        }

        // Route exists
        print("Found the route: \(route)")

        // Draw it
        self.mapView.draw(route: route)
    }
}

/**
Route from a source to the destination locations.

- Parameters:
    - from: The source location;
    - toPlacemark: The destination `MKPlaceMark`;
    - transportType: The transport type;
    - completion: The completion closure.

- Returns: `true` if the route can be traced, or false if the user's position is not yet available

*/
public func route(from source: CLLocation, toMKPlacemark destinationPlacemark: MKPlacemark, transportType: MKDirectionsTransportType, completion: @escaping RouteCompletion) {

    let sourcePlacemark = MKPlacemark(coordinate: source.coordinate)

    let sourceMapItem = MKMapItem(placemark: sourcePlacemark)
    let destinationMapItem = MKMapItem(placemark: destinationPlacemark)

    let directionRequest = MKDirections.Request()
    directionRequest.source = sourceMapItem
    directionRequest.destination = destinationMapItem
    directionRequest.transportType = transportType

    // Calculate the direction
    let directions = MKDirections(request: directionRequest)

    // And get the routes
    directions.calculate { response, error in

        guard let response = response else {
            if let error = error {
                print("\(type(of: self)).\(#function): *** Error: \(error.localizedDescription)")
            }
            completion(nil, error)
            return
        }

        completion(response.routes, nil)
    }
}

/// Adds the route overlay
public func draw(route: MKRoute) {

    mapView.addOverlay(route.polyline)
}

/// Renders the overlays, inclusion the route
public func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
    // If you want to draw a circle to fit your specifics
    if overlay is MKCircle {
        let renderer = MKCircleRenderer(overlay: overlay)
        renderer.fillColor      = UIColor.blue.withAlphaComponent(0.1)
        renderer.strokeColor    = .blue
        renderer.lineWidth      = 1
        return renderer
    }

    // If you want to draw a route (polyline) to fit your specifics
    if overlay is MKPolyline {

        let renderer = MKPolylineRenderer(overlay: overlay)

        renderer.strokeColor    = UIColor.init(displayP3Red: 0.15, green: 0.5, blue: 1, alpha: 0.9)

        renderer.lineWidth      = 10.0

        return renderer
    }

    return MKOverlayRenderer(overlay: overlay)
}
0
ответ дан 7 November 2019 в 07:53
поделиться

Андиих правильно понял. MapKit не позволит вам этого сделать. К сожалению, Google тоже не позволит вам делать то, что вы хотите.

Когда Apple анонсировала MapKit и все остальное, они также прямо заявили, что любые навигационные приложения будут BYOM: Bring Your Own Maps, поэтому любое навигационное приложение использует свой собственный набор инструментов отображения.

Условия использования Google запрещают вам даже отображать маршруты поверх своих карт:

http://code.google.com/intl/de/apis/maps/iphone/terms.html

Ограничения лицензии :

10.9 использовать Сервис или Контент с любыми продуктами, системами или приложениями для или в связи с:

(a) навигацией в реальном времени или указаниями по маршруту , включая, помимо прочего для пошаговых указаний по маршруту, которые синхронизируются с положением сенсорного устройства пользователя;

(b) любые системы или функции для {{ 1}} автоматический или автономный контроль поведения автомобиля; или

(c) диспетчеризация, управление парком, отслеживание бизнес-активов или аналогичные корпоративные приложения (Google Maps API может использоваться для отслеживания активов {{1} } (например, автомобили, автобусы или другие транспортные средства), если приложение отслеживания доступно для общественности бесплатно. Например, вы может предлагать бесплатную общедоступную реализацию API Карт , которая отображает в режиме реального времени информацию о статусе общественного транспорта или другого транспорта .

К сожалению, это включает в себя то, что вы хотели бы сделать . Надеюсь, что однажды MapKit будет расширен, чтобы позволить такие функции ... хотя маловероятно.

Удачи.

12
ответ дан 7 November 2019 в 07:53
поделиться

Возможно, вы захотите взглянуть на https://github.com/leviathan/nvpolyline Это решение особенно нацелено на версии iPhone OS до версии 4.0

Хотя это также может быть используется в версии 4.0. Надеюсь, это поможет.

5
ответ дан 7 November 2019 в 07:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: