How to draw an arc on Google Maps in iOS?

后端 未结 5 499
佛祖请我去吃肉
佛祖请我去吃肉 2020-12-11 07:26

How to draw an arc between two coordinate points in Google Maps like in this image and same like facebook post in iOS ?

5条回答
  •  一个人的身影
    2020-12-11 08:05

    The answer above does not handle all the corner cases, here is one that draws the arcs nicely:

    func drawArcPolyline(startLocation: CLLocationCoordinate2D?, endLocation: CLLocationCoordinate2D?) {
        if let _ = startLocation, let _ = endLocation {
            //swap the startLocation & endLocation if you want to reverse the direction of polyline arc formed.
    
            var start = startLocation!
            var end = endLocation!
            var gradientColors = GMSStrokeStyle.gradient(
                from: UIColor(red: 11.0/255, green: 211.0/255, blue: 200.0/255, alpha: 1),
                to: UIColor(red: 0/255, green: 44.0/255, blue: 66.0/255, alpha: 1))
    
            if startLocation!.heading(to: endLocation!) < 0.0 {
                // need to reverse the start and end, and reverse the color
                start = endLocation!
                end = startLocation!
    
                gradientColors = GMSStrokeStyle.gradient(
                    from: UIColor(red: 0/255, green: 44.0/255, blue: 66.0/255, alpha: 1),
                    to:  UIColor(red: 11.0/255, green: 211.0/255, blue: 200.0/255, alpha: 1))
            }
    
            let path = GMSMutablePath()
            // Curve Line
            let k = abs(0.3 * sin((start.heading(to: end)).degreesToRadians)) // was 0.3
    
    
            let d = GMSGeometryDistance(start, end)
            let h = GMSGeometryHeading(start, end)
            //Midpoint position
            let p = GMSGeometryOffset(start, d * 0.5, h)
            //Apply some mathematics to calculate position of the circle center
            let x = (1-k*k)*d*0.5/(2*k);
            let r = (1+k*k)*d*0.5/(2*k);
            let c = GMSGeometryOffset(p, x, h + 90.0)
    
            //Polyline options
            //Calculate heading between circle center and two points
            var h1 =  GMSGeometryHeading(c, start)
            var h2 = GMSGeometryHeading(c, end)
    
            if(h1>180){
                h1 = h1 - 360
            }
            if(h2>180){
                h2 = h2 - 360
            }
    
            //Calculate positions of points on circle border and add them to polyline options
            let numpoints = 100.0
            let step = (h2 - h1) / numpoints
            for i in stride(from: 0.0, to: numpoints, by: 1) {
                let pi = GMSGeometryOffset(c, r, h1 + i * step)
                path.add(pi)
            }
            path.add(end)
    
            //Draw polyline
            let polyline = GMSPolyline(path: path)
            polyline.map = mapView // Assign GMSMapView as map
            polyline.strokeWidth = 5.0
            polyline.spans = [GMSStyleSpan(style: gradientColors)]
        }
    }
    

提交回复
热议问题