我正在使用 OSMDroid (v 4.3) 开发一个安卓手机 map 应用。我已经使用 arcgisonline 作为我的切片服务器建立了 basemap 。
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 级以上)时,带有卫星图像的图 block 集有部分覆盖地面的云,所以我想知道是否可以在不更改图 block 集的情况下进行放大。
真正的 13 级
注意:我会通过“炸毁”瓷砖图像来失去定义,这是给定的。因为,我需要在一些地 block 周围添加标记(通过点击屏幕),并且它在 zoom13 中变得太不精确,或者在云覆盖的 zoom 14+ 中无法确定正确的边缘,数字变焦中的像素化不是问题并且是完美的可以接受。
最佳答案
不,如果不修改 OSMdroid 源代码,就无法做到这一点。
但是,有一种方法可以在技术上为提供的每个 tileset 增加一个缩放级别,而无需进入源代码。
您需要创建自己的缩放按钮,而不是使用提供的缩放按钮。禁用默认缩放按钮。
mapView.setBuiltInZoomControls(false);
创建新按钮后回来。
使用新按钮时,您需要跟踪所处的缩放级别。在正常缩放级别(在本例中为云前级别)时,设置“放大”按钮来执行此操作相反。
mapView.setTilesScaledToDpi(true);
这会将您的 map 缩放为每英寸点数,从而为您提供所需的结果。这是一个例子。
当设置为 True 时。 mapView.setTilesScaledToDpi(true);
当设置为 false 时。 mapView.setTilesScaledToDpi(false);
离开此缩放级别时不要忘记设置回 false。
这样做的缺点是,它只给你一个缩放级别,你无法决定结果,缩放分辨率可能因设备而异,它不打算以这种方式使用,滥用可能会导致困惑的结果。
编辑:您还可以像此处那样更改 Tilesource 中的图 block 缩放比例。 https://stackoverflow.com/a/25761055/6263209但它会在所有缩放级别上缩放图 block ,我认为这不是您想要的。
编辑 2:好吧,既然你说 setTilesScaledToDpi 对你不起作用,我将尝试解释另一种与之前的解决方案具有相同效果的解决方案。
您可以尝试的另一种解决方案是使用一个新函数来更改 tileSource,除 TileSizePixels 参数外,每个参数都相同,这是下一行中的第五个参数。
mapView.setTileSource(new OnlineTileSourceBase("ArcGisOnline", null, 0, 16, *Here*->256, "",
urlArray)
你可以做的是在你的应用程序中设置一行,用户可以根据每个像素的图 block 大小输入他们想要在图 block 集上放大多少,当他们确认选择时你可以调用一个函数看起来像这样:
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 来决定他屏幕上的图 block 的大小,这不是最有效的方法,但以前的答案也是如此。您也可以自己对值进行硬编码。
您可能应该根据需要在 official gitHub page 上提交问题因为现在只有不应该出现的变通解决方案。
关于android - OSMDroid - 放大而不改变瓷砖,这可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37116054/