【问题标题】:Draw polyline depend on user location [SWIFT]根据用户位置绘制折线 [SWIFT]
【发布时间】:2019-07-22 13:34:51
【问题描述】:

我创建了一个应用程序,其中我使用 (MapKit) 制作了一张地图,当我按下“开始”时,它会自动放大我的位置并放置注释。

但是从这里开始,我很困惑。我正在尝试从起始位置到当前位置绘制一条折线。 (并更新我所做的每一个动作)。举个例子,如果我向北走 300 米,我应该能够查看手机上的地图并看到折线在跟随我。

所以从注解开始----->(折线)到用户。并随时更新(这样你就可以看到线条在移动

我怎样才能做到这一点?如果您知道,请在 cmets 中告诉我。我会非常感谢它! :)

在正确位置添加注解的代码:

@IBAction func StartWalk(_ sender: Any)
    {
        if play == true
        {
            play = false

            //Set resetbutton disabled.
            ResetButton.isHidden = true

            //Set new image when play is true
            PlayStop.setImage(UIImage(named: "Stop"), for: .normal)

            //Bool to check if button is stopped (op)
            isStopped = false

            //Checking userpermission to allow map and current location
            if (CLLocationManager.locationServicesEnabled())
            {
                locationManager.requestAlwaysAuthorization()
                locationManager.requestWhenInUseAuthorization()

                //Retrieve current position
                if let userLocation = locationManager.location?.coordinate
                {
                    //Zooming in to current position
                    let viewRegion = MKCoordinateRegion(center: userLocation, latitudinalMeters: 200, longitudinalMeters: 200)
                    mapView.setRegion(viewRegion, animated: false)

                    //Creating a start annotation
                    let annotation = MKPointAnnotation()
                    annotation.title = "Start"
                    annotation.coordinate = userLocation
                    mapView.addAnnotation(annotation)


                }
            }

        }

    }

这是折线的想法:

//Create polyline
    func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer
    {
        if(overlay is MKPolyline)
        {
            let polyLineRender = MKPolylineRenderer(overlay: overlay)
            polyLineRender.strokeColor = UIColor.blue.withAlphaComponent(1)
            polyLineRender.lineWidth = 3

            return polyLineRender
        }

        return MKPolylineRenderer()
    }

    //Updating location + polylines
    @objc func update()
    {
        //Startposition
        let startLat = locationManager.location?.coordinate.latitude
        let startlong = locationManager.location?.coordinate.longitude
        let startResult = CLLocation(latitude: startLat!, longitude: startlong!)


        //This should be the current user location.
        let stopLat = locationManager.location?.coordinate.latitude
        let stopLong  = locationManager.location?.coordinate.longitude
        let stopResult = CLLocation(latitude: stopLat!, longitude: stopLong!)


        let locations =
        [
            CLLocationCoordinate2D(latitude: startLat!, longitude: startlong!),
            CLLocationCoordinate2D(latitude: stopLat!, longitude: stopLong!)
        ]

            //Draw polyline on the map
            let aPolyLine = MKPolyline(coordinates: locations, count: locations.count)

            //Adding polyline to mapview
            mapView.addOverlay(aPolyLine)

    }

简而言之:

我希望折线从起始位置开始,然后跟随用户走到任何地方,直到按下停止按钮。就像一直在追逐蓝点。你知道吗?请打我

【问题讨论】:

    标签: ios swift mapkit polyline


    【解决方案1】:

    您是否在 ViewController 类上实现方法 MKMapViewDelegate ?

    如果您是,您可以从 MapView 访问委托,您必须添加 viewDidLoad 函数或任何其他您希望以下代码和坐标的代码:

    mapView.delegate = self
    // Connect all the mappoints using Poly line.
    
     var points: [CLLocationCoordinate2D] = [CLLocationCoordinate2D]()
    
      for annotation in annotations {
         points.append(annotation.coordinate)
      }     
      var polyline = MKPolyline(coordinates: &points, count: points.count)
      mapView.addOverlay(polyline)
    

    你可以按照下面这个非常好的教程:http://rshankar.com/how-to-add-mapview-annotation-and-draw-polyline-in-swift/

    【讨论】:

    • 我添加了代表,是的。明天早上我会试一试,并尽快重播。非常感谢您的意见!
    【解决方案2】:

    设置为 CLLocationManagerDelegate 和 CoreLocation 将在位置可用时为您提供位置。例如:

    import CoreLocation
    
    class MyViewController: UIViewController, CLLocationManagerDelegate {
    
             override func viewDidLoad() {
                super.viewDidLoad()
                setupCoreLocation()
             }
    
             func setupCoreLocation() {
                let locationManager = CLLocationManager()
                locationManager.delegate = self
    
                switch CLLocationManager.authorizationStatus() {
                case .notDetermined:
                    locationManager.requestWhenInUseAuthorization()
                case .authorizedWhenInUse:
                    // NOTE: I normally only set up "WhenInUse" because "Always"
                    // can quickly drain the battery on a device.
                    locationManager.startUpdatingLocation()
                default:
                    break
                }
            }
    
            func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
                // Create and add your MKPolyline here based on locations
                // passed (the last element of the array is the most recent
                // position).
            }
    }
    

    【讨论】:

      猜你喜欢
      • 2013-12-19
      • 2015-02-17
      • 1970-01-01
      • 2017-10-28
      • 2017-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-09
      相关资源
      最近更新 更多