2016-02-25 5 views
-1

Что такое правильный способ получить ETA (расчетное время прибытия) из AnyLocation в MyCurrentLocation?Расчетное время между двумя местоположениями в iOS

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

Пожалуйста, см. Ниже изображение для лучшего понимания.

enter image description here

Я видел этот What is proper way to get ETA (estimated time arrival) from any location to my current location и это calculate time taken to cover a journey in Apple Maps Но они не решить мою проблему с помощью этого. Я получаю всегда Null ответ, используя это. Я положил мой код ниже: -

double latitude = -0.075410; 
double longitude = 51.512520; 
MKPlacemark *placemark = [[MKPlacemark alloc] initWithCoordinate:CLLocationCoordinate2DMake(latitude, longitude) addressDictionary:nil] ; 
MKMapItem *mapItemSource = [[MKMapItem alloc] initWithPlacemark:placemark]; 

double latitude1 = -0.132128; 
double longitude1 = 51.464138; 
MKPlacemark *placemark1 = [[MKPlacemark alloc] initWithCoordinate:CLLocationCoordinate2DMake(latitude1, longitude1) addressDictionary:nil] ; 
MKMapItem *mapItemDestination = [[MKMapItem alloc] initWithPlacemark:placemark1]; 

MKDirectionsRequest *directionsRequest = [[MKDirectionsRequest alloc] init]; 
[directionsRequest setSource:mapItemSource]; 
[directionsRequest setDestination:mapItemDestination]; 
directionsRequest.transportType = MKDirectionsTransportTypeAutomobile; 
MKDirections *directions = [[MKDirections alloc] initWithRequest:directionsRequest]; 

[directions calculateETAWithCompletionHandler:^(MKETAResponse *response, NSError *error) { 
    if (error) { 
     NSLog(@"Error %@", error.description); 
    } else { 
     NSLog(@"expectedTravelTime %f", response.expectedTravelTime); 
    } 
}]; 
//I am not sure why I am getting Null response into calculateETAWithCompletionHandler this method.. 

//Also tried following...... 
[directions calculateDirectionsWithCompletionHandler:^(MKDirectionsResponse *response, NSError *error) { 
    if (error) { 
     NSLog(@"Error %@", error.description); 
    } else { 
     MKRoute * routeDetails = response.routes.lastObject; 
     //[self.mapView addOverlay:routeDetails.polyline]; 
     NSLog(@"Street %@",[placemark.addressDictionary objectForKey:@"Street"]); 
     NSLog(@"distance %@",[NSString stringWithFormat:@"%0.1f Miles", routeDetails.distance/1609.344]); 
     NSLog(@"expectedTravelTime %@",[NSString stringWithFormat:@"%0.1f minutes",routeDetails.expectedTravelTime/60]); 
    } 
}]; 
//I am not sure why I am getting Null response into calculateDirectionsWithCompletionHandler this method.. 

Кроме того, я видел эту Is there any way to determine the driving time between two locations using Apple's Maps API? и это How to calculate time required to complete the path in between two locations?. Но RightNow, я не хочу использовать Google Maps Directions API. Потому что мой клиент не хочет этого использовать. Если API Google бесплатно, то определенно я предпочел это.

Кроме того, я пробовал метод distanceFromLocation. Но, я думаю, это решение предполагает прямолинейное расстояние между двумя точками, что почти никогда не бывает полезным.

Есть ли другие решения для этого .. ??

Любая помощь будет оценена по достоинству.

+1

Вы предполагаете, что ваш пользователь включил чит-код 'noclip'? Если это так, то вычисление - это просто прямое расстояние между местоположениями, разделенное на их среднее расстояние ходьбы. В противном случае вам нужны данные карты. –

+1

@JonathonReinhart, LOL. Можете ли вы показать мне, как включить этот обман? Это может быть очень полезно. –

+0

Этот вопрос слишком широк. Вы опубликовали несколько ссылок и сказали: «Но они не решили мою проблему, используя это». (Так в оригинале). Как они не смогли удовлетворить ваши потребности **, конкретно **? –

ответ

11

Попробуйте этот метод. Здесь вам необходимо передать информацию о широте и долготе источника и назначения.

NSString *strUrl = [NSString stringWithFormat:@"http://maps.googleapis.com/maps/api/directions/json?origin=%f,%f&destination=%f,%f&sensor=false&mode=%@", lat, longi, userLat, userLong, @"DRIVING"]; 
NSURL *url = [NSURL URLWithString:[strUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; 
NSData *jsonData = [NSData dataWithContentsOfURL:url]; 
if(jsonData != nil) 
{ 
    NSError *error = nil; 
    id result = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&error]; 
    NSMutableArray *arrDistance=[result objectForKey:@"routes"]; 
    if ([arrDistance count]==0) { 
     NSLog(@"N.A."); 
    } 
    else{ 
     NSMutableArray *arrLeg=[[arrDistance objectAtIndex:0]objectForKey:@"legs"]; 
     NSMutableDictionary *dictleg=[arrLeg objectAtIndex:0]; 
     NSLog(@"%@",[NSString stringWithFormat:@"Estimated Time %@",[[dictleg objectForKey:@"duration"] objectForKey:@"text"]]); 
    } 
} 
else{ 
    NSLog(@"N.A."); 
} 
+0

Звучит неплохо! спасибо @ kb920. Но я не знаю, как API-интерфейсы Google Maps Directions дают ответ без ключа. Это совершенно бесплатно ..? –

+0

@MeetDoshi google предоставляет некоторую сумму запроса бесплатно (я думаю, 2000 запрос в день), после чего дает ошибку –

+0

@chiragshah: его 1000 запросов. Но мы должны создать ключ для этих 1000 бесплатных запросов. В противном случае Google не рассчитывает количество запросов. Но я до сих пор не знаю, как это работает без ключа. Это здорово для меня, если оно работает без ключа. –

1

вы можете использовать Google API для этого и еще одну вещь по умолчанию есть метод

locA = [[CLLocation alloc] initWithLatitude:[[latsArray objectAtIndex:0] floatValue] longitude:[[longArray objectAtIndex:0] floatValue]]; 
locB = [[CLLocation alloc] initWithLatitude:[[latsArray objectAtIndex:1] floatValue] longitude:[[longArray objectAtIndex:1] floatValue]]; 

distance = [locA distanceFromLocation:locB] * 0.000621371; 

и время для прогулки

float time = distance/3.1; //divide by 3.1 for by walk 
+0

Он возвращается в минуты .. ?? А как насчет вождения, езды на велосипеде и транзита. –

+1

он возвращается в секундах и для автомобилей float time = distance/43.50; if (время <= 1) { время = время * 60; self.timeLabel.text = [NSString stringWithFormat: @ "%. 2f minutes", time]; } else { self.timeLabel.text = [NSString stringWithFormat: @ "%. 2f hours", time]; } – Garry

+0

Думаю, у нас есть время в часы не в секундах. –

2

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

Вам необходимо использовать MapKit, MKDirectionsRequest и MKDirections классы, среди прочих. Вам также потребуется настроить приложение, чтобы попросить Apple получить разрешение на проезд. Я нашел this ссылку онлайн, которая объясняет, как рассчитать маршруты проезда.

+0

Я не ожидал от вас. Спасибо @ DuncanC за ваши усилия. Я оценил. –