我需要检查,如果用户离开谷歌地图路线(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上,我将感激不尽。
答案 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。