将十进制坐标转换为度,分,秒,方向

到目前为止,我有以下几个方面的内容,但是如果没有一堆乱七八糟的陈述,不能弄清楚方向字母的整齐方式。 有任何想法吗? 理想情况下,我想用一个类来扩展CLLocation类来做到这一点。

-(NSString *)nicePosition{ double latitude = [self.latitude doubleValue]; double longitude = [self.longitude doubleValue]; int latSeconds = (int)round(latitude * 3600); int latDegrees = latSeconds / 3600; latSeconds = abs(latSeconds % 3600); int latMinutes = latSeconds / 60; latSeconds %= 60; int longSeconds = (int)round(longitude * 3600); int longDegrees = longSeconds / 3600; longSeconds = abs(longSeconds % 3600); int longMinutes = longSeconds / 60; longSeconds %= 60; //TODO: Use N,E,S,W notation in lat/long return [NSString stringWithFormat:@"%i° %i' %i\", %i° %i' %i\"", latDegrees, latMinutes, latSeconds, longDegrees, longMinutes, longSeconds]; } 

为了logging我做了以下。

 -(NSString *)nicePosition{ double latitude = [self.latitude doubleValue]; double longitude = [self.longitude doubleValue]; int latSeconds = (int)round(abs(latitude * 3600)); int latDegrees = latSeconds / 3600; latSeconds = latSeconds % 3600; int latMinutes = latSeconds / 60; latSeconds %= 60; int longSeconds = (int)round(abs(longitude * 3600)); int longDegrees = longSeconds / 3600; longSeconds = longSeconds % 3600; int longMinutes = longSeconds / 60; longSeconds %= 60; char latDirection = (latitude >= 0) ? 'N' : 'S'; char longDirection = (longitude >= 0) ? 'E' : 'W'; return [NSString stringWithFormat:@"%i° %i' %i\" %c, %i° %i' %i\" %c", latDegrees, latMinutes, latSeconds, latDirection, longDegrees, longMinutes, longSeconds, longDirection]; } 

标准方式:

 char lonLetter = (lon > 0) ? 'E' : 'W'; char latLetter = (lat > 0) ? 'N' : 'S'; 

这里有一些基于Daniel的解决scheme的Objective-C:

 - (NSString*)coordinateString { int latSeconds = (int)(self.latitude * 3600); int latDegrees = latSeconds / 3600; latSeconds = ABS(latSeconds % 3600); int latMinutes = latSeconds / 60; latSeconds %= 60; int longSeconds = (int)(self.longitude * 3600); int longDegrees = longSeconds / 3600; longSeconds = ABS(longSeconds % 3600); int longMinutes = longSeconds / 60; longSeconds %= 60; NSString* result = [NSString stringWithFormat:@"%d°%d'%d\"%@ %d°%d'%d\"%@", ABS(latDegrees), latMinutes, latSeconds, latDegrees >= 0 ? @"N" : @"S", ABS(longDegrees), longMinutes, longSeconds, longDegrees >= 0 ? @"E" : @"W"]; return result; } 

以下是C#中的解决scheme:

  void Run(double latitude, double longitude) { int latSeconds = (int)Math.Round(latitude * 3600); int latDegrees = latSeconds / 3600; latSeconds = Math.Abs(latSeconds % 3600); int latMinutes = latSeconds / 60; latSeconds %= 60; int longSeconds = (int)Math.Round(longitude * 3600); int longDegrees = longSeconds / 3600; longSeconds = Math.Abs(longSeconds % 3600); int longMinutes = longSeconds / 60; longSeconds %= 60; Console.WriteLine("{0}° {1}' {2}\" {3}, {4}° {5}' {6}\" {7}", Math.Abs(latDegrees), latMinutes, latSeconds, latDegrees >= 0 ? "N" : "S", Math.Abs(longDegrees), longMinutes, longSeconds, latDegrees >= 0 ? "E" : "W"); } 

这是一个示例运行:

 new Program().Run(-15.14131211, 56.345678); new Program().Run(15.14131211, -56.345678); new Program().Run(15.14131211, 56.345678); 

打印:

 15° 8' 29" S, 56° 20' 44" W 15° 8' 29" N, 56° 20' 44" E 15° 8' 29" N, 56° 20' 44" E 

希望这有助于,而且它做对了。 祝你好运!

如果你想迅速做到这一点,你可以做出这样的事情:

 import MapKit extension CLLocationCoordinate2D { var latitudeDegreeDescription: String { return fromDecToDeg(self.latitude) + " \(self.latitude >= 0 ? "N" : "S")" } var longitudeDegreeDescription: String { return fromDecToDeg(self.longitude) + " \(self.longitude >= 0 ? "E" : "W")" } private func fromDecToDeg(input: Double) -> String { var inputSeconds = Int(input * 3600) let inputDegrees = inputSeconds / 3600 inputSeconds = abs(inputSeconds % 3600) let inputMinutes = inputSeconds / 60 inputSeconds %= 60 return "\(abs(inputDegrees))°\(inputMinutes)'\(inputSeconds)''" } } 

关于Alex的回答,这里是一个Swift 3中带有输出元组的解决scheme。 它返回元组中的坐标。

此外,它确实扩展了CLLocationDegrees类,并且不需要额外的参数。

 import MapKit extension CLLocationDegrees { func degreeRepresentation() -> (northOrEast: Bool, degrees: Int, minutes: Int, seconds: Int) { var inputSeconds = Int(self * 3600) let inputDegrees = inputSeconds / 3600 inputSeconds = abs(inputSeconds % 3600) let inputMinutes = inputSeconds / 60 inputSeconds %= 60 return (inputDegrees > 0, abs(inputDegrees), inputMinutes, inputSeconds) } } 
 int latSeconds = (int)round(abs(latitude * 3600)); 

这是错误的! 适当的是

 int latSeconds = abs(round(latitude * 3600));