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);
但是没有任何改变。
如何让它显示更大的地图?
更新:
我的意思不是放大。我的意思是缩放当前缩放级别以使其在高分辨率设备上可读。在小型智能手机上想象一下上面的屏幕截图 - 它很小。我什至看不懂街道名称。
第二次更新
下面的当前答案没有回答问题。这是关于缩放 BITMAPS 的在线图块 - 而不是如何影响矢量数据的渲染。
第三次更新
采纳回答终于解决问题了!
只是........放大............放大!!!!!!!!
另外,尝试设置这个:
mapView.getModel().displayModel.setDefaultUserScaleFactor(2.0f);
对此:
mapView.getModel().displayModel.setDefaultUserScaleFactor(3.0f);
根据此 documentaion,(阅读 指定位置 部分)您可以指定要显示的区域和缩放级别。
this.mapView.setCenter(new LatLong(52.517037, 13.38886));
this.mapView.setZoomLevel((byte) 12);
以上解决方案将按照官方文档中提供的方式运行。
除此之外,我还搜索了这方面的内容,发现我们还可以设置 MapPosition to MapViewPosition like(See this link)。
MapPosition mapPosition1 = new MapPosition(new LatLong(52.517037, 13.38886), (byte) 12);
this.mapView.getModel().mapViewPosition.setMapPosition(mapPosition1);
希望对您有所帮助。
mapsforge中有很多'scaling'的方法。
如本example所示,您可以尝试.zoom()
[=15] =] 而不是直接缩放模型。
如果那是您要求的,请尝试以下操作:
代码:
MapViewPosition mapViewPosition = mapView.getModel().mapViewPosition;
mapViewPosition.zoom((byte) XX); // Change it to a number (i.g. "(byte) 3")
I can't even read the street names.
但是如果你谈论的是 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>
我搜索并发现 this link and this issue (Support resolution-dependent images in render-themes) 关于高分辨率设备中的不可读问题。这里似乎有两个问题:
文本渲染:如何使文本(标签)变大?
这个问题的解决方案是使用 TileRendererLayer.setTextScale(float textScale)
:
TileRendererLayer tileRendererLayer = new TileRendererLayer(...);
mapView.getLayerManager().getLayers().add(tileRendererLayer);
tileRendererLayer.setTextScale(...)
Symbols/Icons 渲染:
Ludwig Brinckmann says in second link:
There is quite a bit of support for this in the Rescue branch through
the use of SVG images and tile scaling.
这是that branch but I think it's already merged to the project. So it seems for icons, you need to use SVG renderer which according to docs,自动缩放:
SVG Symbols
Symbols can be either defined in the raster PNG format or as vector
graphics in SVG format.
...
SVG Scaling
SVG resources can now be automatically scaled to accommodate different
device resolutions.
I don't mean zooming in. I mean scaling the current zoom level to make
it readable on high-resolution devices.
这不是现实中存在的区别。
你描述的基本上是纹理,所以我会用'texture'这个词而不是'bitmap'。
在任何缩放级别,一定数量的屏幕像素会映射到以米为单位的特定真实世界区域。这是您的地图比例或 "zoom level" - 任何地图角落的东西。比如10个像素=1km.
你的图片有一个它代表的区域,比如伦敦的 1 平方公里,以及一个以像素为单位的大小,比如 40x40。
当软件尝试将您的纹理绘制到屏幕时,它需要将您的纹理像素映射到屏幕像素。在我们的示例中,我们的缩放级别是 10 像素 = 1km,因此屏幕上 1km 的正方形是 10x10 像素。我们的纹理也表示一个 1km 的正方形,但具有更多像素 (40x40)。
因为这些值不同,我们需要以某种方式使我们的纹理变小。这叫做texture filtering,也可以用来使纹理变大。
您的纹理在高分辨率设备上看起来很糟糕的原因在于过滤的行为方式。如果您使用某种 mipmap,可以在用户缩小时降低细节级别,从而获得可接受的结果。这类似于 Google 地图如何在您走得更远时删除标签。
您永远无法从高缩放级别看到高级别的细节。这就是为什么说 "just zoom in!" 的答案在技术上是正确的。
如果您只是增加纹理应用的区域而没有同样 缩放(缩放)地图,您的纹理和底层地图将不同步,这绝对是不可取的。
Map view tile size is what defines the rendering, both in vector and raster maps.
We have examples with raster tile sources in Mapsforge samples app, e.g. DownloadLayerViewer. There a fixed tile size 256px is used, as that is provided by the tile source:
this.mapView.getModel().displayModel.setFixedTileSize(256);
If you remove that line, then the map view tile size will be auto-calculated based on device dpi (like in vector maps) and so the raster tiles would appear bigger (though a bit blurry).
Source: MapsForge Google Development Group
删除此行使其生效。 以前我尝试将图块大小设置为不同的值,但从未尝试完全删除该设置。
我使用 MapsForge 0.8 在我的 Android 应用程序中显示地图。使用在线图块(只是位图,而不是可以在运行时渲染器中调整的矢量数据)时,地图在我的高分辨率设备上非常小,我什么都看不到。
我想缩放地图并尝试了以下方法:
mapView.getModel().displayModel.setDefaultUserScaleFactor(2.0f);
并且:
mapView.getModel().displayModel.setUserScaleFactor(2.0f);
但是没有任何改变。
如何让它显示更大的地图?
更新:
我的意思不是放大。我的意思是缩放当前缩放级别以使其在高分辨率设备上可读。在小型智能手机上想象一下上面的屏幕截图 - 它很小。我什至看不懂街道名称。
第二次更新
下面的当前答案没有回答问题。这是关于缩放 BITMAPS 的在线图块 - 而不是如何影响矢量数据的渲染。
第三次更新
采纳回答终于解决问题了!
只是........放大............放大!!!!!!!! 另外,尝试设置这个:
mapView.getModel().displayModel.setDefaultUserScaleFactor(2.0f);
对此:
mapView.getModel().displayModel.setDefaultUserScaleFactor(3.0f);
根据此 documentaion,(阅读 指定位置 部分)您可以指定要显示的区域和缩放级别。
this.mapView.setCenter(new LatLong(52.517037, 13.38886));
this.mapView.setZoomLevel((byte) 12);
以上解决方案将按照官方文档中提供的方式运行。
除此之外,我还搜索了这方面的内容,发现我们还可以设置 MapPosition to MapViewPosition like(See this link)。
MapPosition mapPosition1 = new MapPosition(new LatLong(52.517037, 13.38886), (byte) 12);
this.mapView.getModel().mapViewPosition.setMapPosition(mapPosition1);
希望对您有所帮助。
mapsforge中有很多'scaling'的方法。
如本example所示,您可以尝试.zoom()
[=15] =] 而不是直接缩放模型。
如果那是您要求的,请尝试以下操作:
代码:
MapViewPosition mapViewPosition = mapView.getModel().mapViewPosition;
mapViewPosition.zoom((byte) XX); // Change it to a number (i.g. "(byte) 3")
I can't even read the street names.
但是如果你谈论的是 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>
我搜索并发现 this link and this issue (Support resolution-dependent images in render-themes) 关于高分辨率设备中的不可读问题。这里似乎有两个问题:
文本渲染:如何使文本(标签)变大?
这个问题的解决方案是使用 TileRendererLayer.setTextScale(float textScale)
:
TileRendererLayer tileRendererLayer = new TileRendererLayer(...);
mapView.getLayerManager().getLayers().add(tileRendererLayer);
tileRendererLayer.setTextScale(...)
Symbols/Icons 渲染:
Ludwig Brinckmann says in second link:
There is quite a bit of support for this in the Rescue branch through the use of SVG images and tile scaling.
这是that branch but I think it's already merged to the project. So it seems for icons, you need to use SVG renderer which according to docs,自动缩放:
SVG Symbols
Symbols can be either defined in the raster PNG format or as vector graphics in SVG format.
...
SVG Scaling
SVG resources can now be automatically scaled to accommodate different device resolutions.
I don't mean zooming in. I mean scaling the current zoom level to make it readable on high-resolution devices.
这不是现实中存在的区别。
你描述的基本上是纹理,所以我会用'texture'这个词而不是'bitmap'。
在任何缩放级别,一定数量的屏幕像素会映射到以米为单位的特定真实世界区域。这是您的地图比例或 "zoom level" - 任何地图角落的东西。比如10个像素=1km.
你的图片有一个它代表的区域,比如伦敦的 1 平方公里,以及一个以像素为单位的大小,比如 40x40。
当软件尝试将您的纹理绘制到屏幕时,它需要将您的纹理像素映射到屏幕像素。在我们的示例中,我们的缩放级别是 10 像素 = 1km,因此屏幕上 1km 的正方形是 10x10 像素。我们的纹理也表示一个 1km 的正方形,但具有更多像素 (40x40)。
因为这些值不同,我们需要以某种方式使我们的纹理变小。这叫做texture filtering,也可以用来使纹理变大。
您的纹理在高分辨率设备上看起来很糟糕的原因在于过滤的行为方式。如果您使用某种 mipmap,可以在用户缩小时降低细节级别,从而获得可接受的结果。这类似于 Google 地图如何在您走得更远时删除标签。
您永远无法从高缩放级别看到高级别的细节。这就是为什么说 "just zoom in!" 的答案在技术上是正确的。
如果您只是增加纹理应用的区域而没有同样 缩放(缩放)地图,您的纹理和底层地图将不同步,这绝对是不可取的。
Map view tile size is what defines the rendering, both in vector and raster maps.
We have examples with raster tile sources in Mapsforge samples app, e.g. DownloadLayerViewer. There a fixed tile size 256px is used, as that is provided by the tile source:
this.mapView.getModel().displayModel.setFixedTileSize(256);
If you remove that line, then the map view tile size will be auto-calculated based on device dpi (like in vector maps) and so the raster tiles would appear bigger (though a bit blurry).
Source: MapsForge Google Development Group
删除此行使其生效。 以前我尝试将图块大小设置为不同的值,但从未尝试完全删除该设置。