2013-02-05 36 views
8

我有一個覆蓋圖,我想要緩存 - 在用戶在地圖上(這是一個矩形區域)訪問的每個地方 - 我檢查,如果我有一個駐留在這個矩形的覆蓋高速緩存。通過舍入座標矩形緩存重疊 - 如何?

爲了提高緩存(所以如果用戶以前在同一個矩形上,除了現在他距離前一個矩形幾米) - 我想「座標」座標。

這樣,每次用戶在rectange - 我檢查這個矩形是否類似於以前緩存的矩形,如果是這樣我帶來緩存的結果。另外,如果用戶縮小和他的矩形是包含在一個更大(以前緩存)的矩形 - 那麼我也可以使用緩存的矩形。

有什麼建議嗎?

回答

1

如果您只是在查看如何對座標進行分組,請決定x和y座標之間的最大差異或者您想要的緯度和經度。然後有兩種方法可以將它們分組。第一個比較容易,但是如果你有很多點,它會很慢。

假設我們有一個稱爲cachedPoints的數據結構,稱爲maxdistance的相關點之間的最大距離,以及我們試圖檢查它是否接近另一個被調用點的新點。

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

另一方法是使用由x或緯度排序的數據結構,然後再搜索,看是否存在與點的maxdistance內的x或緯度cachedpoint,然後檢查y或經度。它會更快一些,但是需要使用某種散列來實現,並增加了一些您可能不需要的複雜性。

希望這就是你要求的。

1

如果你設置了一個數據結構,如:

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

可以使用模函數來做到這一點:

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

上面可能會或可能不會變成是有效的JS - 我沒有試圖運行它。無論如何,我希望你能得到主意。

0

嘿,你可以在谷歌地圖V2在Android中添加標記。

這裏我給代碼加標記

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