Intereting Posts
Android: как получить информацию о местоположении из унаследованных комплектов при использовании LocationManager.requestLocationUpdates () Динамически добавлять текстовые элементы в linearLayout Как измерить и улучшить использование батареи в iPhone / iPad (Android также) Замаскированный вход не работает в мобильных телефонах Android? См. Изменения в источниках библиотеки поддержки Android между двумя версиями Как сделать углы кнопки круглыми? Ошибка HoloEverywhere: путь сборки содержит дубликат записи src Google Play Store: вам нужно исправить значок с высоким разрешением. Это не действительное изображение Android: первый всплывающий диалог запуска Firebase Android: произошла внутренняя ошибка. Должен ли доступ к SharedPreferences делать из потока пользовательского интерфейса? Каков правильный способ импорта проекта Android Studio в репозиторий SVN? Android – Как проверить Profard obfuscation? Кордова: Возможно ли иметь разные идентификаторы приложений для платформ android и ios? Приложение, использующее плагин Parse Unity, сбой на устройстве Android, но отлично работает в редакторе

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

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

Скриншот

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

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

А также:

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

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

Обновить:

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

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

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

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

В соответствии с этой документацией (Read Specifying the Position section) вы можете указать область для отображения и на каком уровне масштабирования.

 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 (ig "(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(...) 

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

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

В этой области поддержки довольно много, благодаря использованию SVG-изображений и масштабирования плитки.

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

Символы SVG

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

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

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

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

Это просто не отличие, существующее в действительности.

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


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

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

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

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

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


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

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

ТОЛЬКО …….. ZOOM ……… IN !!!!!!!!! Также попробуйте установить это:

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

к этому:

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