Iphone 在objective-C中实现一个简单的地理围栏

Iphone 在objective-C中实现一个简单的地理围栏,iphone,objective-c,algorithm,geolocation,Iphone,Objective C,Algorithm,Geolocation,我试图实现一种简单的地理围栏算法,基本上实现以下功能: 假设我有两个点A和B(每个点都有纬度和经度) 地球上的价值) 我可以从a点到B点画一条直线 我可以围绕这条线设置一个周长,它是一个矩形(参见图纸) (请参见下文以了解更多信息) 我想做的是,如果手机当前位置在这个红色边界之外,那么它会触发一些东西,基本上是一个代理。周长大小应能够调整为百分比大小,因此5%是线路周围的小周长,70%是线路周围的大周长。请注意,周长应为矩形,而不是带半径的圆。我猜在构建这个过程中会有很多if语句。。。如果有人

我试图实现一种简单的地理围栏算法,基本上实现以下功能:

  • 假设我有两个点A和B(每个点都有纬度和经度) 地球上的价值)
  • 我可以从a点到B点画一条直线
  • 我可以围绕这条线设置一个周长,它是一个矩形(参见图纸) (请参见下文以了解更多信息)

  • 我想做的是,如果手机当前位置在这个红色边界之外,那么它会触发一些东西,基本上是一个代理。周长大小应能够调整为百分比大小,因此5%是线路周围的小周长,70%是线路周围的大周长。请注意,周长应为矩形,而不是带半径的圆。我猜在构建这个过程中会有很多if语句。。。如果有人能想出一个简单而优雅的解决方案(如果我能看到objective-C中的代码,那将是非常棒的)。或者任何指导也会很有帮助

    您需要在主A-B线上找到离用户位置最近的点。查看以下链接了解更多信息


    现在,假设您可以从用户点(当前位置)找到直线上最近的点,您可以检查他们的位置与最近点之间的距离是否在您感兴趣的阈值内,如果超过该值,则它们位于直线周围区域的“外部”。

    您可以从矩形的四个点创建路径,然后使用
    CGPathContainsPoint
    检查当前位置是否在路径内部

    至于将纬度和经度转换为平面x、y坐标,最简单的解决方案是使用地图套件使用墨卡托投影。查看更多信息

    下面是一个例子:

    // create four rectangle points from A, B
    dx = (B.x - A.x) * 0.05; // 5% of the A-B length
    dy = (B.y - A.y) * 0.05;
    
    // topmost corner, above B
    points[0].x = B.x + dx - dy;
    points[0].y = B.y + dy + dx;
    
    //rightmost corner, to the right from B
    points[1].x = B.x + dx + dy;
    points[1].y = B.y + dy - dx;
    
    ...
    
    
    CGMutablePathRef path = CGPathCreateMutable(); 
    
    CGPathMoveToPoint(path, NULL, points[0].x, points[0].y);
    CGPathAddLineToPoint(path, NULL, points[1].x, points[1].y);
    CGPathAddLineToPoint(path, NULL, points[2].x, points[2].y);
    CGPathAddLineToPoint(path, NULL, points[3].x, points[3].y);
    
    CGPathCloseSubpath(path);
    
    // convert latitude, longitude to planar coordinates
    MKMapPoint location = MKMapPointForCoordinate([newLocation coordinate]);
    
    BOOL inside = CGPathContainsPoint(path, NULL, CGPointMake(location.x, location.y), YES);
    
    CGPathRelease(path);
    
    注意:此代码期望当前位置是一个点,而实际上,它是一个点和一个精度半径,实际上是一个圆。这使事情有点复杂,因为现在你需要定义如何处理当前位置未知的情况,但你只知道它在圆圈中的某个地方。如果矩形很大(比如5公里),那么您可能只需要精度小于50米的半径,就像当前位置是精确的一样进行计算,忽略计算的小误差。如果矩形较小(例如50米),您也可以将当前位置视为精确位置进行计算,但误报概率会更高(例如,有时您站在矩形之外时会被检测到)


    或者,您可能希望采用“完美”解决方案,并进行圆-矩形相交,这更为复杂,不仅可能导致回答是或否,还可能导致“由于这种精度,无法确定您是否在矩形内部或外部”。

    您这样做是否简单?i、 把纬度和经度当作x,y坐标?或者你做得正确吗,也就是说,将lat和long坐标转换为三维坐标,并计算直线的大圆?我猜将其转换为三维坐标会更好,对吗?因此,如果这可以整合到这个想法中,那么我希望看到是的,这会更好,但我怀疑几何会非常困难。有趣的是,我在高中时就学会了这个公式。。。很多数学和计算涉及其中,但我会考虑它无论如何你有没有看这个链接?这将为您提供与直线相切的点,然后使用以下公式获得距离。。。。数学很简单(奇怪!):)无论如何,要将我得到的半径整合到这个计算中?iphone如何使用显著的位置变化返回半径范围?这只是一个随机变量吗?这假设直线是水平的。。。。这将不会按照您原来的帖子工作。。。。加上原来的帖子提到了纬度和经度,这也被忽略了……这对于这个问题来说太复杂了,如果线的方向不正确,就不起作用。我的解决方案是从您的位置找到最短点并计算阈值距离,它更简单、更精确(因为它具有旋转弹性)。@Simon此解决方案不假设直线是水平的,它可以完美地用于任何直线方向。