簡體   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