- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试实现一些简单的地理围栏算法,该算法基本上执行以下操作:
- Say I have two point A and B (each point has a latitude and longitude value in earth).
- I can draw a straight line from point A to point B
- I can set a perimeter, which is a rectangle, around that line (see drawing below for more clarity)
我想要做的如下,如果手机当前位置在这个红色范围之外,那么它会触发一些东西,基本上是一个委托(delegate)。周长大小应该能够调整为百分比大小,因此 5% 是线周围的小周长,70% 是线周围的大周长。请注意,周长应该是矩形,而不是半径为圆的圆。我猜在构建这个过程中会涉及到一堆 if 语句......如果有人能想出一个简单而优雅的解决方案(如果我能在 objective-C 中看到代码会很棒)那会很棒.或者任何指导也会有帮助
最佳答案
您可以从矩形的四个点创建一条路径,然后使用 CGPathContainsPoint
检查当前位置是否在路径内。
关于经纬度到平面x,y坐标的转换,最简单的方案是使用Map Kit使用墨卡托投影。检查Understanding Map Geometry了解更多信息。
这是一个例子:
// 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 米),您也可以像当前位置一样进行计算,但误报概率会更高(例如,有时您会被检测到在矩形中,而您站在外面的)。
或者您可能想要寻求“完美”的解决方案并进行圆-矩形相交,这更复杂并且可能不仅会导致"is"和“否”的答案,而且还会“以这种准确性无法确定您是否矩形的内部或外部”。
关于iphone - 在 Objective-C 中实现一个简单的地理围栏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5510106/
我是一名优秀的程序员,十分优秀!