Вычислять маршрут между двумя точками с Google Maps в IOS

Я использую SDK Google Maps в и я нуждаюсь в том, чтобы знать, как я могу вычислять маршрут, который есть между двумя точками.

У меня есть координаты этих двух точек и через функцию Geocoding SDK у меня есть также Ваши адреса.

Я попытался с функцией Directions добавляя адрес начала и адрес конца, но он дает мне ошибку.

Какое-то возможное решение?

6
задан 27.12.2016, 12:02
1 ответ

чтобы возвращать дистанцию между 2 точками не необходимо, чтобы ты использовал какой-то api google, ты можешь делать родным способом в ios с CLLocation единственное, что ты должен делать, он состоит в том, чтобы осуществлять следующий метод

import CoreLocation


let Punto1 = CLLocation(latitude: 5.0, longitude: 5.0)
let Punto2 = CLLocation(latitude: 5.0, longitude: 3.0)

let DistanciaEnMetros = Punto1.distance(from: Punto2) 
-3
ответ дан 24.11.2019, 13:02
  • 1
    Этот ответ не то, что он просит. – mhergon 24.11.2016, 13:09
  • 2
    Ты должен давать ответ согласно требованиям OP – Randall Sandoval 29.12.2016, 16:37

Я нашел достаточно полный учебник для Google Maps для в том, который объясняет во всех деталях шаги, которые нужно продолжать, чтобы представлять настоящее положение пользователю, создавать маршрут, рисовать маршрут, добавлять промежуточные дорожки, и т.д.

Для твоего случая я думаю, что секция Drawing в Route налаживает достаточно добра, которое ты просишь, так как он показывает тебе шаги, которые нужно продолжать, чтобы получать маршрут между адресом начала и один из конца и потом рисовать соответствующий маршрут.

Руководитель - следующий A Свифт Туториэл for Google Maps SDK

Далее я помещаю тебе код, что я думаю, что он может служить тебе помощью, где унифицированный указатель ресурса, чтобы реализовывать просьбу в WS Google:

let baseURLDirections = "https://maps.googleapis.com/maps/api/directions/json?"

Функция, которая берется за это, - следующая:

func getDirections(origin: String!, destination: String!, waypoints: Array<String>!, travelMode: AnyObject!, completionHandler: ((status: String, success: Bool) -> Void)) {
    if let originLocation = origin {
        if let destinationLocation = destination {
            var directionsURLString = baseURLDirections + "origin=" + originLocation + "&destination=" + destinationLocation

            directionsURLString = directionsURLString.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)!

            let directionsURL = NSURL(string: directionsURLString)

            dispatch_async(dispatch_get_main_queue(), { () -> Void in
                let directionsData = NSData(contentsOfURL: directionsURL!)

                var error: NSError?
                let dictionary: Dictionary<NSObject, AnyObject> = NSJSONSerialization.JSONObjectWithData(directionsData!, options: NSJSONReadingOptions.MutableContainers, error: &error) as Dictionary<NSObject, AnyObject>

                if (error != nil) {
                    println(error)
                    completionHandler(status: "", success: false)
                }
                else {
                    let status = dictionary["status"] as String

                    if status == "OK" {
                        self.selectedRoute = (dictionary["routes"] as Array<Dictionary<NSObject, AnyObject>>)[0]
                        self.overviewPolyline = self.selectedRoute["overview_polyline"] as Dictionary<NSObject, AnyObject>

                        let legs = self.selectedRoute["legs"] as Array<Dictionary<NSObject, AnyObject>>

                        let startLocationDictionary = legs[0]["start_location"] as Dictionary<NSObject, AnyObject>
                        self.originCoordinate = CLLocationCoordinate2DMake(startLocationDictionary["lat"] as Double, startLocationDictionary["lng"] as Double)

                        let endLocationDictionary = legs[legs.count - 1]["end_location"] as Dictionary<NSObject, AnyObject>
                        self.destinationCoordinate = CLLocationCoordinate2DMake(endLocationDictionary["lat"] as Double, endLocationDictionary["lng"] as Double)

                        self.originAddress = legs[0]["start_address"] as String
                        self.destinationAddress = legs[legs.count - 1]["end_address"] as String

                        self.calculateTotalDistanceAndDuration()                        

                        completionHandler(status: status, success: true)
                    }
                    else {
                        completionHandler(status: status, success: false)
                    }
                }
            })
        }
        else {
            completionHandler(status: "Destination is nil.", success: false)
        }
    }
    else {
        completionHandler(status: "Origin is nil", success: false)
    }
}
2
ответ дан 03.12.2019, 19:49

Этот ответ не дает решение используя услуги Google. Существуют несколько альтернатив в (ограниченные) услуги Google Maps. С одной стороны у нас есть OpenStreetMaps (OSM) и Ваш проект OSRM, который приносит осуществленные несколько услуг между ними, услуга Route Service что является тем, который интересует в этом случае:

Route service

Finds the fastest route between coordinates in the supplied order.

В документации ты найдешь некие параметры интереса, который ты можешь посылать в твоей просьбе. Итак решение - это такое простое как посылать просьбу HTTP с информацией, потребованной у услуги OSM и использовать геометрию, возвращенную вышеупомянутой просьбой.

Другая альтернатива состоит в том, чтобы располагать твоей собственной картографией и твоим собственным сервером, ты мог бы осуществлять твою собственную услугу маршрутов, считая хранилищем данных базу данных PostgreSQL/PostGIS и имея расширение pgrouting. Если бы у тебя была обильная и точная картография, данные в реальном времени, и т.д., это было бы решение, которое он взял бы. Также он имел бы в виду географическое расширение для этого решения, так как трудность коренится получать обновленные данные о шоссе для всей зоны интереса.

Очевидно чтобы делать то, что ты желаешь, ты не будешь начинать осуществлять твой собственный API. Будь исследовано немного на услугах OSM, что по отношению к части, того, чтобы быть бесплатными, они не имеют ограничений использования.

1
ответ дан 03.12.2019, 19:49