2011-04-01 19 views
3

我想有些簡單的地理圍欄算法基本上執行以下操作的實現:實施在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

回答

1

您可以從矩形的四個點創建路徑,然後使用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

1

您需要在用戶位置上查找主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