Неверное расстояние между двумя широтами

Я хочу получить расстояние между двумя точками. Я получаю широту и долготу двух мест, используя код ниже

-(void)getLatLongOfLoac:(NSString *)locStr{
    locStr = [locStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    NSString *geocodeUrl = [NSString stringWithFormat:@"%@://maps.google.com/maps/api/geocode/json?address=%@&sensor=false", 1 ? @"http" : @"https", locStr];

    ASIFormDataRequest *request   =  [ASIFormDataRequest requestWithURL:[NSURL URLWithString:geocodeUrl]];
    [request setRequestMethod:@"GET"];
    [request setDidFinishSelector:@selector(requestDone:)];
    [request setDidFailSelector:@selector(requestWentWrong:)];
    [request setDelegate:self];
    [request startAsynchronous];

}

-(void)requestDone:(ASIHTTPRequest *)request{
    NSString *responseString = [request responseString];
    SBJsonParser *json          = [[SBJsonParser alloc] init];
    NSError *jsonError          = nil;
    NSDictionary *parsedJSON    = [json objectWithString:responseString error:&jsonError];

   if(self.locationTableView.tag == 0){
      self.latlongForPicUp = [[[[parsedJSON valueForKey:@"results"] objectAtIndex:0] valueForKey:@"geometry"] valueForKey:@"location"];
   }
   else{
       self.latlongForDropOff = [[[[parsedJSON valueForKey:@"results"] objectAtIndex:0] valueForKey:@"geometry"] valueForKey:@"location"];
   }

}

и чтобы получить расстояние между двумя местоположениями, я использую код ниже

CLLocation *locA = [[CLLocation alloc] initWithLatitude:[[self.latlongForDropOff valueForKey:@"lat"] floatValue]longitude:[[self.latlongForDropOff valueForKey:@"lng"] floatValue]];

CLLocation *locB = [[CLLocation alloc] initWithLatitude:[[self.latlongForPicUp valueForKey:@"lat"] floatValue] longitude:[[self.latlongForPicUp valueForKey:@"lng"]floatValue ]];

   // CLLocationDistance distance = [locA distanceFromLocation:locB];
//float distInMile = 0.000621371192 * [locA distanceFromLocation:locB];
NSString *distance = [ NSString stringWithFormat:@"%f",[locA distanceFromLocation:locB]];

Это дает мне очень большое значение, например 8749107,212873, и после преобразования в милю даже получается несколько тысяч, но два местоположения находятся всего в 20 км.

Есть ли проблема в коде?


person 287986    schedule 12.11.2013    source источник
comment
Вы заметили, что устанавливаете [[self.latlongForPicUp valueForKey:@lng] floatValue] для широты и [[self.latlongForPicUp valueForKey:@lat]floatValue ]];? Разве не будет [[self.latlongForPicUp valueForKey:@lat] floatValue] для широты и [[self.latlongForPicUp valueForKey:@lng] floatValue] для долготы?   -  person scollaco    schedule 12.11.2013
comment
даже это дает неправильный результат   -  person 287986    schedule 12.11.2013
comment
для широты и долготы я всегда использую double вместо float, потому что это более точно. На мой взгляд, надо попробовать и посмотреть, что получится.   -  person scollaco    schedule 12.11.2013
comment
NSЗарегистрируйте координаты locA и locB, чтобы убедиться, что они именно такие, как вы думаете.   -  person    schedule 12.11.2013
comment
@scolaco Вы абсолютно правы. Спасибо. Пожалуйста, опубликуйте свой ответ, я хотел бы отметить его как правильный ответ. Но есть некоторая проблема, в первый раз он дает правильный результат, но когда я снова использовал то же местоположение, то с помощью Double он снова дает неправильные значения.   -  person 287986    schedule 12.11.2013
comment
Как сказала Анна Каренина, вы должны использовать NSLog, чтобы увидеть, что вы на самом деле получаете. :)   -  person scollaco    schedule 12.11.2013


Ответы (2)


Вы заметили, что настраиваете

[[self.latlongForPicUp valueForKey:@"lng"] floatValue] for latitude and [[self.latlongForPicUp valueForKey:@"lat"]floatValue ]];? 

не было бы

[[self.latlongForPicUp valueForKey:@"lat"] floatValue] for latitude and [[self.latlongForPicUp valueForKey:@"lng"] floatValue] for longitude?

А для широты и долготы я предлагаю использовать double вместо float, потому что это более точно. На мой взгляд, надо попробовать и посмотреть, что получится.

person scollaco    schedule 12.11.2013

Вы неправильно устанавливаете широту и долготу при создании второго CCLocation:

Ты делаешь:

CLLocation *locB = [[CLLocation alloc] initWithLatitude:[[self.latlongForPicUp valueForKey:@"lng"] floatValue] longitude:[[self.latlongForPicUp valueForKey:@"lat"]floatValue ]];

Ты должен сделать:

CLLocation *locB = [[CLLocation alloc] initWithLatitude:[[self.latlongForPicUp valueForKey:@"lat"] floatValue] longitude:[[self.latlongForPicUp valueForKey:@"lng"]floatValue ]];

Вы меняете значения.

person Antonio MG    schedule 12.11.2013
comment
@ 287986, для широты и долготы я всегда использую double вместо float, потому что это более точно. На мой взгляд, надо попробовать и посмотреть, что получится. - person scollaco; 12.11.2013
comment
проверьте правильность широты и долготы, распечатайте значения locA и locB и посмотрите их на карте - person Antonio MG; 13.11.2013