Swift iOS谷歌地图,路径坐标



我正试图在我的应用程序中创建一个函数,该函数将引导用户找到我创建的标记。这是我正在使用的代码,它工作得很好,它可以获取用户的当前位置并将其显示在地图上。但是我怎样才能找到指向标记的方向呢?

任何awnser都会对有所帮助

class Karta: UIViewController, CLLocationManagerDelegate {
    @IBOutlet var mapView: GMSMapView!
    let locationManager = CLLocationManager()
    override func viewDidLoad() {
        super.viewDidLoad()
        //allow app to track user
        locationManager.delegate = self
        locationManager.requestWhenInUseAuthorization()
        //set out a marker on the map
        var marker = GMSMarker()
        marker.position = CLLocationCoordinate2DMake(56.675907, 12.858798)
        marker.appearAnimation = kGMSMarkerAnimationPop
        marker.icon = UIImage(named: "flag_icon")
        marker.map = mapView
     }
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "Types Segue" {
            let navigationController = segue.destinationViewController as UINavigationController
        }
    }
    func locationManager(manager: CLLocationManager!, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
        //If map is being used
        if status == .AuthorizedWhenInUse {
            var myLocation = mapView
            locationManager.startUpdatingLocation()
            mapView.myLocationEnabled = true
            mapView.settings.myLocationButton = true
        }
    }
    func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) {
        if let location = locations.first as? CLLocation {
            mapView.camera = GMSCameraPosition(target: location.coordinate, zoom: 15, bearing: 0, viewingAngle: 0)
          locationManager.stopUpdatingLocation()
        }
    }
}

所以我最近刚刚解决了这个问题,这是我使用最新版本的Alamofire(4.3)实现的Swift 3

 func fetchMapData() { 
    let directionURL = "https://maps.googleapis.com/maps/api/directions/json?" +
        "origin=(originAddressLat),(originAddressLng)&destination=(destinationAddressLat),(destinationAddressLong)&" +
    "key=YOUROWNSERVERKEY"

    Alamofire.request(directionURL).responseJSON
        { response in
            if let JSON = response.result.value {
                let mapResponse: [String: AnyObject] = JSON as! [String : AnyObject]
                let routesArray = (mapResponse["routes"] as? Array) ?? []
                let routes = (routesArray.first as? Dictionary<String, AnyObject>) ?? [:]
                let overviewPolyline = (routes["overview_polyline"] as? Dictionary<String,AnyObject>) ?? [:]
                let polypoints = (overviewPolyline["points"] as? String) ?? ""
                let line  = polypoints
                self.addPolyLine(encodedString: line)
        }
    }
}
func addPolyLine(encodedString: String) {
    let path = GMSMutablePath(fromEncodedPath: encodedString)
    let polyline = GMSPolyline(path: path)
    polyline.strokeWidth = 5
    polyline.strokeColor = .blue
    polyline.map = whateverYourMapViewObjectIsCalled
}

免责声明:Swift 2

 func addOverlayToMapView(){
        let directionURL = "https://maps.googleapis.com/maps/api/directions/json?origin=(srcLocation.coordinate.latitude),(srcLocation.coordinate.longitude)&destination=(destLocation.coordinate.latitude),(destLocation.coordinate.longitude)&key=Your Server Key"
        Alamofire.request(.GET, directionURL, parameters: nil).responseJSON { response in
            switch response.result {
            case .Success(let data):
                let json = JSON(data)
                print(json)
                let errornum = json["error"]

                if (errornum == true){

                }else{
                    let routes = json["routes"].array
                    if routes != nil{
                        let overViewPolyLine = routes![0]["overview_polyline"]["points"].string
                        print(overViewPolyLine)
                        if overViewPolyLine != nil{
                         self.addPolyLineWithEncodedStringInMap(overViewPolyLine!)
                        }
                    }

                }
            case .Failure(let error):
                print("Request failed with error: (error)")
            }
        }
    }

使用这些点,我们现在使用fromEncodedPath 从两个点创建路径

  func addPolyLineWithEncodedStringInMap(encodedString: String) {
        let path = GMSMutablePath(fromEncodedPath: encodedString)
        let polyLine = GMSPolyline(path: path)
        polyLine.strokeWidth = 5
        polyLine.strokeColor = UIColor.yellowColor()
        polyLine.map = mapView
    }

与苹果的MapKit不同,iOS版谷歌地图SDK本机不包含执行路线计算的方法。

相反,您需要使用Google Directions API:https://developers.google.com/maps/documentation/directions/.这是一个基于HTTP-only的API,Google目前还没有提供任何SDK,但您可以轻松地自己编写包装,也可以从Github上的众多选项中选择一个:

  • https://github.com/sudeepjaiswal/GoogleDirections
  • https://github.com/sebk/GoogleDirections
  • https://github.com/iamamused/iOS-DirectionKit
  • https://github.com/marciniwanicki/OCGoogleDirectionsAPI
  • 以及许多其他

它非常简单如果你在iOS项目中添加了谷歌地图SDK,如果你想实现两个不同方向之间的谷歌地图方向线,我已经用swift 2.3以简单的方式制作了演示代码,请尝试、修改并使用它。!!!

注意:不要忘记更改您想要的lat-long和API密钥(您可以在Google API Manager凭据部分使用无限制的API密钥)

 func callWebService(){
        let url = NSURL(string: "https://maps.googleapis.com/maps/api/directions/json?origin=(18.5235),(73.7184)&destination=(18.7603),(73.8630)&key=AIzaSyDxSgGQX6jrn4iq6dyIWAKEOTneZ3Z8PtU")
        let request = NSURLRequest(URL: url!)
        let config = NSURLSessionConfiguration.defaultSessionConfiguration()
        let session = NSURLSession(configuration: config)
        let task = session.dataTaskWithRequest(request, completionHandler: {(data, response, error) in
            // notice that I can omit the types of data, response and error
            do{
                if let jsonResult = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as? NSDictionary {
                    //print(jsonResult)
                    let routes = jsonResult.valueForKey("routes")
                    //print(routes)
                    let overViewPolyLine = routes![0]["overview_polyline"]!!["points"] as! String
                    print(overViewPolyLine)
                    if overViewPolyLine != ""{
                        //Call on Main Thread
                        dispatch_async(dispatch_get_main_queue()) {
                            self.addPolyLineWithEncodedStringInMap(overViewPolyLine)
                        }

                    }
                }
            }
            catch{
                print("Somthing wrong")
            }
        });
        // do whatever you need with the task e.g. run
        task.resume()
    }
    func addPolyLineWithEncodedStringInMap(encodedString: String) {

        let camera = GMSCameraPosition.cameraWithLatitude(18.5204, longitude: 73.8567, zoom: 10.0)
        let mapView = GMSMapView.mapWithFrame(CGRect.zero, camera: camera)
        mapView.myLocationEnabled = true
        let path = GMSMutablePath(fromEncodedPath: encodedString)
        let polyLine = GMSPolyline(path: path)
        polyLine.strokeWidth = 5
        polyLine.strokeColor = UIColor.yellowColor()
        polyLine.map = mapView
        let smarker = GMSMarker()
        smarker.position = CLLocationCoordinate2D(latitude: 18.5235, longitude: 73.7184)
        smarker.title = "Lavale"
        smarker.snippet = "Maharshtra"
        smarker.map = mapView
        let dmarker = GMSMarker()
        dmarker.position = CLLocationCoordinate2D(latitude: 18.7603, longitude: 73.8630)
        dmarker.title = "Chakan"
        dmarker.snippet = "Maharshtra"
        dmarker.map = mapView
        view = mapView
    }

最新更新