簡體   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