如何查找两个谷歌地图路线是否在IOS项目中相交

时间:2013-08-19 13:13:25

标签: ios google-maps

我想实现以下目标,我不知道是否可能。我在路上有两个点(想象就像一条终点线 - 它们是人行道的两个边缘 - 它们是直线的)我想检查用户的路线是否已经在这些点之间传递。

所以我想,我可以这样做:

  1. 获得这两点之间的路线(它们非常靠近 - 道路最宽20米)
  2. 获取用户路线
  3. 检查这些路线是否相互影响,如果它们之间有任何交叉。
  4. 如果它是纯粹的几何形状,那将很容易。我有两条线,我想知道它们之间是否有任何交叉。

    我想在IOS项目中使用以下内容,如果它有所不同。例如,我认为可能有编程方式绘制MKPolylines并查看是否存在交集。我不想在视觉上看到它,我只是需要它以编程方式。

    有可能吗?你能建议我什么吗?

2 个答案:

答案 0 :(得分:3)

没有直接的方法来检查那个交叉点。

您可以通过将纬度/经度位置转换为地图位置(将变换应用于标准化网格)来将问题转化为几何问题。这可以使用MKMapPointForCoordinate完成。

需要考虑的一件事是GPS报告位置的不准确性。在许多情况下,您会发现GPS报告的轨道实际上并不在路上,而是在道路旁边运行。特别是在转弯(紧)角时,通常会在赛道上形成一条大曲线。因此,您可能希望扩展“终点线”的宽度以补偿这一点。


如果您只关心用户是否在设定点的某个距离内,那么您可以创建CLRegion来表示目标位置,然后使用当前用户位置调用containsCoordinate:。这将删除任何投影并直接使用lat / long。您还可以让系统为您监控此情况,并在用户使用startMonitoringForRegion:desiredAccuracy:进入或退出该区域时给您回电。同样,在设置半径时需要考虑GPS精度。

答案 1 :(得分:2)

我会尝试分三步解决这个问题:

步骤1.将每个坐标用户的轨道转换为CGPoint并将其保存为数组。

// in viewDidLoad
locManager = [[CLLocationManager alloc] init];
[locManager setDelegate:self];
[locManager setDesiredAccuracy:kCLLocationAccuracyBest];
[locManager startPdatingLocation];
self.userCoordinatePoints = [NSMutableArray alloc]init];

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation  {

   CLLocationCoordinate2D loc = [newLocation coordinate];
   CGPoint *currentPoint = [self.mapView convertCoordinate:loc toPointToView:self.mapView]; 
  // add points to array
   self.userCoordinatePoints addObject:currentpoint];
}

步骤2.将MKPolylineView转换为CGPathRef
  创建类型为CGPathRef

的类变量
{
  CGPathRef path;
}

您必须实施此方法才能在两点之间创建路线:

- (MKOverlayView*)mapView:(MKMapView*)theMapView
           viewForOverlay:(id <MKOverlay>)overlay
{
  MKPolylineView *overlayView = [[MKPolylineView alloc]
                                 initWithOverlay:overlay];
  overlayView.lineWidth = 3;
  overlayView.strokeColor = [[UIColor blueColor]colorWithAlphaComponent:0.5f];
  // overlayView.fillColor = [[UIColor purpleColor] colorWithAlphaComponent:0.1f];
  path = overlayView.path;
  return overlayView;
}

步骤3:创建自定义方法以检查点是否位于CGPath

- (BOOL)userRouteIntersectsGoogleRoute
{
 // Loop through all CGPoints 
  for(CGPoint point in self.userCoordinatePoints)
{
  BOOL val = CGPathContainsPoint(path, NULL, point);
  if(val)
  {
    return YES;
  }
}
return NO;
}