2013-02-05 24 views
8

Ho una mappa con le sovrapposizioni che voglio memorizzare nella cache - in ogni posto che l'utente ha visitato sulla mappa (che è un'area rettangolare) - controllo se ho una cache delle sovrapposizioni che risiedono in questo rettangolo.Sovrapposizione nella cache di sovrapposizioni arrotondando i rettangoli delle coordinate: come?

Per migliorare il caching (quindi se l'utente si trovava in precedenza sullo stesso rettangolo, tranne che ora si trova a pochi metri dal rettangolo precedente) - voglio "arrotondare" le coordinate.

In questo modo, ogni volta che l'utente si trova in una rectange, controllo se questo rettangolo è simile ai rettangoli precedentemente memorizzati nella cache e, in tal caso, restituisco il risultato memorizzato nella cache.

Inoltre, se l'utente è zumato e il suo rettangolo è contenuto in un rettangolo più grande (precedentemente memorizzato nella cache), allora posso anche usare il rettangolo memorizzato nella cache.

Qualche suggerimento?

risposta

1

Se stai solo osservando come raggruppare le coordinate, scegli la differenza massima tra le coordinate xey, latitudine e longitudine che desideri. Quindi ci sono due modi per raggrupparli. Il primo è più semplice, ma sarà lento se hai molti punti.

Supponiamo di avere una struttura di dati chiamata cachepoint, una distanza massima tra i punti correlati chiamati maxdistance e un nuovo punto che stiamo cercando di verificare per vedere se è vicino all'altro punto chiamato.

for each cachedPoint in cachedPoints 
{ 
    if (point.x - cachedPoint.x < maxdistance) 
    { 
     if (point.y - cachedPoint.y < maxdistance) 
     { 
       cachedPoint.incrementvisits(); 
     } 
    } 
} 

l'altro modo è quello di utilizzare una struttura dati filtrate per x o latitudine, e quindi verificare per vedere se v'è un cachedpoint con x o latitudine entro maxDistance di punto, quindi controllare il yo longtitude. Sarebbe un po 'più veloce, ma occorrerebbe implementare una sorta di hash e aggiungere un po' di complessità che potrebbe non essere necessario.

Speriamo che sia quello che stai chiedendo.

1

se si imposta una struttura di dati come:

var a = { 'scales' : [50, 100, 200, 400, 1000], 
    'cachedRects': [{'location': 'rect-large-1234-5678.png', x: 1234, y: 5678, scale: 3} 
        {'location': 'rect-small-1240-5685.png', x: 1240, y: 5685, scale: 1} ] 
} 

è possibile utilizzare la funzione modulo per fare questo:

var currentx = GetCurrentX(); 
var currenty = GetCurrentY(); 

var currentScale = GetCurrentScale(); 

var rectFound = false; 

foreach(rect in a.cachedRects) { 
    if (rect.scale === currentScale 
     && currentx % a.scales[currentScale] === rect.x 
     && currenty % a.scales[currentScale] === rect.y) { 
      rectFound = true; 
      useOverlay(rect); 
      break; 
    } 

} 

if(!rectFound) { 
    //could loop again for a larger rectangle of a lower scale. 
} 

quanto sopra può o non può rivelarsi JS validi - Non ho provato a farlo funzionare. Spero che tu abbia capito il senso, comunque.

0

Ehi Puoi aggiungere Marker in Google map v2 in Android.

Qui dò codice per marcatore aggiuntivo

MarkerOptions mOpt = new MarkerOptions(); 
    mOpt.position(new LatLng(userHstry.getMyLatlng().latitude, userHstry.getMyLatlng().longitude)); // map.clear(); 
       mOpt.title("Address : " + userHstry.getAddress()).snippet("Date : " + userHstry.getDate() + " , Time : " + userHstry.getTime()); 
       map.addMarker(mOpt);