7

私は以下を達成したいのですが、それが可能かどうかわかりません。道路上に 2 つのポイントがあり (フィニッシュ ラインのように想像してください - それらは舗装の 2 つの端であり、直線上にあります)、ユーザーのルートがこれらのポイント間を通過したかどうかを確認したいと考えています。

だから私は、私はこのようなことができると思いました:

  1. これらの 2 点間のルートを取得します (2 点はかなり近くにあります - 道路の幅はせいぜい 20 m です)。
  2. ユーザールートを取得する
  3. これらのルートが交差しているかどうか、それらの間に交差点があるかどうかを確認します。

純粋な幾何学なら簡単です。2 つの線があり、それらの間に交点があるかどうかを知りたいです。

違いがあれば、IOS プロジェクトで以下を使用したいと考えています。たとえば、プログラムで MKPolylines を描画し、交差があるかどうかを確認する方法があるのではないかと考えました。視覚的に見たくありません。プログラムで必要なだけです。

出来ますか?他に何か提案できますか?

4

2 に答える 2

3

その交差点を直接確認する方法はありません。

緯度/経度の位置をマップの位置に変換することで、問題をジオメトリの問題に変えることができます (変換を適用して、正規化されたグリッド上で平坦化します)。これは で行うことができますMKMapPointForCoordinate

考慮すべきことの 1 つは、GPS で報告された位置の不正確さです。多くの場合、GPS から報告されたトラックが実際には道路上ではなく、道路の脇を走っていることに気付くでしょう。特に(タイトな)コーナーを曲がるときは、トラックに大きなカーブが生じることがよくあります。そのため、これを補うために「仕上げ線」の幅を広げたい場合があります。


ユーザーが設定ポイントから特定の距離内にいるかどうかだけを気にする場合はCLRegion、ターゲットの場所を表すを作成してからcontainsCoordinate:、現在のユーザーの場所で呼び出すことができます。これにより、投影が削除され、緯度/経度が直接使用されます。また、システムにこれを監視させ、ユーザーが領域に出入りするときにコールバックを提供することもできますstartMonitoringForRegion:desiredAccuracy:。ここでも、半径を設定するときに GPS の精度を考慮する必要があります。

于 2013-08-22T20:38:18.960 に答える
2

この問題を 3 つのステップで解決しようとします。

ステップ 1. ユーザーのトラックが持つ各座標を変換CGPointし、配列に保存します。

// in viewDidLoad
locManager = [[CLLocationManager alloc] init];
[locManager setDelegate:self];
[locManager setDesiredAccuracy:kCLLocationAccuracyBest];
[locManager startPdatingLocation];
self.userCoordinatePoints = [NSMutableArray alloc]init];

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation  {

   CLLocationCoordinate2D loc = [newLocation coordinate];
   CGPoint *currentPoint = [self.mapView convertCoordinate:loc toPointToView:self.mapView]; 
  // add points to array
   self.userCoordinatePoints addObject:currentpoint];
}

ステップ 2. 型のクラス変数を作成するように変換MKPolylineViewするCGPathRef
CGPathRef

{
  CGPathRef path;
}

2 点間のルートを作成するには、このメソッドを実装する必要があります。

- (MKOverlayView*)mapView:(MKMapView*)theMapView
           viewForOverlay:(id <MKOverlay>)overlay
{
  MKPolylineView *overlayView = [[MKPolylineView alloc]
                                 initWithOverlay:overlay];
  overlayView.lineWidth = 3;
  overlayView.strokeColor = [[UIColor blueColor]colorWithAlphaComponent:0.5f];
  // overlayView.fillColor = [[UIColor purpleColor] colorWithAlphaComponent:0.1f];
  path = overlayView.path;
  return overlayView;
}

ステップ 3: ポイントが CGPath 内にあるかどうかを確認するカスタム メソッドを作成する

- (BOOL)userRouteIntersectsGoogleRoute
{
 // Loop through all CGPoints 
  for(CGPoint point in self.userCoordinatePoints)
{
  BOOL val = CGPathContainsPoint(path, NULL, point);
  if(val)
  {
    return YES;
  }
}
return NO;
}
于 2013-08-28T07:14:22.800 に答える