2013-02-05 29 views
8

Mam mapę z nakładkami, które chcę buforować - w każdym miejscu odwiedzanym przez użytkownika na mapie (co jest obszarem prostokąta) - sprawdzam, czy mam bufor pamięci nakładek znajdujących się w tym prostokącie.Buforowanie nakładek przez zaokrąglenie współrzędnych prostokątów - jak?

Aby poprawić buforowanie (tak, jeśli użytkownik był wcześniej w tym samym prostokącie, z tą różnicą, że teraz znajduje się kilka metrów od poprzedniego prostokąta) - chcę "zaokrąglić" współrzędne.

W ten sposób za każdym razem, gdy użytkownik znajduje się na prostokącie - sprawdzam, czy ten prostokąt jest podobny do poprzednio zapisanych w pamięciach prostokątów, a jeśli tak, to przyniosę wynik z pamięci podręcznej.

Ponadto, jeśli użytkownik jest pomniejszony, a jego prostokąt to zawarty w większy (poprzednio buforowany) prostokąt - wówczas mogę również użyć buforowanego prostokąta.

Wszelkie sugestie?

Odpowiedz

1

Jeśli zastanawiasz się tylko, jak pogrupować współrzędne, zdecyduj o maksymalnej różnicy między współrzędnymi na osi X i Y lub szerokości i długości geograficznej. Są dwa sposoby na grupowanie ich. Pierwsze jest łatwiejsze, ale będzie wolne, jeśli masz wiele punktów.

Załóżmy, że mamy strukturę danych o nazwie cachedPoints, maksymalną odległość między powiązanymi punktami zwaną maxdistance i nowy punkt, który próbujemy sprawdzić, aby sprawdzić, czy jest on zbliżony do innego zwanego punktem.

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

Innym sposobem jest użycie struktury danych Weaver x lub szerokość, a następnie sprawdzić, czy nie jest cachedpoint a x lub szerokość w maxdistance punktu, a następnie sprawdzić ylub longtitude. Byłoby to trochę szybsze, ale wymagałoby zaimplementowania jakiegoś skrótu i ​​dodania mnóstwa złożoności, której możesz nie potrzebować.

Mam nadzieję, że o to właśnie prosisz.

1

Jeśli utworzenie struktury danych jak:

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

można użyć funkcji modulo to zrobić:

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. 
} 

powyższe może lub nie może okazać się ważne JS - Nie próbowałem go uruchomić. Mam nadzieję, że i tak zrozumiesz.

0

Hej Możesz dodać znacznik w mapie Google v2 w systemie Android.

Tutaj daję kod doda znacznik

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);