28

我使用MapsForge 0.8在我的 Android 应用程序中显示地图。当使用在线图块(只是位图,而不是可以在运行时渲染器中调整的矢量数据)时,地图在我的高分辨率设备上真的很小,我什么也看不懂。

截屏

我想缩放地图,我尝试了以下方法:

mapView.getModel().displayModel.setDefaultUserScaleFactor(2.0f);

和:

mapView.getModel().displayModel.setUserScaleFactor(2.0f);

但这并没有改变任何东西。
如何让它显示地图更大?

更新:

我的意思不是放大。我的意思是缩放当前的缩放级别以使其在高分辨率设备上可读。想象一下上面在小型智能手机上的屏幕截图 - 它很小。我什至看不懂街名。

第二次更新

下面的当前答案不回答这个问题。这是关于缩放位图的在线图块 - 而不是如何影响渲染矢量数据。

第三次更新

接受的答案终于解决了这个问题!

4

6 回答 6

6

根据本文档,(阅读指定位置部分)您可以指定要显示的区域和缩放级别。

this.mapView.setCenter(new LatLong(52.517037, 13.38886));
this.mapView.setZoomLevel((byte) 12);

上述解决方案将按照官方文档中提供的方式工作。

除此之外,我还对此进行了搜索,发现我们还可以将MapPosition设置为MapViewPosition(请参阅此链接)。

MapPosition mapPosition1 = new MapPosition(new LatLong(52.517037, 13.38886), (byte) 12);
this.mapView.getModel().mapViewPosition.setMapPosition(mapPosition1);

希望这会帮助你。

于 2017-01-17T10:45:40.917 回答
1

在 mapsforge 中有很多“缩放”的方法。
如本所示,您可以尝试直接缩放模型.zoom()mapViewPosition而不是直接缩放模型。
如果这是您的要求,请尝试以下操作:

代码:

MapViewPosition mapViewPosition = mapView.getModel().mapViewPosition; 
mapViewPosition.zoom((byte) XX); // Change it to a number (i.g. "(byte) 3")

我什至看不懂街名。

但是,如果您正在谈论UI TEXT,则可以尝试像这样更改它:

mapView.setTextScale(XX); // Again, number goes here

如果仅文本大小对您来说还不够,您可以尝试创建一个新的RenderTheme
文档示例:

代码:

tileRendererLayer.setXmlRenderTheme(new ExternalRenderTheme(File)) // File should be
                                                 // the XML file for the RenderTheme

XML:

<?xml version="1.0" encoding="UTF-8"?>
    <rendertheme xmlns="http://mapsforge.org/renderTheme" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://mapsforge.org/renderTheme renderTheme.xsd" version="1">

    <!-- matches all ways with a "highway=trunk" or a "highway=motorway" tag -->
    <rule e="way" k="highway" v="trunk|motorway">
        <line stroke="#FF9900" stroke-width="2.5" />
    </rule>

    <!-- matches all closed ways (first node equals last node) with an "amenity=…" tag -->
    <rule e="way" k="amenity" v="*" closed="yes">
        <area fill="#DDEECC" stroke="#006699" stroke-width="0.3" />
    </rule>

    <!-- matches all nodes with a "tourism=hotel" tag on zoom level 16 and above 
-->
    <rule e="node" k="tourism" v="hotel" zoom-min="16">
        <symbol src="file:/path/to/symbol/icon/hotel.png" />
        <caption k="name" font-style="bold" font-size="10" fill="#4040ff" />
    </rule>
</rendertheme>
于 2017-01-17T12:35:09.863 回答
1

我搜索并找到了这个链接这个问题(在渲染主题中支持与分辨率相关的图像)关于高分辨率设备中的不可读性问题。这里似乎有两个问题:

文本渲染:如何使文本(标签)更大?

此问题的解决方案是使用 TileRendererLayer.setTextScale(float textScale)

TileRendererLayer tileRendererLayer = new TileRendererLayer(...);
mapView.getLayerManager().getLayers().add(tileRendererLayer);
tileRendererLayer.setTextScale(...)

符号/图标渲染:

Ludwig Brinckmann第二个链接中说:

通过使用 SVG 图像和平铺缩放,Rescue 分支对此提供了相当多的支持。

这是那个分支,但我认为它已经合并到项目中。因此,对于图标来说,您需要使用根据docs自动缩放的 SVG 渲染器:

SVG 符号

符号可以定义为光栅 PNG 格式,也可以定义为 SVG 格式的矢量图形。

...

SVG 缩放

SVG 资源现在可以自动缩放以适应不同的设备分辨率。

于 2017-01-17T14:00:30.597 回答
0

我的意思不是放大。我的意思是缩放当前的缩放级别以使其在高分辨率设备上可读。

这只是现实中不存在的区别。

您所描述的基本上是纹理,因此我将使用“纹理”一词而不是“位图”。


在任何缩放级别,一定数量的屏幕像素都会映射到以米为单位的特定现实世界区域。这是您的地图比例或“缩放级别” - 任何地图角落的东西。例如,10 像素 = 1 公里。

你的图像有一个代表的区域,比如伦敦 1 公里的正方形,以及一个以像素为单位的大小,比如 40x40。

当软件尝试将纹理绘制到屏幕上时,它需要将纹理的像素映射到屏幕像素。在我们的示例中,我们的缩放级别是 10 像素 = 1km,因此屏幕上 1km 的正方形是 10x10 像素。我们的纹理也代表一个 1 公里的正方形,但有更多的像素 (40x40)。

因为这些值不同,我们需要以某种方式使我们的纹理更小。这称为纹理过滤,也可以使纹理更大。

您的纹理在高分辨率设备上看起来不好的原因在于过滤的行为方式。如果您使用某种类型的mipmap ,您可能能够获得可接受的结果,从而在用户缩小时降低细节级别。这类似于 Google 地图在您越走越远时如何删除标签。


您将永远无法从高缩放级别看到高级别的细节。这就是为什么答案说“只是放大!” 在技​​术上是正确的。

如果您只是增加纹理应用的区域而不同等缩放(缩放)地图,您的纹理和底层地图将不同步,这绝对是不可取的。

于 2017-05-17T10:21:09.503 回答
0

地图视图图块大小定义了矢量和光栅地图中的渲染。

我们在 Mapsforge 示例应用程序中有光栅图块源的示例,例如 DownloadLayerViewer。使用了 256px 的固定 tile 大小,这是由 tile 源提供的:

this.mapView.getModel().displayModel.setFixedTileSize(256);

如果删除该线,则地图视图图块大小将根据设备 dpi 自动计算(如矢量地图中),因此光栅图块会显得更大(尽管有点模糊)。

资料来源:MapsForge 谷歌开发组

删除这条线使其工作。以前我尝试将磁贴大小设置为不同的值,但从未尝试完全删除该设置。

于 2017-09-06T20:30:43.513 回答
-4

只是............放大............在!!!!!!!!! 另外,尝试设置这个:

mapView.getModel().displayModel.setDefaultUserScaleFactor(2.0f);

对此:

mapView.getModel().displayModel.setDefaultUserScaleFactor(3.0f);
于 2017-01-17T01:18:44.913 回答