Java:使用在线位图图块而不是离线渲染器时缩放Mapsforge Map

时间:2017-01-14 20:31:25

标签: java android bitmap scaling mapsforge

我使用MapsForge 0.8在我的Android应用中显示地图。使用在线图块(只是位图而不是可以在运行时渲染器中调整的矢量数据)时,我的Hi分辨率设备上的地图非常小,我无法读取任何内容。

screenshot

我想缩放地图,我尝试了以下内容:

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

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

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

更新

我并不是指放大。我的意思是缩放当前的缩放级别,使其在高分辨率设备上可读。想象一下在一个小型智能手机上面的截图 - 它很小。我甚至无法阅读街道名称。

第二次更新

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

第3次更新

加入的答案终于解决了这个问题。

6 个答案:

答案 0 :(得分:6)

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

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

以上解决方案将在官方文档中提供。

除此之外,我还搜索了这一点,并发现我们也可以将MapPosition设置为MapViewPosition(请参阅此link)。

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

希望这会对你有所帮助。

答案 1 :(得分:1)

有很多方法可以缩放'在mapsforge中。
如本example所示,您可以尝试.zoom() mapViewPosition而不是直接缩放模型。
如果这就是你和#39;请求,尝试以下方法:

<强>代码:

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
文档&#39;例如:

<强>代码:

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>

答案 2 :(得分:1)

我搜索了this linkthis issue (Support resolution-dependent images in render-themes),了解高分辨率设备中的不可读性问题。这似乎有两个问题:

文字渲染:如何让文字(标签)更大?

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

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

符号/图标渲染:

Ludwig Brinckmannsecond link中说:

  

在Rescue分支中有相当多的支持   使用SVG图像和平铺缩放。

这是that branch,但我认为它已经合并到了该项目中。所以对于图标来说,你需要使用SVG渲染器,根据docs,自动缩放:

  

SVG符号

     

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

     

...

     

SVG Scaling

     

现在可以自动调整SVG资源以适应不同的情况   设备分辨率。

答案 3 :(得分:0)

  

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

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

你所描述的基本上是一种纹理,所以我会使用“纹理”这个词。而不是&#39;位图&#39;。

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

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

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

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

在高分辨率设备上纹理看起来很糟糕的原因取决于过滤的行为方式。如果使用某种mipmap,则可能会获得可接受的结果,从而在用户缩小时降低细节级别。这类似于Google地图在您进一步退出时删除标签的方式。

您将永远无法从高变焦级别看到高水平的细节。这就是为什么答案说&#34;只是放大!&#34;在技​​术上是正确的。

如果你只是增加纹理适用的区域而不用同等缩放(缩放)地图,你的纹理和底层地图将会失去同步,这绝对不可取。< / p>

答案 4 :(得分:0)

  

地图视图切片大小是在矢量和栅格地图中定义渲染的内容。

     

我们在Mapsforge示例应用中提供了栅格切片源的示例,例如: DownloadLayerViewer。使用固定的平铺大小256px,因为它由平铺源提供:

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

如果删除该行,则会根据设备dpi(如矢量地图)自动计算地图视图图块大小,因此栅格图块会显得更大(虽然有点模糊)。

Source: MapsForge Google Development Group

删除此行使其正常工作。以前我尝试将磁贴大小设置为其他值,但从未尝试完全删除该设置。

答案 5 :(得分:-4)

只是........ ZOOM ......... IN !!!!!!!!! 另外,请尝试设置:

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

到此:

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