Akash Savediya
Akash Savediya

Reputation: 11

I'm trying to draw polyline on coordinates(lat, long) coming from API using swift 3 in map kit but unable to make polyline

import UIKit
import MapKit
import CoreLocation
import AddressBook

class ViewController: UIViewController, MKMapViewDelegate, CLLocationManagerDelegate {

    @IBOutlet weak var TheMap: MKMapView!

    override func viewDidLoad() {
        super.viewDidLoad()

        zoomToRegion()
        location()
    }

    func centerMapOnLocation(location: MKPointAnnotation, regionRadius: Double) {
        let coordinateRegion = MKCoordinateRegionMakeWithDistance(location.coordinate,
                                                                  regionRadius * 2.0, regionRadius * 2.0)
        TheMap.setRegion(coordinateRegion, animated: true)

    }



    //MARK:- MapViewDelegate methods

    func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
        let polylineRenderer = MKPolylineRenderer(overlay: overlay)

        if overlay is MKPolyline {
            polylineRenderer.strokeColor = UIColor.blue
            polylineRenderer.lineWidth = 5

        }
        return polylineRenderer
    }



    //MARK:- Zoom to region

    func zoomToRegion() {
        let location = CLLocationCoordinate2D(latitude: 28.618945, longitude: 77.377347400000005)
        let region = MKCoordinateRegionMakeWithDistance(location, 5000.0, 7000.0)
        TheMap.setRegion(region, animated: true)
    }

    // API CALL FUNCTION

    func location() {

        let user = "userid"
        let password = "password"

        let postString = ["empid":user, "date1": password]
        var request = URLRequest(url:URL(string: "http://mydomainhere.com/airtel_hrm/webapi/api/getpunchdeytails")!)
        request.httpMethod = "POST"
        request.httpBody = try! JSONSerialization.data(withJSONObject: postString, options:.prettyPrinted)

        let task = URLSession.shared.dataTask(with: request) { (data: Data?, response: URLResponse?, error: Error?)in

            if error != nil
            {
                print("error=\(error)")
                return
            }
            do {
                if let json = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String: Any],
                    let data = json["punchdetails"] as? [[String: Any]] {
                    //print(data)

                    for datas in data {
                        let lat  = datas["punch_loc_lat"] as! String
                        let long = datas["punch_loc_long"] as! String

                        var annotations = [MKPointAnnotation]()

                        let latitude = CLLocationDegrees(lat)
                        let longitude = CLLocationDegrees(long)
                        let coordinate = CLLocationCoordinate2D(latitude: latitude!, longitude: longitude!)
                        let annotation = MKPointAnnotation()
                        annotation.coordinate = coordinate
                        annotations.append(annotation)


                        self.TheMap.addAnnotations(annotations)
                        self.TheMap.delegate = self

                        self.centerMapOnLocation(location: annotations[0], regionRadius: 2000.0)

                        // Connect all the mappoints using Poly line.

                        var points: [CLLocationCoordinate2D] = [coordinate] //[CLLocationCoordinate2D]()

                        for annotation in annotations {
                            points.append(annotation.coordinate)
                        }

                        print("this is points = \(points)")

                        let polyline = MKPolyline(coordinates: &points, count: points.count)

                        //self.TheMap.add(polyline)

                    } //for loop closed

                }
            } catch {
                print(error)
            }

        }
        task.resume()


    }

}

Upvotes: 1

Views: 794

Answers (1)

Rob
Rob

Reputation: 438212

I'm sure if you shared the results of the print statement, the problem would have been obvious. You're probably seeing lots of print statements. Bottom line, you should define your array outside of the for loop, only append values within the loop, and then add the polyline after the loop:

do {
    if let json = try JSONSerialization.jsonObject(with: data!) as? [String: Any],
        let data = json["punchdetails"] as? [[String: Any]] {

        var annotations = [MKPointAnnotation]()

        for datas in data {
            let lat  = datas["punch_loc_lat"] as! String
            let long = datas["punch_loc_long"] as! String

            let latitude = CLLocationDegrees(lat)
            let longitude = CLLocationDegrees(long)
            let coordinate = CLLocationCoordinate2D(latitude: latitude!, longitude: longitude!)
            let annotation = MKPointAnnotation()
            annotation.coordinate = coordinate
            annotations.append(annotation)
        }

        self.TheMap.delegate = self  // you really should do this in IB or, if you feel compelled to do it programmatically, in viewDidLoad

        // Connect all the mappoints using Poly line.

        let points = annotations.map { $0.coordinate }

        print("this is points = \(points)")

        let polyline = MKPolyline(coordinates: &points, count: points.count)

        DispatchQueue.main.async {
            self.centerMapOnLocation(location: annotations[0], regionRadius: 2000.0)
            self.TheMap.addAnnotations(annotations)
            self.TheMap.add(polyline)
        }
    }
} catch {
    print(error)
}

Note, I'd also do all interaction with the map view from the main queue.

Upvotes: 1

Related Questions