2013-08-19 11 views
6

Desidero ottenere quanto segue e non so se sia possibile o meno. Sto avendo due punti su una strada (immagino come un traguardo - sono i due bordi dei marciapiedi - sono in linea retta) e voglio verificare se il percorso di un utente è passato tra questi punti.Come trovare se due percorsi di mappe di google sono stati intersecati in un progetto IOS

Così ho pensato, posso fare qualcosa di simile:

  1. ottenere il percorso tra questi due punti (sono abbastanza vicino - la strada è larga 20 metri al massimo)
  2. ottenere il percorso degli utenti
  3. controllare se questi percorsi stanno intercettando, se c'è qualche incrocio tra di loro.

Se fosse pura geometria, sarebbe facile. Sto avendo due linee e voglio sapere se c'è qualche intersezione tra di loro.

Desidero utilizzare quanto segue in un progetto IOS, se fa alcuna differenza. Ad esempio, ho pensato che forse esiste un modo di disegnare le MKPolylines programmaticamente e vedere se c'è un'intersezione. Non voglio vederlo visivamente, ho solo bisogno di programmarlo.

È possibile? Puoi suggerirmi qualcos'altro?

+0

Stai cercando di scoprire se l'utente cros questa linea (posizione effettiva attraverso i servizi di localizzazione) o stai cercando di consentire all'utente di ottenere indicazioni stradali e cercare di scoprire se il percorso di queste indicazioni passa attraverso una linea specifica? –

+0

@TimBodeit Voglio scoprire se l'utente attraversa la linea (se ha superato la linea di arrivo per esempio) – ghostrider

risposta

3

Non esiste un metodo diretto per verificare quell'intersezione.

È possibile trasformare il problema in un problema di geometria convertendo le posizioni lat/long in posizioni di mappa (applicando la trasformazione per appiattirsi su una griglia normalizzata). Questo può essere fatto con MKMapPointForCoordinate.

Una cosa da considerare è l'inesattezza delle posizioni GPS riportate. In un certo numero di casi, scoprirai che il percorso segnalato dal GPS non è effettivamente sulla strada, ma corre lungo la strada. Soprattutto quando si gira (stretto) gli angoli si ottiene spesso una grande curva nella traccia. Come tale, potresti voler estendere la larghezza della "linea di arrivo" per compensare ciò.


Se solo preoccupate se l'utente si trova a una certa distanza di un set point, allora è possibile creare un CLRegion per rappresentare il percorso di destinazione e quindi chiamare containsCoordinate: con la posizione corrente dell'utente. Questo rimuove qualsiasi proiezione e usa direttamente lat/long. È inoltre possibile ottenere il sistema per monitorare questo per voi e darvi una richiamata quando l'utente entra o esce dalla regione con startMonitoringForRegion:desiredAccuracy:. Ancora una volta, è necessario considerare la precisione del GPS quando si imposta il raggio.

+0

In realtà non mi interessa se si tratta di un incrocio o meno. Voglio scoprire se un utente è passato da un punto (ad esempio se posso impostare un raggio in un punto e vedere se la posizione dell'utente è in questo raggio). È più facile che controllare l'incrocio? – ghostrider

2

vorrei cercare di risolvere questo problema in tre fasi:

Fase 1. Convertire pista ogni coordinata di utente deve CGPoint e salvarlo un array.

// 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]; 
} 

Passaggio 2.Convertire MKPolylineView-CGPathRef
Creare una variabile di classe di tipo CGPathRef

{ 
    CGPathRef path; 
} 

Questo metodo è necessario aver implementato per creare il percorso tra due punti:

- (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; 
} 

Fase 3: Creare un metodo personalizzato per controllare se il punto si trova in CGPath o no

- (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

grazie, farò un tentativo e se funziona accetterò la risposta! – ghostrider

Problemi correlati