iOS中两个位置之间的估计时间[关闭]
Posted
技术标签:
【中文标题】iOS中两个位置之间的估计时间[关闭]【英文标题】:Estimated Time Between two Locations in iOS [closed] 【发布时间】:2016-06-08 03:32:33 【问题描述】:从 AnyLocation 到 MyCurrentLocation 获取 ETA(预计到达时间)的正确方法是什么?
我想,当点击任何注释时,我必须根据该注释和用户的当前位置在页脚上设置详细信息。
请看下图更好地理解。
我看到了这个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 但是他们并没有用这个解决我的问题。使用这个我总是得到空响应。我把我的代码放在下面:-
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?。但是现在,我不想使用Google Maps Directions API。因为我的客户不想使用它。如果 Google API 是免费的,那我当然更喜欢它。
另外,我尝试了distanceFromLocation
方法。但是,我认为,这个解决方案假设两点之间的距离是直线,这几乎没有用处。
有没有其他解决方案可以做到这一点..??
任何帮助将不胜感激。
【问题讨论】:
您是否假设您的用户启用了noclip
作弊码?如果是这样,那么计算只是位置之间的直线距离,除以它们的平均步行距离。否则,您需要地图数据。
@JonathonReinhart,哈哈。你能告诉我如何启用该作弊吗?这可能非常有用。
这个问题太宽泛了。您发布了几个链接并说“但他们并没有解决我的问题。” (原文如此)。他们是如何未能满足您的需求的,特别是?
@Duncan :我多次尝试了这个答案,但总是得到空值。我提到了这些链接,因为我想展示我之前尝试过的内容。否则,您说过,这个问题与这些问题重复。
请阅读文档developers.google.com/maps/documentation/distance-matrix/intro
【参考方案1】:
试试这个方法。在这里你必须传递源和目的地的经纬度信息。
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.");
【讨论】:
听起来不错!谢谢@kb920。但我不知道,Google Maps Directions APIs 如何在没有密钥的情况下给出响应。它完全免费..? @MeetDoshi google 提供一些免费的请求(我认为每天 2000 个请求)之后会出错 @chiragshah:它的 1000 个请求。但是我们必须为这 1000 个免费请求生成一个密钥。否则谷歌不会计算我们的请求数。但我仍然不知道没有钥匙它是如何工作的。它对我来说很棒,如果它没有钥匙也能工作。 @MeetDoshi 我认为您不需要密钥。我长期使用免费网址 @MeetDoshi 对于这个 API,我们不需要任何密钥。所以我们可以不受限制地使用它!【参考方案2】:如果您想计算点之间的行程时间,您首先需要指定您需要驾车或步行路线,然后生成路线。路线请求的结果将包括行程时间估算。
您需要使用 MapKit、MKDirectionsRequest
和 MKDirections
等类。您还需要配置您的应用程序以请求 Apple 允许生成行车路线。我在网上找到了this 链接,该链接解释了如何计算行车路线。
【讨论】:
我没想到你。感谢@DuncanC 的努力。我很感激。【参考方案3】:您可以为此使用 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
【讨论】:
返回到分钟..??那么开车、骑自行车和公交呢? 它以秒为单位返回,对于汽车来说,浮动时间 = 距离 / 43.50;如果(时间 我想,我们得到的时间是小时而不是秒。 此解决方案假定两点之间的直线距离,这几乎没有用处。以上是关于iOS中两个位置之间的估计时间[关闭]的主要内容,如果未能解决你的问题,请参考以下文章
iOS CoreLocation:找到位置后将其关闭或让它运行