在Google Maps SDK中查找要路由的位置距离

时间:2016-09-14 15:44:59

标签: ios swift google-maps-sdk-ios

我正在开发一款iPhone应用程序,在这种情况下我需要一些帮助:

我需要检查,如果用户离开谷歌地图路线(GMSPolyline),如果距用户位置到最近路线的距离超过40米 - 我需要重建路线。

我找不到合适的算法来检测用户到路线的距离是否超过40米。

我尝试使用此方法在路线上查找用户位置的投影(通过CGPointMake转换为CGPoint):

+ (CGPoint)projectionOfPoint:(CGPoint)origPoint toSegmentP1:(CGPoint)p1 p2:(CGPoint)p2 {
// for case line is parallel to x axis
if (p2.y == p1.y) {
    return CGPointMake(origPoint.x, p1.y);

// for case line is parallel to y axis
} else if (p2.x == p1.x) {
    return CGPointMake(p1.x, origPoint.y);
}

// line from segment
CGFloat kKoefLine1 = (p2.x - p1.x)/(p2.y - p1.y);
CGFloat bKoefLine1 = p1.y - kKoefLine1*p1.x;

// perpendicular line
CGFloat kKoefLine2 = -1/kKoefLine1;
CGFloat bKoefLine2 = origPoint.y - kKoefLine2*origPoint.x;

// cross point
CGFloat krossX     = (bKoefLine2 - bKoefLine1)/(kKoefLine1 - kKoefLine2);
CGFloat krossY     = kKoefLine2*krossX + bKoefLine2;

return CGPointMake(krossX, krossY);}

然后我计算返回投影(转换为CLLocation)和用户位置的距离,但它不起作用。

P.S。:如果解决方案可以写在swift上,我将感激不尽。

3 个答案:

答案 0 :(得分:2)

对于Swift 5.0,基于@Arthur的答案,我编写了以下功能

func isInRoute(posLL: CLLocationCoordinate2D, path: GMSPath) -> Bool
{

    let geodesic = true
    let tolerance: CLLocationDistance = 40

    let within40Meters = GMSGeometryIsLocationOnPathTolerance(posLL, path, geodesic, tolerance)
    return within40Meters

}

答案 1 :(得分:1)

Google Maps SDK中的GMSGeometryUtils模块中有GMSGeometryIsLocationOnPath个功能。

你应该可以用它来计算你需要的东西。

伪代码(未测试):

let currentLocation: CLLocationCoordinate2D = ...
let routePath: GMSPath = routePolyline.path
let geodesic = true
let tolerance: CLLocationDistance = 40

let within40Meters = GMSGeometryIsLocationOnPath(currentLocation, routePath, geodesic, tolerance)

答案 2 :(得分:-1)

虽然我没有回忆起很多关于GMS SDK的问题,但在我给你答案之前,我会说没有人会为你编写代码。这是你的工作,应该按时完成。你还没有给出任何关于你在计算路线方面取得多大进展的背景知识,无论你是否已经弄清楚如何计算距离等等。

话虽如此,谷歌地图上的路线由" leg"组成,它表示在努力到达终点目的地之前需要走的路径。通过查询你的"路线"在字典中,您可以提取一个字典数组,其中每个元素(字典)都包含有关" leg"的元数据。然后,您可以遍历该数组,浏览每个字典并提取"距离"价值,并将它们加到一个单一的距离"变种。

您可以根据需要经常重新计算,并使用条件检查腿距离总和是否为< 40M,否则重建。

链接到应该有用的文章(我没有时间为您完成整个事情,所以尽职调查和研究)here