2012-01-13 7 views
9

У меня есть следующее до сих пор, но не могу понять, какой способ получить буквы направления без кучи беспорядочных утверждений. Есть идеи? В идеале я хотел бы расширить класс 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]; 
} 

Для записи я сделал следующее.

-(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]; 
} 
+0

Я являюсь плотным или это просто численный знак длинного/лат, который определяет NESW? Затем вы просто используете: 'NSLog (@"% @% @ ", (lat> 0)? @" N ": (lat <0)? @" S ": @" ", (long> 0)? @ «E»: (long <0)? @ «W»); ' Все еще есть элемент« messy ifs », я полагаю .. –

ответ

12

Стандартный способ:

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

Да, это то, что я закончил делать. Вы ответили первым. :) – trapper

3

Вот решение в C#:

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 

Надеюсь, что это поможет, и что он поступает правильно. Удачи!

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

Это ошибка! Собственно

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

Вот некоторые 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;  
} 
+0

Как бы это выглядело быстрым? – MwcsMac

2

Если вы хотите сделать это в стрижа вы можете сделать что-то подобное:

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)''" 
    } 
} 
1

Что касается к ответу Алекса, вот решение в Swift 3 с выходным кортежем. Он возвращает координаты в кортеже.

Кроме того, он действительно расширяет класс 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) 
    } 

} 

 Смежные вопросы

  • Нет связанных вопросов^_^