【问题标题】:OSMDroid - zoom in without changing tiles, is it possible?OSMDroid - 放大而不改变瓷砖,这可能吗?
【发布时间】:2016-05-09 12:37:40
【问题描述】:

我正在使用 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;
            }
    });

Tile 服务器运行良好。但是在放大(14 级以上)时,带有卫星图像的图块集有部分覆盖地面的云,所以我想知道是否可以在不更改图块集的情况下放大。

真实13级

FAKE 缩放模拟 (gimp)

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

【问题讨论】:

    标签: android osmdroid


    【解决方案1】:

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

    但是,从技术上讲,有一种方法可以让您在不进入源代码的情况下为每个提供的图块集增加一个缩放级别。

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

    mapView.setBuiltInZoomControls(false);
    

    在您创建完新按钮后回来。

    使用您的新按钮,您需要跟踪您所处的缩放级别。当处于正常缩放级别时(在本例中为云层之前的级别),设置“放大”按钮来执行此操作而是。

    mapView.setTilesScaledToDpi(true);
    

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

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

    当设置为假时。 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 上提出您需要的问题,因为目前只有不应该出现的变通解决方案。

    【讨论】:

    • 将尝试实施这些> 同时,感谢您抽出宝贵时间。在所有缩放级别上缩放图块可能不是这样的问题。我的危急情况是大约 14 和 15 缩放级别。这是一个“胖手指”的问题(从某种意义上说,您无法以足够精确的缩放级别 13-点击地图)。
    • 哦,在这种情况下,如果它只是一个“胖手指”问题,您可以默认使用 setTilesScaledToDpi(true)。它应该为每个设备解决这个问题,因为这正是创建此方法的原因。
    • @tonygil 所以?你的问题解决了吗?如果没有,我可能有最后一个解决方案,需要从一个磁贴源切换到另一个。
    • 请。还没有成功。但它可能只是我的代码。
    • @tonygil 我已经在更多帮助下编辑了答案。如果您对我尝试的任何解决方案有疑问,我们可以在这里简要讨论一下。但是对于代码帮助,您将不得不提出一个新问题。同时,您应该明确地在 OSMdroid gitHub 页面上提交问题,我很确定这将是他们可以很好实施的功能。
    猜你喜欢
    • 1970-01-01
    • 2016-10-11
    • 1970-01-01
    • 2018-03-11
    • 1970-01-01
    • 2016-11-03
    • 2014-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多