我想实现以下目标,我不知道是否可能。我在路上有两个点(想象就像一条终点线 - 它们是人行道的两个边缘 - 它们是直线的)我想检查用户的路线是否已经在这些点之间传递。
所以我想,我可以这样做:
如果它是纯粹的几何形状,那将很容易。我有两条线,我想知道它们之间是否有任何交叉。
我想在IOS项目中使用以下内容,如果它有所不同。例如,我认为可能有编程方式绘制MKPolylines并查看是否存在交集。我不想在视觉上看到它,我只是需要它以编程方式。
有可能吗?你能建议我什么吗?
答案 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;
}