2012-01-13 14 views
9

Ho il seguente fino ad ora, ma non riesco a capire un modo ordinato per ottenere le lettere di direzione senza una serie di istruzioni disordinate. Qualche idea? Idealmente mi piacerebbe estendere la classe CLLocation con una categoria per farlo.Converti la coordinata decimale in gradi, minuti, secondi, direzione

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

Per la cronaca ho fatto quanto segue.

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

Sono denso o è solo il segno numerico del long/lat che determina NESW? Quindi useresti semplicemente: 'NSLog (@"% @% @ ", (lat> 0)? @" N ": (lat <0)? @" S ": @" ", (long> 0)? @ "E": (lungo <0)? @ "W"); ' Ho ancora un elemento di" disordinato ifs "suppongo .. –

risposta

12

modo standard:

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

Sì, questo è quello che ho finito per fare. Hai risposto per primo. :) – trapper

3

Ecco una soluzione in 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"); 
    } 

Si tratta di una corsa esempio:

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

che stampa:

Spero che questo aiuti e che faccia la cosa giusta. In bocca al lupo!

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

Questo è un errore! Una corretta è

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

Ecco alcuni Objective-C sulla base di soluzione di Daniel sopra:

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

Come sarebbe quello sguardo in rapido? – MwcsMac

2

Se si vuole farlo in rapida si può fare una cosa del genere:

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

Per quanto riguarda alla risposta di Alex, ecco una soluzione in Swift 3 con una tupla di output. Restituisce le coordinate in una tupla.

Inoltre, estende realmente la classe CLLocationDegrees e non richiede un parametro aggiuntivo.

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

}