繁体   English   中英

在Objective-C中实现简单的地理围栏

[英]implementing a simple geofence in objective-C

我试图实现一些简单的地理围栏算法,基本上做到以下几点:

  1. 假设我有两个点A和B(每个点在地球上有一个纬度和经度值)。
  2. 我可以画一条从A点到B点的直线
  3. 我可以围绕该线设置一个周长,这是一个矩形(为了更清晰,请参见下图)

在此输入图像描述

我想要做的是如下,如果手机当前位置在这个红色外围之外,那么它会触发一些东西,基本上是代表。 周长尺寸应该能够调整到百分比大小,因此5%将是围绕线的小周长,70%将是围绕线的大周长。 请注意,周长应为矩形,而不是半径为圆的。 我猜测会有一堆if语句参与构建这个...如果有人能想出一个简单而优雅的解决方案(如果我能看到Objective-C中的代码那会很棒)会很棒。 或者任何指导也会有所帮助

您需要在主AB线上找到距离用户位置最近的点。 请查看以下链接以获取更多信息...... 点线

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

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

至于纬度和经度到平面x,y坐标的转换,最简单的解决方案是使用Map Kit使用墨卡托投影。 有关详细信息,请查看了解地图几何

这是一个例子:

// 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米),您也可以进行计算,就好像当前位置是精确的一样,但误差概率会更高(例如,有时您会被检测到在矩形中,而您将站在外面它)。

或者你可能想要寻求“完美”的解决方案,并进行圆形 - 矩形交叉,这更复杂,不仅可能导致YES和NO答案,而且“在这种精度下无法确定你是在内部还是外部的矩形“。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM