Bug mkpolyline polilineawithpoints?
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?
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.