2013-08-19 8 views
6

私は次のことを達成したいと思います。可能かどうかはわかりません。私は道路上に2つのポイントを持っています(仕上げ線のように想像してください - それらは舗道の2つの辺です - 直線にあります)、ユーザーのルートがこれらのポイントを通過したかどうかをチェックしたいと思います。IOSプロジェクトで2つのGoogleマップルートが交差しているかどうかを調べるには

だから、私はこのような何かを行うことができ、考えた:

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

純粋なジオメトリであれば簡単です。私は2つの行を持っており、それらの間に交差点があるかどうかを知りたい。

私はIOSプロジェクトで次のものを使用したいと思います。たとえば、MKPolylinesを描画し、交差点があるかどうかをプログラムで確認する方法があると考えました。私はそれを視覚的に見たいと思っていません、私はプログラムでそれを必要とします。

可能ですか?私に他の何かを提案できますか?

+0

あなたはユーザーのクロスワードその行に実際の位置情報サービスが表示されているか、またはユーザーに経路を知らせて、これらの経路のルートが特定の行を通過しているかどうかを調べようとしていますか? –

+0

@TimBodeitユーザーが行を横切っているかどうかを調べたい(たとえば、フィニッシングラインを通過した場合) – ghostrider

答えて

3

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

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

考慮すべき点の1つは、GPSで報告された位置の不正確です。多くの場合、GPSからの報告されたトラックは実際には道路にはなく道路の横にあることがわかります。特にコーナーを回すと、トラックに大きなカーブができます。そのため、これを補うために 'フィニッシュライン'の幅を広げたい場合があります。


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

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

+0

実際には交差点であるかどうかは気にしません。私は、あるポイントからユーザが通過したかどうかを知りたい(例えば、あるポイントに半径を設定し、その半径にあるかどうかを確認するなど)。交差点を確認するより簡単ですか? – ghostrider

2

私は、次の3つの手順でこの問題を解決しようとするだろう。

// 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。

- (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:CGPathRef
MKPolylineViewに変換すると、2点間のルートを作成するために実装している必要がありますCGPathRef

{ 
    CGPathRef path; 
} 

このメソッドの型のクラス変数を作成して確認するためにカスタムメソッドを作成します。ポイントが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; 
} 
+0

ありがとう、私は試してみると、それが動作する場合は、私は答えを受け入れるだろう! – ghostrider