OSMDroid - 放大而不更改瓷砖,是否可能?

时间:2016-05-09 12:37:40

标签: android osmdroid

我正在使用OSMDroid(v 4.3)开发一个Android移动地图应用程序。我已经使用arcgisonline建立了一个底图作为我的磁贴服务器。

    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

REAL 13级

zoom13

FAKE变焦模拟(gimp) digital/fake zoom

注意:我会失去定义#34;炸毁"平铺图像,这是给定的。因为,我需要在一些地块周围添加标记(通过点击屏幕)并且在zoom13中变得太不精确或者无法确定具有云覆盖的变焦14+中的正确​​边缘,数字变焦中的像素化不是问题并且是完美的可以接受的。

1 个答案:

答案 0 :(得分:3)

不,如果不修改OSMdroid源代码,就无法做到这一点。

但是,有一种方法可以在技术上为每个提供的tileset获得一个缩放级别,而无需进入源代码。

您需要创建自己的缩放按钮,而不是使用提供的缩放按钮。禁用默认缩放按钮。

mapView.setBuiltInZoomControls(false);

当你创建新的按钮时,请回来。

使用新按钮,您需要跟踪您所处的缩放级别。当处于正常缩放级别(在这种情况下位于云前的级别)时,设置"放大&#34 ;按钮改为执行此操作。

mapView.setTilesScaledToDpi(true);

这会将地图缩放到每英寸点数,从而为您提供所需的结果。这是一个例子。

设置为True时。 mapView.setTilesScaledToDpi(true);

设置为false时。 mapView.setTilesScaledToDpi(false);

离开此缩放级别时,不要忘记设置为false。

这是下降,它只给你一个缩放级别,你不能决定结果,缩放分辨率可能因设备而异,它不打算以这种方式使用,误用这可能会导致混乱的结果

编辑:您也可以像这里一样更改Tilesource中图块的缩放比例。 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上提出您的需求问题,因为现在只有解决方案不应该是这种情况。

相关问题