我使用MapsForge 0.8在我的Android应用中显示地图。使用在线图块(只是位图而不是可以在运行时渲染器中调整的矢量数据)时,我的Hi分辨率设备上的地图非常小,我无法读取任何内容。
我想缩放地图,我尝试了以下内容:
mapView.getModel().displayModel.setDefaultUserScaleFactor(2.0f);
和
mapView.getModel().displayModel.setUserScaleFactor(2.0f);
但它没有改变任何东西。
如何让它更大地显示地图?
更新
我并不是指放大。我的意思是缩放当前的缩放级别,使其在高分辨率设备上可读。想象一下在一个小型智能手机上面的截图 - 它很小。我甚至无法阅读街道名称。
答案 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 link和this issue (Support resolution-dependent images in render-themes),了解高分辨率设备中的不可读性问题。这似乎有两个问题:
文字渲染:如何让文字(标签)更大?
此问题的解决方法是使用TileRendererLayer.setTextScale(float textScale)
:
TileRendererLayer tileRendererLayer = new TileRendererLayer(...);
mapView.getLayerManager().getLayers().add(tileRendererLayer);
tileRendererLayer.setTextScale(...)
符号/图标渲染:
Ludwig Brinckmann在second 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);