2016-09-03 10 views
0

私は、ユーザーの場所とマーカーの間にルートを描くアプリケーションを持っています。それはうまくいきますが、ユーザーがその場所を変更して他のマーカーを押すと、ルートは最初の場所から描画されます。ユーザーの場所をボタンで更新し、迅速に経路を描く

これは論理です。関数locationManagerは、バッテリを節約するために更新場所を停止していました。これは、コードでした:

func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 

    userLocation = locations[0] 
    long = userLocation.coordinate.longitude; 
    lat = userLocation.coordinate.latitude; 
    locationManager.stopUpdatingLocation() 

    if let location = locations.first { 

     mapView.camera = GMSCameraPosition(target: location.coordinate, zoom: 14, bearing: 0, viewingAngle: 0) 
     } 
} 

それから私は、ユーザーのロケーションを更新し、ポリラインを再描画するためのボタンを作成します。

@IBAction func ActualizarLocalizacion(sender: AnyObject) { 
    locationManager.startUpdatingLocation() 

    originAddresslong = "\(userLocation.coordinate.longitude)" 
    originAddresslat = "\(userLocation.coordinate.latitude)" 

    if markerLocation == nil 
    {markerLocation = userLocation.coordinate 
    } 

    destinationAddresslong = "\(markerLocation.longitude)" 
    destinationAddresslat = "\(markerLocation.latitude)" 


    var directionsURLString = baseURLDirections + "origin=" + originAddresslat + "," + originAddresslong + "&destination=" + destinationAddresslat + "," + destinationAddresslong + "&key=MyKey" 
    directionsURLString = directionsURLString.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)! 
    let directionsURL = NSURL(string: directionsURLString) 


    Alamofire.request(.GET, directionsURL!, parameters: nil).responseJSON { response in 

     switch response.result { 

     case .Success(let data): 

      var json = JSON(data) 
      print(json) 

      let errornum = json["error"] 


      if (errornum == true){ 



      }else{ 

       //NSThread.sleepForTimeInterval (2) 

       var routes = json["routes"].array 

       if routes != nil{ 

        var overViewPolyLine = routes![0]["overview_polyline"]["points"].string 
        print(overViewPolyLine) 
        if overViewPolyLine != nil{ 

         if self.routePolyline != nil { 
          self.routePolyline.map = nil 
          self.routePolyline = nil 
         } 


         let path = GMSMutablePath(fromEncodedPath: overViewPolyLine) 
         self.routePolyline = GMSPolyline(path: path) 
         self.routePolyline.strokeWidth = 5 
         self.routePolyline.strokeColor = UIColor.blueColor() 
         self.routePolyline.map = self.mapView 
         overViewPolyLine = nil 
         routes = nil 
         json = nil 

        } 

       } 
      } 
     case .Failure(let error): 

      print("Hubo un problema con el servidor de direcciones: \(error)") 
     } 

} 
} 

私はその後、私はボタンを3回押さなければならないことがわかり(!!!)正しい再描画のために。私は、コード

locationManager.startUpdatingLocation() 

    NSThread.sleepForTimeInterval (2) 

を使用しているし、私は2回をプッシュする必要がありますが、私はそれが起こっている理由を知りません。私はこれがプロセスの時間の問題でなければならないと思うが、これをどのように処理するのか分からない。

ユーザーがマーカーをタップしたときに使用する関数は同じです(式と変数)。この場合、1回押すだけで済みます。

ありがとうございます。

P.D:

これらの私の輸入です:

import UIKit 
import GoogleMaps 
import SRKUtility 
import SRKRequestManager 
import Alamofire 
import SwiftyJSON 

そして、これは私のmarkerLocation変数です:

func mapView(mapView: GMSMapView!, didTapMarker marker: GMSMarker!) -> Bool { 

    markerLocation = marker.position; 
} 

答えて

1

私はそれを得ました。最後に、私はlocationManagerで導入されたボタンと再描画コードを分離しました。

1- locationmanager FUNCのlocationManager(マネージャー:CLLocationManager、didUpdateLocations場所:[CLLocation]){

userLocation = locations[0] 
    long = userLocation.coordinate.longitude; 
    lat = userLocation.coordinate.latitude; 

    originAddresslong = "\(userLocation.coordinate.longitude)" 
    originAddresslat = "\(userLocation.coordinate.latitude)" 

    if markerLocation == nil 
    {markerLocation = userLocation.coordinate 
    } 

    destinationAddresslong = "\(markerLocation.longitude)" 
    destinationAddresslat = "\(markerLocation.latitude)" 



    var directionsURLString = baseURLDirections + "origin=" + originAddresslat + "," + originAddresslong + "&destination=" + destinationAddresslat + "," + destinationAddresslong + "&key=AIzaSyB4xO_8B0ZoA8lsAgRjqpqJjgWHbb5X3u0" 
    directionsURLString = directionsURLString.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)! 
    let directionsURL = NSURL(string: directionsURLString) 


    Alamofire.request(.GET, directionsURL!, parameters: nil).responseJSON { response in 

     switch response.result { 

     case .Success(let data): 

      var json = JSON(data) 
      print(json) 

      let errornum = json["error"] 


      if (errornum == true){ 



      }else{ 

       //NSThread.sleepForTimeInterval (2) 

       var routes = json["routes"].array 

       if routes != nil{ 

        var overViewPolyLine = routes![0]["overview_polyline"]["points"].string 
        let distancia = routes![0]["legs"][0]["distance"]["text"].string 
        if overViewPolyLine != nil{ 

         if self.routePolyline != nil { 
          self.routePolyline.map = nil 
          self.routePolyline = nil 
         } 


         let path = GMSMutablePath(fromEncodedPath: overViewPolyLine) 
         self.routePolyline = GMSPolyline(path: path) 
         self.routePolyline.strokeWidth = 5 
         self.routePolyline.strokeColor = UIColor.blueColor() 
         self.routePolyline.map = self.mapView 

         self.DistanciaLabel.setTitle(distancia,forState: UIControlState.Normal) 

         overViewPolyLine = nil 
         routes = nil 
         json = nil 

        } 

       } 
      } 
     case .Failure(let error): 

      print("Hubo un problema con el servidor de direcciones: \(error)") 
     } 

    } 

    locationManager.stopUpdatingLocation() 

    if let location = locations.first { 
     mapView.camera = GMSCameraPosition(target: location.coordinate, zoom: 14, bearing: 0, viewingAngle: 0) 

    } 

} 

2-ボタン

@IBAction func ActualizarLocalizacion(sender: AnyObject) { 
    locationManager.startUpdatingLocation()  
     } 
これは、最終的なコードであります
関連する問題