json - 使用按钮更新用户位置并快速绘制路线

标签 json swift google-maps time location

我有一个在用户位置和标记之间绘制路线的应用程序。它工作正常,但如果用户更改其位置并插入其他标记,则路线会从第一个位置绘制。

这是合乎逻辑的。 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 次,但我不知道为什么会这样。我怀疑这一定是处理时间的问题,但我不知道如何处理。

我在用户点击标记时使用的功能是相同的(公式和变量),在这种情况下它只需要按一次。

谢谢大家。

PD:

这些是我的进口:

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

这是我的 markerLocation 变量:

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

    markerLocation = marker.position;
}

最佳答案

我明白了。最后我把按钮和重绘代码分开了,这在locationmanager中已经介绍过了。这是最终代码:

1-位置管理器 func locationManager(manager: CLLocationManager, didUpdateLocations locations: [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()       
        }

关于json - 使用按钮更新用户位置并快速绘制路线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39305316/

相关文章:

javascript - json 文件中的换行问题

authentication - 如何为 Split View Controller 创建启动页面

flutter - 解析 LocalFile : 'E:\android\app\src\main\AndroidManifest.xml' Please ensure that the android manifest is a valid XML document and try again 时出错

ios - viewDidLoad 在更新当前位置后重置 Google map View

android - 从谷歌地图的可见部分检索距离

javascript - 使用每个循环从嵌套 json 获取值

javascript - JSON 返回 [object Object] angularjs

json - CouchDb 2.1.1 管理 API 压缩 PUT 请求

swift - 从未使用过不可变值 'rate' 的初始化

ios - jazzy 的 Xcode 集成脚本,Swift 项目的文档生成器