Подтвердить что ты не робот

Java: масштабирование карты Mapsforge при использовании онлайн-растровых изображений вместо автономного рендеринга

Я использую MapsForge 0.8 для отображения карт в своем приложении для Android. При использовании онлайн-фрагментов (которые являются только растровыми изображениями, а не векторными данными, которые могут быть скорректированы в средстве рендеринга времени выполнения), карта действительно очень маленькая на моем устройстве с высоким разрешением, и я ничего не могу прочитать.

screenshot

Я хотел бы масштабировать карту, и я попробовал следующее:

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

и

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

Но это ничего не меняет.
Как сделать отображение карты больше?

Update:

И я не имею в виду масштабирование. Я имею в виду масштабирование текущего уровня масштабирования, чтобы сделать его доступным для чтения на устройствах с высоким разрешением. Представьте себе скриншот выше на маленьком смартфоне - он крошечный. Я даже не могу прочитать названия улиц.

Второе обновление

Текущие ответы ниже НЕ отвечают на вопрос. Речь идет о масштабировании онлайн-плит, которые являются BITMAPS, и НЕ как влиять на рендеринг векторных данных.

3-е обновление

Полученный ответ, наконец, решил проблему.

4b9b3361

Ответ 1

Размер фрагмента карты - это то, что определяет рендеринг, как в векторных, так и растровых картах.

У нас есть примеры с источниками растровой плитки в приложении образцов Картфорда, например. DownloadLayerViewer. Там используется фиксированный размер плитки 256 пикселей, так как это обеспечивается источником плитки:

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

Если вы удалите эту строку, размер фрагмента карты будет автоматически рассчитан на основе dpi (как в векторных картах), и поэтому растровые фрагменты будут больше (хотя и немного размыты).

Источник: MapsForge Google Development Group

Удаление этой строки заставило ее работать. Раньше я пытался установить размер плитки на другое значение, но никогда не пытался полностью удалить этот параметр.

Ответ 2

В соответствии с этим documentaion, (прочтите Задание позиции), вы можете указать область для отображения и уровня масштабирования.

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

Надеюсь, это поможет вам.

Ответ 3

В mapsforge существует множество способов "масштабирования".
Как показано в этом example, вы можно попробовать .zoom() mapViewPosition вместо масштабирования модели напрямую.
Если это то, о чем вы просите, попробуйте следующее:

Код:

MapViewPosition mapViewPosition = mapView.getModel().mapViewPosition; 
mapViewPosition.zoom((byte) XX); // Change it to a number (i.g. "(byte) 3")

Я даже не могу прочитать названия улиц.

Но если вы говорите об ТЕКСТ UI, вы можете попытаться изменить его следующим образом:

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>

Ответ 4

Я искал и нашел эту ссылку и эту проблему (поддержка зависящие от разрешения изображения в областях рендеринга) о проблеме нечитаемости в устройствах с высоким разрешением. Кажется, здесь есть две проблемы:

Текстовый рендеринг: Как сделать текст (метки) больше?

Решение этой проблемы заключается в использовании TileRendererLayer.setTextScale(float textScale):

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

Символы/Иконки Рендеринг:

Людвиг Бринкманн говорит в вторая ссылка:

В филиале Rescue существует небольшая поддержка использование изображений SVG и масштабирование плитки.

Это эта ветка, но я думаю, что она уже слилась с проектом. Итак, для значков вам нужно использовать SVG-рендеринг, который, согласно docs, автоматически масштабируется:

Символы SVG

Символы могут быть либо определены в растровом формате PNG, либо как вектор графики в формате SVG.

...

Масштабирование SVG

Ресурсы SVG теперь могут автоматически масштабироваться для устройства.

Ответ 5

Я не имею в виду масштабирование. Я имею в виду масштабирование текущего уровня масштабирования, чтобы сделать он читается на устройствах с высоким разрешением.

Это просто не различие, существующее на самом деле.

То, что вы описываете, в основном представляет собой текстуру, поэтому вместо "растрового изображения" я буду использовать слово "текстура".


При любом уровне масштабирования заданное количество пикселей экрана отображается в определенную область реального мира в метрах. Это ваш масштаб карты или "уровень масштабирования" - вещь в углу любой карты. Например, 10 пикселей = 1 км.

У вашего изображения есть область, которую он представляет, скажем, площадь в 1 км в Лондоне и размер в пикселях, скажем, 40х40.

Когда программное обеспечение пытается нарисовать вашу текстуру на экране, ему необходимо сопоставить пиксели вашей текстуры с пикселями экрана. В нашем примере наш уровень масштабирования составляет 10 пикселей = 1 км, поэтому квадрат размером 1 км на экране составляет 10х10 пикселей. Наша текстура также представляет квадрат 1 км, но имеет больше пикселей (40x40).

Поскольку эти значения разные, нам нужно как-то уменьшить нашу текстуру. Это называется фильтрация текстур, а также может быть сделано для большей текстуры.

Причина, по которой ваша текстура выглядит плохо на устройстве с высоким разрешением, зависит от того, как работает фильтрация. Вы можете достичь приемлемых результатов, если используете mipmap, уменьшая уровень детализации при масштабировании пользователя. Это будет аналогично тому, как карты Google удаляют ярлыки по мере того, как вы продвигаетесь дальше.


Вы никогда не сможете увидеть высокий уровень детализации с высоким уровнем масштабирования. Вот почему ответ, говорящий "просто увеличьте!" технически правы.

Если вы просто увеличиваете область, к которой применяется текстура, без масштабирования (масштабирования) карты, ваша текстура и базовая карта выйдут из синхронизации и это определенно не желательно.

Ответ 6

JUST........ ZOOM......... IN!!!!!!!!! Также попробуйте установить это:

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

:

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