[swift] GoogleMap上の2つのCLLocationCoordinate2D間の中間点を算出する

目次

GoogleMap上の2つのCLLocationCoordinate2D間の中間点を算出する

GoogleMap上の2つのCLLocationCoordinate2D間の中間点を算出するには単純に2つのCLLocationCoordinate2Dを足して2で割るだけでは正確に算出できない。

以下のコードを実装して計算する

コード

func locationToDictFromString(location:String) -> NSDictionary {
    let array = location.componentsSeparatedByString(",")
    //print("locationToDictFromString is \(array)")
    let locationDict:NSDictionary = ["latitude": array[0], "longitude": array[1], "radius": array[2]]
    return locationDict
}

// /** Degrees to Radian **/

func degreeToRadian(angle:CLLocationDegrees) -> CGFloat{
    
    return ((CGFloat(angle)) / 180.0 * CGFloat(M_PI))
}

// /** Radians to Degrees **/

func radianToDegree(radian:CGFloat) -> CLLocationDegrees{
    
    return CLLocationDegrees(radian * CGFloat(180.0 / M_PI))
}

func middlePointOfListMarkers(listCoords: [CLLocationCoordinate2D]) -> CLLocationCoordinate2D{
    
    var x = 0.0 as CGFloat
    var y = 0.0 as CGFloat
    var z = 0.0 as CGFloat
    
    for coordinate in listCoords{
        
        var lat:CGFloat = degreeToRadian(coordinate.latitude)
        var lon:CGFloat = degreeToRadian(coordinate.longitude)
        x = x + cos(lat) * cos(lon)
        y = y + cos(lat) * sin(lon);
        z = z + sin(lat);
    }
    
    x = x/CGFloat(listCoords.count)
    
    y = y/CGFloat(listCoords.count)
    
    z = z/CGFloat(listCoords.count)
    var resultLon: CGFloat = atan2(y, x)
    var resultHyp: CGFloat = sqrt(x*x+y*y)
    var resultLat:CGFloat = atan2(z, resultHyp)
    var newLat = radianToDegree(resultLat)
    var newLon = radianToDegree(resultLon)
    var result:CLLocationCoordinate2D = CLLocationCoordinate2D(latitude: newLat, longitude: newLon)
    return result
}

使い方

let latitude: CLLocationDegrees = 1.304843 //Singapore
let longitude: CLLocationDegrees = 103.831824 //Singapore
    
let oldlatitude: CLLocationDegrees = 1.304850 //Singapore
let oldlongitude: CLLocationDegrees = 103.831830 //Singapore

let firstPoint = CLLocationCoordinate2DMake(latitude, longitude)
let secondPoint = CLLocationCoordinate2DMake(oldlatitude, oldlongitude)

let midPoint = middlePointOfListMarkers([firstPoint,secondPoint])

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です