Рисование ломаной зависит от местоположения пользователя [SWIFT] - PullRequest
0 голосов
/ 28 февраля 2019

Я создал приложение, в котором у меня есть карта с использованием (MapKit), и когда я нажимаю «Старт», оно автоматически увеличивает мое местоположение и размещает аннотацию.

Но отсюда я запутался.Я пытаюсь нарисовать линию от начальной позиции до текущей.(И обновлять каждое движение, которое я делаю).Например, если я пройду 300 метров на север, я смогу проверить карту на своем телефоне и увидеть, что линия полиция преследует меня.

Итак, начните с аннотации -----> (Polyline) для пользователя.И постоянно обновляйте его (чтобы вы могли видеть движение строки

Как мне это сделать? Если вы знаете, пожалуйста, дайте мне знать в комментариях. Я был бы очень благодарен за это! :))

Код для добавления аннотации в правильной позиции:

@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)

    }

Чтобы сделать ее короткой:

Я хочу, чтобы линия поли начиналась с начальной позиции, а затем следовала за пользователем, куда бы он ни шел, пока не будет нажата кнопка остановки.Как погоня за синей точкой во все времена.Вы знаете?Пожалуйста, ударил меня

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Установите в качестве 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).
        }
}
0 голосов
/ 28 февраля 2019

Реализуете ли вы метод MKMapViewDelegate в своем классе ViewController?

Если вы есть, вы можете получить доступ к делегату из MapView, вам нужно добавить в viewDidLoad func или любой другой желаемый код с координатами:

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/

...