繁体   English   中英

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

[英]Java: Scale Mapsforge Map when using online bitmap tiles instead of offline renderer

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

截屏

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

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

和:

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

但它不会改变任何东西。
如何让它显示更大的地图?

更新:

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

第二次更新

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

第三次更新

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

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

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);

希望这会帮助你。

在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>

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

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

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

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

符号/图标渲染:

Ludwig Brinckmann第二个链接中说:

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

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

SVG 符号

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

...

SVG 缩放

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

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

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

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


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

您的图像有一个区域,例如伦敦的 1 平方公里,以及以像素为单位的大小,例如 40x40。

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

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

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


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

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

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

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

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

如果您删除那条线,那么地图视图图块大小将根据设备 dpi 自动计算(如在矢量地图中),因此光栅图块会显得更大(虽然有点模糊)。

来源:MapsForge 谷歌开发组

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

只是……放大……放大!!!!!!!!! 另外,尝试设置:

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

对此:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM