Как я могу разделить координаты GPS в Objective C? - PullRequest
0 голосов
/ 24 января 2012

Мне нужно извлечь различные компоненты из строки координат GPS. Так, например:

+30° 18' 12" N  // pull out 30, 18 & 12

или

+10° 11' 1" E    // pull out 10, 11 & 1

или

-3° 1' 2" S    // pull out -3, 1 & 2

или

-7° 12' 2" W    // pull out -7, 12 & 2

Я посмотрел онлайн и заметил, что есть NSRegularExpression. Мне было интересно, можно ли это как-то использовать? Я также взглянул на предоставленную документацию, и я попытался собрать регулярное выражение для извлечения различных частей. Вот что я придумал:

('+'|'-')$n°\s$n'\s$n"\s(N|E|S|W)

Я не совсем уверен, правильно ли это или нет, мне также непонятно, как его использовать, так как вокруг не так много учебников / примеров. Пожалуйста, кто-нибудь может мне помочь? Если есть лучший способ сделать это, чем использовать NSRegularExpression, я открыт для этого, однако, насколько я знаю, цель c не имеет встроенной поддержки регулярных выражений.

Ответы [ 5 ]

4 голосов
/ 24 января 2012

RegExps - это перебор, ИМХО. Используйте [NSString componentsSeparatedByString:] с пробелом в качестве разделителя, чтобы разделить строку на части, затем [NSString intValue], чтобы дразнить числовое значение каждого компонента, кроме последнего.

2 голосов
/ 24 января 2012

Использование NSScanner:

NSScanner *scanner;
NSCharacterSet *numbersSet = [NSCharacterSet characterSetWithCharactersInString:@" °'"];
int degrees;
int minutes;
int seconds;

NSString *string = @" -7° 12' 2\" W";
scanner = [NSScanner scannerWithString:string];
[scanner setCharactersToBeSkipped:numbersSet];
[scanner scanInt:&degrees];
[scanner scanInt:&minutes];
[scanner scanInt:&seconds];
NSLog(@"degrees: %i, minutes: %i, seconds: %i", degrees, minutes, seconds);

Вывод NSLog:

degrees: -7, minutes: 12, seconds: 2
2 голосов
/ 24 января 2012

РЕ перебор (Сева)?Как насчет объектов?; -)

NSString *coords = @"+30° 18' 12\" N";

int deg, sec, min;
char dir;

if(sscanf([coords UTF8String], "%d° %d' %d\" %c", &deg, &min, &sec, &dir) != 4)
   NSLog(@"Bad format: %@\n", coords);
else
   NSLog(@"Parsed %d deg, %d min, %d sec, dir %c\n", deg, min, sec, dir);

Нравится ли вам это, зависит от вашего взгляда на падение в C, но оно прямое и простое.

0 голосов
/ 24 января 2012

Вам нужно: @"([+-]?[0-9]+)"

Вот пример кода:

NSString *string;
NSString *pattern;
NSRegularExpression *regex;
NSArray *matches;

pattern = @"([+-]?[0-9]+)";

regex = [NSRegularExpression
         regularExpressionWithPattern:pattern
         options:NSRegularExpressionCaseInsensitive
         error:nil];

string = @" -7° 12' 2\" W";
NSLog(@"%@", string);
matches = [regex matchesInString:string options:0 range:NSMakeRange(0, [string length])];
degrees = [[string substringWithRange:[[matches objectAtIndex:0] range]] intValue];
minutes = [[string substringWithRange:[[matches objectAtIndex:1] range]] intValue];
seconds = [[string substringWithRange:[[matches objectAtIndex:2] range]] intValue];
NSLog(@"degrees: %i, minutes: %i, seconds: %i", degrees, minutes, seconds);

Вывод NSLog:

градусов: -7, минут: 12, секунд: 2

0 голосов
/ 24 января 2012
NSMutableArray *newCoords = [[NSMutableArray alloc] init];
NSArray *t = [oldCoords componentsSeparatedByString: @" "];

[newCoords addObject: [[t objectAtIndex: 0] intValue];
[newCoords addObject: [[t objectAtIndex: 1] intValue];
[newCoords addObject: [[t objectAtIndex: 2] intValue];

Если у вас есть координаты, указанные в вашем сообщении в NSString oldCoords, это приведет к NSMutableArray, называемому newCoords, который будет содержать три фрагмента данных, которые вам нужны.

...