[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])