7

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

所以我想,我可以做这样的事情:

  1. 获取这两点之间的路线(它们非常接近 - 道路最多 20 m 宽)
  2. 获取用户路线
  3. 检查这些路线是否相交,它们之间是否有交叉。

如果是纯几何,那就容易了。我有两条线,我想知道它们之间是否有任何交集。

如果有任何区别,我想在 IOS 项目中使用以下内容。例如,我认为也许有一种以编程方式绘制 MKPolylines 并查看是否存在交集的方法。我不想在视觉上看到它,我只需要以编程方式。

可能吗?你能建议我别的吗?

4

2 回答 2

3

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

您可以通过将纬度/经度位置转换为地图位置(应用变换以展平到归一化网格上)将问题转化为几何问题。这可以通过MKMapPointForCoordinate.

需要考虑的一件事是 GPS 报告的位置不准确。在许多情况下,您会发现 GPS 报告的轨迹实际上并不是在路上,而是在路边运行。特别是在转弯(急转弯)时,您通常会在赛道上遇到大弯道。因此,您可能希望延长“终点线”的宽度以弥补这一点。


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

于 2013-08-22T20:38:18.960 回答
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. 转换MKPolylineViewCGPathRef
创建类型的类变量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;
}
于 2013-08-28T07:14:22.800 回答