Domanda

Quando disegno un percorso con MKOverlays (a volte con 5000 + singoli MKPolylines), v'è una lunga attesa per tutte le sovrapposizioni da trarre, e ogni volta che la visualizzazione della mappa viene fatta scorrere in una nuova area, le sovrapposizioni per quella zona deve essere disegnato, e c'è un altro evidente freeze-up.

Il mio dilemma è che ho due set di codice che sia disegnare correttamente il percorso. Il primo disegna il percorso come una linea lunga, e richiama molto rapidamente. Il secondo disegna ciascun segmento di linea come una singola linea, e richiede molto tempo lungo.

Ora, perché dovrei nemmeno in considerazione il secondo modo? Perché devo analizzare ogni singola linea per vedere di che colore la linea dovrebbe essere. Ad esempio, se la proprietà title della linea è "rosso", poi faccio la linea rossa, ma se si tratta di "blu", poi la linea è blu. Con la prima tecnica, questo tipo di specificità non è possibile (per quanto ne so, ma forse qualcun altro sa diversamente?), Perché il percorso è solo una grande linea, e l'accesso a ogni singolo segmento è impossibile. Con il secondo modo è facile, ma solo richiede molto tempo.

Ecco le mie due insiemi di codice:

Primo modo (veloce, ma non può accedere ai singoli segmenti):

CLLocationCoordinate2D coords[sizeOverlayLat];

for(int iii = 0; iii < sizeOverlayLat; iii++) {
    coords[iii].latitude = [[overlayLat objectAtIndex:iii] doubleValue];
    coords[iii].longitude = [[overlayLong objectAtIndex:iii] doubleValue];
}

MKPolyline* line = [MKPolyline polylineWithCoordinates:coords count:sizeOverlayLat];

[mapViewGlobal addOverlay:line];

Secondo modo (lento ma posso disegnare ogni riga con un colore specifico):

NSMutableArray* lines = [NSMutableArray new];

for(int idx = 1; idx < sizeOverlayLat; idx++) {
    CLLocationCoordinate2D coords[2];
    coords[0].latitude = [[overlayLat objectAtIndex:(idx - 1)] doubleValue];
    coords[0].longitude = [[overlayLong objectAtIndex:(idx - 1)] doubleValue];

    coords[1].latitude = [[overlayLat objectAtIndex:idx] doubleValue];
    coords[1].longitude = [[overlayLong objectAtIndex:idx] doubleValue];

    MKPolyline* line = [MKPolyline polylineWithCoordinates:coords count:2];
    [line setTitle:[overlayColors objectAtIndex:idx]];
    [lines addObject:line];
}

[mapViewGlobal addOverlays:lines];

La mia domanda è:? Posso ottenere le prestazioni del primo modo con il controllo su ogni riga che il secondo modo in cui mi fornisce

È stato utile?

Soluzione

Si può sicuramente ottenere tali prestazioni, ma si sarebbe probabilmente bisogno di creare il proprio punto di vista di sovrapposizione.

A questo punto di vista, è possibile disegnare polilinee chiamando ripetutamente CGAddLineToPoint, mentre le parti saltare utilizzando CGMoveToPoint. Fate questo separatamente per ogni colore e il gioco è fatto. Quindi, se avete 2 colori (rosso + blu), si farebbe scorrere poligono due volte, prima di disegno rosso (saltando pezzi blu) e poi il disegno blu (saltando pezzi rossi).

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