实施在Objective-C一个简单的地理围栏

问题描述:

我想有些简单的地理围栏算法基本上执行以下操作的实现:实施在Objective-C一个简单的地理围栏

  1. 说我有两个点A和B(每个点都有一个纬度和地球上的经度 )。
  2. 我可以得出从点A的直线的点B
  3. 我可以设置周界,这是一个矩形,它围绕着管线(参阅图纸下面 为了更清楚)

enter image description here

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

+0

你在做这个简单吗?即将经纬度视为x,y坐标?或者你是否正确地做了这件事,即将纬度和长度转换为三维坐标并计算直线的大圆? – JeremyP 2011-04-01 10:00:31

+0

我猜测把它转换成3D坐标会让它更好吗?因此,如果有可能将其整合到这个想法,那么我想看看 – aherlambang 2011-04-01 14:23:56

+0

是的,它会更好,但我怀疑几何图形会非常困难。 – JeremyP 2011-04-01 15:49:03

您可以从矩形的四个点创建路径,然后使用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米),那么您也可以按照当前位置精确的方式进行计算,但是假阳性概率会更高(例如,有时会在矩形中检测到,而您会站在外面)。

或者您可能想要寻找“完美”的解决方案,并做圆形矩形交点,这是更复杂的,可能会导致不仅在YES和NO的答案,而且“在这个准确性,它不能确定你是否你在矩形的内部或外部“。

+0

无论如何整合我得到的半径以及这个计算? – aherlambang 2011-04-01 14:30:07

+0

iphone如何使用significantLocationChanges返回半径范围?它只是一个随机变量? – aherlambang 2011-04-01 15:30:50

+0

这个假定线条是水平的....这不会按照你原来的文章工作....另外,原始文章提到的经纬度也被忽视... – 2011-04-01 16:02:57

您需要在用户位置上查找主A-B线上的最近点。查看以下链接以获取更多信息... Point Line

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

+0

有趣的是,我在高中时了解到这个公式......很多数学和计算都涉及到它,但我会考虑它 – aherlambang 2011-04-01 14:28:54

+0

你看过链接吗?这给了你在线的切线点,然后使用以下来获得距离.... http://www.maths.abdn.ac.uk/~igc/tch/ma1002/revision/node9.html – 2011-04-01 16:01:29

+0

数学很简单(奇怪!):) – 2011-04-01 16:01:45