2012-01-13 22 views
9

Tengo lo siguiente hasta ahora, pero no puedo encontrar una manera ordenada de obtener las letras de dirección sin un montón de enunciados desordenados. ¿Algunas ideas? Idealmente, me gustaría extender la clase CLLocation con una categoría para hacer esto.Convertir coordenadas decimales en grados, minutos, segundos, dirección

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

Para el registro hice lo siguiente.

-(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

¿Estoy siendo denso o es solo el signo numérico de la longitud/lat que determina NESW? Entonces, simplemente usaría: 'NSLog (@"% @% @ ", (lat> 0)? @" N ": (lat <0)? @" S ": @" ", (long> 0)? @ "E": (long <0)? @ "W"); ' Todavía tiene un elemento de" messs ifs ", supongo. –

Respuesta

12

manera estándar:

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

Sí, esto es lo que terminé haciendo. Usted respondió primero. :) – trapper

3

Aquí hay una solución en 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"); 
    } 

Este es un ejemplo de ejecución:

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

que imprime:

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

Espero que esto ayude, y que haga lo correcto. ¡Buena suerte!

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

¡Ha sido un error! Adecuada es

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

He aquí algunos de Objective-C basado en la solución de Daniel arriba:

- (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

¿Cómo sería eso rápido? – MwcsMac

2

Si usted quiere hacerlo en rápida se puede hacer algo así:

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

Con respecto para la respuesta de Alex, aquí hay una solución en Swift 3 con una tupla de salida. Devuelve las coordenadas en una tupla.

Además, realmente amplía la clase CLLocationDegrees y no requiere un parámetro adicional.

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) 
    } 

} 
Cuestiones relacionadas