Domanda

Voglio visualizzare un percorso dalla mia posizione a una destinazione. Ho preso questo codice http://code.google.com/p/octomapkit E ho aggiunto alcuni messaggi di registrazione. GO ha ottenuto le coordinate del percorso (circa 103) correttamente. Sono in arrivo e riempiono il percorso dalla mia posizione a destinazione, quindi la chiamata di Google e l'analisi degli elementi è buona. Ma quando voglio visualizzare in mkmapview, mostra solo l'avvio della polilinea. Come 15 o 20 non di più.

Proverò a pubblicare il codice dall'alto verso il basso:

Il codice originale ha preso solo il primo elemento e pensavo che forse se ottengo l'ultimo vedrò qualcos'altro, se sì, che aggiungerò tutte le sovrapposizioni - ecco perché il loop.

altrimenti : MKPolyline *polyLine = [self.mapView.overlays objectAtIndex:0];

#pragma mark MKMapViewDelegate
- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay
{
    MKPolylineView *routeLineView = nil;
    // should take the objectAtIndex:0 , but for test I will check if it has more
    for(int i=0;  i <self.mapView.overlays.count; i++ ){

        MKPolyline *polyLine = [self.mapView.overlays objectAtIndex:i];       

        routeLineView = [[[MKPolylineView alloc] initWithPolyline:polyLine] autorelease];
        routeLineView.fillColor = [UIColor redColor];
        routeLineView.strokeColor = [UIColor redColor];
        routeLineView.lineWidth = 3;   
    }   

    return routeLineView;
}


-(void) routeLoadSucceededWithRoutePoints:(MKMapPoint*)routePoints count:(int)pointNumber {
    //NSLog(@"MKMapVew+OctoRoute.routeLoadSucceededWithRoutePoints count: %d", pointNumber);

    MKPolyline* routeLine = nil;
    routeLine = [MKPolyline polylineWithPoints:routePoints count:pointNumber];

    // add the overlay to the map
    if (nil != routeLine) {

        // added zoom support:
        if(shouldZoom){
            MKCoordinateRegion region = [self coordinateRegion];
            [self setRegion:region animated:YES];
        }


        //[self removeOverlays:self.overlays];
        [self addOverlay:routeLine];
    }
}

il //[self removeOverlays:self.overlays]; Non ha alcun effetto se viene commentato o no, sperando che crei di più :) ma no.

Dentro mapPointCArrayFromJSONString Vedo correttamente le coordinate:

-(void) jsonLoadSucceededWithData:(NSData*)loadedData {
    self.routeParser.jsonStr = [[[NSString alloc] initWithData:loadedData encoding:NSUTF8StringEncoding] autorelease];
    MKMapPoint *mapPointCArray = [self.routeParser mapPointCArrayFromJSONString];

    //NSLog(@"OctoRouteService.jsonLoadSucceededWithData : %d"+ mapPointCArray.);
    [delegate routeLoadSucceededWithRoutePoints:mapPointCArray count:[self.routeParser numberOfPoints]];
}

Il steps ha sicuramente il coordinato. Controllato molte volte.

-(MKMapPoint*) mapPointCArrayFromJSONString {   
    NSArray *steps = [self routeStepsArrayFromJSONString];

    //NSLog(@"OctoRouteParser.mapPointCArrayFromJSONString steps:%d ", steps.count);
    if(steps.count == 0){
        return nil;
    }

    MKMapPoint *mapPointCArray = malloc(sizeof(CLLocationCoordinate2D) * [steps count]*2 -1);
    numberOfPoints = [steps count]-1;

    int index=0;
    for (NSDictionary *stepDict in steps) {
        [self addRouteStepDict:stepDict toMapPointCArray:mapPointCArray atIndex:index];
        index = index+2;        
    }

    return mapPointCArray;
}

Non riesco a vedere un motivo per cui è solo la prima frazione del percorso sulla mia mappa, con la linea rossa.

Qualche suggerimento?

È stato utile?

Soluzione

Il viewForOverlay Il metodo delegato verrà chiamato dalla vista mappa per ogni sovrapposizione per cui deve visualizzare una vista. Può anche chiamarlo più di una volta per ogni overlay.

Il tuo codice deve solo preoccuparsi di creare e restituire una vista per il singolo overlay Passato come parametro a quel metodo.

Il codice dovrebbe esserci qualcosa del genere:

MKPolylineView *routeLineView = [[[MKPolylineView alloc] initWithPolyline:overlay] autorelease];
routeLineView.fillColor = [UIColor redColor];
routeLineView.strokeColor = [UIColor redColor];
routeLineView.lineWidth = 3;   
return routeLineView;

Il codice esistente nella tua domanda restituisce la vista corrispondente all'ultima sovrapposizione che si trova nel overlays Array per ogni overlay la mappa Visualizza chiama viewForOverlay per.


Inoltre, che Octomapkit ha un bug nel mapPointCArrayFromJSONString metodo. Queste righe:

MKMapPoint *mapPointCArray = malloc(sizeof(CLLocationCoordinate2D) 
                                        * [steps count]*2 -1);
numberOfPoints = [steps count]-1;

dovrebbe essere:

MKMapPoint *mapPointCArray = malloc(sizeof(CLLocationCoordinate2D) 
                                        * [steps count]*2);
numberOfPoints = [steps count]*2;

La prima riga originale è sbagliata perché esclude il punto finale del segmento dell'ultima riga.

La seconda riga originale è molto sbagliata perché numberOfPoints dovrebbe riflettere il numero di punti in mapPointCArray (non l'ultimo indice in steps Vettore). Come era, la sovrapposizione avrebbe mostrato solo metà del percorso.

Sarebbe più pulito modificare quel codice in modo che il calcolo venga eseguito solo una volta:

numberOfPoints = [steps count]*2;
MKMapPoint *mapPointCArray = malloc(sizeof(CLLocationCoordinate2D) 
                                        * numberOfPoints);


Il viewForOverlay Il metodo dovrebbe essere ancora codificato come spiegato in precedenza. Dovrebbe funzionare solo con il overlay Il parametro è passato ad esso e non direttamente con la vista mappa overlays Vettore.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top