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