0

我使用 Openstreetmaps 和 OsmDroid 构建了一个带有离线地图数据的 Android 应用程序。在 MDPI 320x480 像素的设备上,地图看起来不错,但在具有 480x800 像素的 HDPI 屏幕的设备上,街道名称很小,而且有点难以阅读。我的地图数据直到缩放级别 18(我可以下载并与 Mapnik 平铺源一起使用的最大级别)作为 zip 文件从 SD 卡加载。我的本地地图来自布鲁塞尔(比利时)的特定区域。

320x480 像素的 MDPI 设备截图:

在此处输入图像描述

480x800 像素的 HDPI 设备的屏幕截图:

在此处输入图像描述

如果您在设备上的应用程序中看到这些视图,则 MDPI 地图具有良好的可读性,而在 HDPI 地图中,街道名称较小。

有没有办法让街道名称在 HDPI 设备上也更具可读性,所以用户会认为他在地图上再放大一步?因为无法转到缩放级别 19,因为没有针对它的 openstreetmaps 数据。因此,一个简单而小的实施时间/工作的解决方案对我来说没问题。现在通过在地图上滑动来完成缩放。如果您还需要代码,请告诉我,我会发布。

提前致谢。

4

2 回答 2

4

Osmdroid 适用于静态 PNG 图像的图块。您不能更改平铺图像。如果您想获得更好的地图解决方案,请尝试 MapsForge。此应用程序/库使用地图数据并动态呈现它们。通过这种方式,您可以更好地控制渲染地图,并且可以自定义其文本、字体和颜色。

于 2012-06-04T15:40:25.443 回答
4

在这个答案中,我将解释一下我是如何更改街道名称的大小的。

在 MapsForge 的 jar 文件中包含一个 xml 文件,该文件将标准用于渲染地图数据。您也可以通过从服务器查看源代码来下载此文件:http: //mapsforge.googlecode.com或从此处下载 xml 文件本身:http: //mapsforge.googlecode.com/svn/trunk/mapsforge -render-theme/src/main/resources/osmarender/osmarender.xml。所以,你有一个基础来调整你自己的渲染文件。我把它改成这样:

(xml文件的片段):

在此处输入图像描述

在 MapsForgeRenderThemeAPI 页面(在上面的网站上)的 Wiki 页面上,您可以找到如何调整自己的渲染文件以及规则元素中的 e、k、v 属性的含义。如您所见,在无隧道方式规则元素中的某处,在方式规则元素下方有一个带有 e="way"、k="area"、v="~|no|false" 的规则元素。此元素下的每个规则元素都有一个 e="way"、k="highway" 和等于 openstreetmap 参数的 v 值。当您登录到openstreetmap.org上的编辑页面时,您可以找到您想要调整名称的街道类型。

现在我要告诉你如何为指定类型的街道精确设置你想要的字体大小。作为一个例子,我将采用第三条道路元素。每种方式规则元素都包含一些这样的代码:

<rule e="way" k="highway" v="tertiary">
    <line stroke="#ffff90" stroke-width="1.5" />
    <rule e="way" k="*" v="*" zoom-min="14">
        <pathText k="name" font-style="bold" font-size="32" stroke="#ffff90" stroke-width="2.0" />
    </rule>
</rule>

line 元素指定街道的显示方式(颜色、宽度、黑色边框,...)。这里还有一个规则元素,其中包含一个 pathText 元素。此元素指定文本在笔划内的显示方式(颜色、宽度、字体大小、...)。所以,这就是我们需要的元素!如您所见,在我的示例中,第三条道路的街道名称的字体大小将以 32 像素的大小显示,放大级别为 14 或更高。

现在我们要使用我们自己的渲染主题 xml 文件:

我在项目的 assets 文件夹中添加了自己的 render-xml 文件。与启动时相比,我将文件复制到一个位置,我可以在需要时将其读出。在您处理 mapsforge 地图的活动中,您只需通过实现如下代码(示例)链接到该文件:

File f = new File(Environment.getExternalStorageDirectory(), myRenderTheme.xml);
mapView.setRenderTheme(f);

请注意,setRenderTheme(File) 将抛出 FileNotFoundException。

因此,这一切都是为了使用 mapsforge 更改街道名称。您可以根据需要渲染整个地图!

感谢 MapsForge 开发社区。

玩得开心!

于 2012-07-22T23:47:41.113 回答