2011-08-26 2 views
0

Использование http://maps.google.com/maps/geo?q= .... возвращение широты и долготы, как те: 48.8616441,2.3448885iPhone - карта Google координаты и двойной точности

в обратной последовательности, как этот: 200,8,48.8616441,2.3448885

Когда анализируется в функцию, которая возвращает CLLocationCoordinate2D:

NSArray* listItems = [locationString componentsSeparatedByString:@","]; 

    CLLocationDegrees latitude = kInexistantLatitude; 
    CLLocationDegrees longitude = kInexistantLongitude; 

    if([listItems count] >= 4 && [[listItems objectAtIndex:0] isEqualToString:@"200"]) { 
     latitude = [[listItems objectAtIndex:2] doubleValue]; 
     longitude = [[listItems objectAtIndex:3] doubleValue]; 
    } 

    CLLocationCoordinate2D location; 
    location.latitude = latitude; 
    location.longitude = longitude; 

    return location; 

это дает в отладчик:

широта = 48,861644099999999 долгота = 2,3448885000000002

хранить много элементов, как это один в массив, и в конце концов, я разобрать массив записать их в Plist файл в качестве словаря пунктов (тегов) (я использую NSString appendFormat, что дает, как NSLog):

NSLog(@"%f %f", location.latitude, location.longitude); 

48.861644 2.344889 

в какой-то момент, я загрузить словарь, и я буду хранить этот материал для чтения в CLLocationCoordinate2D, чтобы отобразить его на MKMapView.

Поэтому у меня есть 2 проблемы:

1) Как я могу сохранить возвращаемое значение, заданное с помощью запроса HTTP без потери цифры, и сохраняя свою функцию?

2) Если я могу это сделать, как я могу прочитать материал и сохранить его в CLLocationCoordinate2D, не потеряв снова цифру?

ответ

2

Вы не теряете цифру точности. При использовании

NSLog(@"%f %f", location.latitude, location.longitude); 

Если вы не указываете точность, %f автоматически обрезает свой номер до 6 знаков после запятой, как в соответствии со стандартом ANSI C.

Попробуйте

NSLog(@"%.8f %.8f", location.latitude, location.longitude); 

Это должно возвращать тот же номер, возвращенной строки.

+0

Когда у меня есть точность 15 цифр, поплавок определенно теряет свою точность. –

+0

я буду иметь максимум 8 цифр точность. Этот метод al чтобы сохранить фиксированное число десятичных знаков. В случае, если у меня точность на 15 цифр, и я указал% 8, он в конечном итоге сократит последние 7 цифр. –

2

Если у вас возникла проблема с точностью примитива double.

При вычислении точно точного числа с плавающей запятой не существует (вы не можете иметь бесконечную точность в пределах определенного количества байтов), но обычно имеет вид точности (как вы видели с выход отладчика). Вы, как правило, не должны беспокоиться об этом, поскольку потеря в точности незначительна.

Об этом можно узнать в Wikipedia entry.

Однако, если вы NSLog или appendFormat:, вы можете указать точное количество цифр, которые вы хотите распечатать. В этом случае, если вы хотите 7 цифр, вы напишете:

NSLog(@"%.7f %.7f", location.latitude, location.longitude); 
-1

Та же проблема у меня была. Состояние, которое у меня было, я получу долго от JSON и, щелкнув по карте, мне придется отправить lat на сервер.Сервер ответил сообщением «неправильное местоположение». Назначение cllocation координировало ограничение точности. Я решил его, имея длинные данные lat от JSON как NSString. Создать класс объекта для хранения NSString эквивалент вашей широты и долго. "Не хранить лат долго, полученный из JSON в cllocationcoordinate, вы, возможно, придется потерять точность.

NSString * lattodeletetest; 
NSString * longtodeletetest; 
lattodeletetest=[dict objectForKey:@"Lat"]; 
longtodeletetest=[dict objectForKey:@"Lon"]; 
NSArray *array2=[[NSArray alloc] initWithObjects:lattodeletetest,longtodeletetest, nil]; 
NSString * coordinateString2=[array2 componentsJoinedByString:@","]; 
safe.strLatLong=coordinateString2; 
NSLog(@"%@",safe.strLatLong); //prints 12.758493847753464,71.488293492438438 

По этому пути можно сохранить латы и долго получаются из JSON без правок.

Чтобы использовать его в качестве CLLOcationCoordinate2d, используйте

NSString *str=strLatLong; 
NSArray *array=[str componentsSeparatedByString:@","]; 
lattodeletetest=[array objectAtIndex:0]; 
longtodeletetest=[array objectAtIndex:1]; 
CLLocationCoordinate2D location=CLLocationCoordinate2DMake([lattodeletetest doubleValue],[longtodeletetest doubleValue]); 
+1

Если этот вопрос является точным дубликатом того, с которым вы связались (как и тот же ответ, как и тот, и другой), то, пожалуйста, отметьте его как дубликат, вместо того чтобы оставить ответ на этот вопрос. Если этот вопрос не является дубликатом, пожалуйста, оставьте полный ответ вместо ответа только на ссылку. – josliber

+0

Да! Добавляем ответ! –

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