我正在使用从 OSM 下载到 16 级的 osmdroid 和地图。我想知道是否有任何方法可以让 osmdroid 使用该缩放级别的图块,但将其绘制得更大。
问题是那个级别的瓷砖对我来说有足够的细节,但被画得很小。我已经看到其他一些应用程序使用相同的磁贴级别,但不知何故设法将它们绘制得更大。
谢谢
我正在使用从 OSM 下载到 16 级的 osmdroid 和地图。我想知道是否有任何方法可以让 osmdroid 使用该缩放级别的图块,但将其绘制得更大。
问题是那个级别的瓷砖对我来说有足够的细节,但被画得很小。我已经看到其他一些应用程序使用相同的磁贴级别,但不知何故设法将它们绘制得更大。
谢谢
我发现这个问题的最佳解决方案(我今天早些时候遇到过)是更改平铺源中的缩放比例(我使用的是我自己的 OpenStreetMap 版本):
final float scale = getBaseContext().getResources().getDisplayMetrics().density;
final int newScale = (int) (256 * scale);
String[] OSMSource = new String[2];
OSMSource[0] = "http://a.tile.openstreetmap.org/";
OSMSource[1] = "http://b.tile.openstreetmap.org/";
XYTileSource MapSource = new XYTileSource(
"OSM",
null,
1,
18,
newScale,
".png",
OSMSource
);
map.setTileSource(MapSource);
根据屏幕密度改变比例是一个比较好的解决方案。在我的测试过程中,一些图像变得有些模糊,但如果你减少这种意外情况的缩放比例,你会得到一个非常好的结果。
顺便说一句,这不是我的解决方案,我在Github上的 OSMDROID 问题中找到了它。感谢stefangab95。
如果不修改 osmdroid 的源代码,就无法做到这一点。现在,除了视图在缩放级别之间进行动画处理时,图块以其实际分辨率显示。也就是在动画完成后切换tiles,再次将scale设置为1。当用户尝试缩放超出最高细节级别时,我尝试了一些技巧来保持缩放。它在视觉上工作,但从像素映射到地图坐标的所有功能,以及拖动地图时的一些交互,都会中断。因此,它需要对源进行更重大的修改。这是可行的,但我认为这并不值得麻烦——除非你真的想为项目贡献修改,并且以一种不那么骇人听闻的方式来做。
mMapview.setTilesScaledToDpi(true)
这应该可以解决问题
我正在使用离线磁贴,只是这样做是为了以 2 倍分辨率显示它们。重要的部分是 512 像素大小,即使图块是 256。
myMapView.setTileSource (new XYTileSource ("Mapnik", ResourceProxy.string.offline_mode, 13, 17, 512, ".png", "http://127.0.0.1"));
Cloudmade 支持高分辨率磁贴,这些磁贴在目前市场上的手机上看起来要好得多。看看这里:
http://developers.cloudmade.com/projects/tiles/documents
我会对 ldpi 和 mdpi 设备使用普通磁贴,对 hdpi 和 xhdpi 设备使用高分辨率磁贴
要彻底解决您的问题,有两种方法。第一个是您可以通过类似 mapnik 的软件自己生成或渲染地图图块。第二种是在手机上使用基于矢量的实时渲染器,例如 mapsforge。配置文件或样式文件是这两种方法的关键。
您可以使用不同的磁贴源,例如 M$ Bing。这也有更大的街道名称。
保留在 OSMdroid 当前工作模型中的一种解决方法是使用 ImageMagick 或 Photoshop 之类的图像处理包以更高的缩放级别创建一组新的位图图块。
您需要做的是获取每个当前图块 (256x256px),调整它的大小,将大小和宽度加倍,然后将图像切割成 4 个新图块。根据新缩放级别的命名约定保存每个图块。这里描述了瓦片地图命名惯例,以及从原始名称中获取 4 个新名称的简单方法