2016-05-09 59 views
3

我正在開發一個使用OSMDroid(v 4.3)的android手機地圖應用程序。我已經建立了一個使用arcgisonline作爲我的瓷磚服務器的底圖。OSMDroid - 放大而不更改瓷磚,有可能嗎?

String[] urlArray = {"http://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/"}; 
    mapView.setTileSource(new OnlineTileSourceBase("ArcGisOnline", null, 0, 16, 256, "", 
      urlArray) { 
      @Override 
      public String getTileURLString(MapTile aTile) { 
       String mImageFilenameEnding = ".png"; 
       return getBaseUrl() + aTile.getZoomLevel() + "/" + aTile.getY() + "/" + aTile.getX() 
         + mImageFilenameEnding; 
      } 
    }); 

瓷磚服務器工作得很好。但是當放大(等級14+)時,用衛星圖像設置的圖塊具有部分覆蓋地面的雲,所以我想知道是否可以在不更改圖塊集的情況下進行放大。

satellite imagery with cloud cover

真實水平13

zoom13

FAKE變焦模擬(瘸子) digital/fake zoom

注:我會被 「炸燬」 板磚形象失去的定義,這是一個給出。因爲我需要在一些地塊周圍添加標記(通過在屏幕上點擊),並且在zoom13中變得太不精確,或者無法確定在雲層覆蓋範圍內變焦14+中的正確​​邊緣,數字變焦中的像素化不是問題,並且是完美的可以接受的。

回答

2

不,沒有修改OSMdroid源代碼的方法。

但是,有一種方法可以在技術上爲每個tileset提供一個縮放級別,而無需使用源代碼。

而不是使用提供的縮放按鈕,您將需要創建自己的。禁用默認縮放按鈕。

mapView.setBuiltInZoomControls(false); 

回來時,當你創建你做了新的按鈕。

使用新按鈕,您需要跟蹤您所處的縮放級別。當處於正常縮放級別時(此時雲層前面的級別),將「放大」按鈕設置爲取而代之。

mapView.setTilesScaledToDpi(true); 

這將縮放您的地圖到每英寸點數,從而給你你想要的結果。這是一個例子。

設置爲True時。 mapView.setTilesScaledToDpi(true);

設置爲false時。 mapView.setTilesScaledToDpi(false);

當離開此縮放級別時,不要忘記設置爲false。

缺點是,它只給你一個縮放級別,你不能決定結果,縮放分辨率可能因設備而異,它不打算以這種方式使用,並濫用這可能會給混亂的結果。

編輯:你也可以像這裏一樣改變瓷磚的縮放比例。 https://stackoverflow.com/a/25761055/6263209但它會縮放所有縮放級別的圖塊,我不認爲是你想要的。

編輯2:好吧,因爲你說setTilesScaledToDpi不適合你,我會試着解釋另一個解決方案,它會產生與以前相同的效果。

你可以嘗試的另一個解決方案是使用一個函數來更改tileSource,使用每個參數都相同的參數,除了TileSizePixels參數(它是下面一行中的第五個參數)。

mapView.setTileSource(new OnlineTileSourceBase("ArcGisOnline", null, 0, 16, *Here*->256, "", 
     urlArray) 

你可以做的是設置您的應用有何線,用戶可以輸入多少,他們要根據每個像素的瓷磚的尺寸放大某一地形設置,當他們確認有選擇,你可以調用一個函數,應該是這樣的:

public Void setNewTilesPixels(int tileSizePixels) { 
    String[] urlArray = {"http://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/"}; 
    mapView.setTileSource(new OnlineTileSourceBase("ArcGisOnline", null, 0, 16, tileSizePixels, "", 
     urlArray) { 
      @Override 
      public String getTileURLString(MapTile aTile) { 
       String mImageFilenameEnding = ".png"; 
       return getBaseUrl() + aTile.getZoomLevel() + "/" + aTile.getY() + "/" + aTile.getX() 
        + mImageFilenameEnding; 
     } 
    }); 
} 

基本上它只是讓用戶通過創建一個新TileSource這是不是最有效的方式決定他的屏幕上瓷磚的大小,但這樣是以前的答案。您也可以自己硬編碼該值。

您應該在official gitHub page上提出您的需求問題,因爲現在只有解決方案不應該是這種情況。

+0

將試圖執行這些>同時,我感謝您的時間。在所有縮放級別縮放切片可能不是這樣的問題。我的危急情況是14和15左右的縮放級別。這是一個「胖手指」的問題(從某種意義上說,你不能用足夠精確的縮放級別13來點擊地圖)。 –

+1

哦,在這種情況下,如果它只是一個「胖手指」問題,你可以默認使用setTilesScaledToDpi(true)。它應該爲每個設備解決這個問題,因爲這正是爲什麼創建該方法的原因。 –

+0

j'essaierai et je terépondtout de suite。 –