java android bitmap scaling mapsforge

Java: Scale Mapsforge Map cuando se utilizan mosaicos de mapas de bits en línea en lugar de un renderizador sin conexión



android bitmap (6)

Utilizo MapsForge 0.8 para mostrar mapas en mi aplicación de Android. Al usar mosaicos en línea (que son solo mapas de bits y no datos vectoriales que se pueden ajustar en el renderizador de tiempo de ejecución), el mapa es realmente pequeño en mi dispositivo de alta resolución y no puedo leer nada.

Me gustaría escalar el mapa y he intentado lo siguiente:

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

Y:

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

Pero eso no cambia nada.
¿Cómo hacerlo mostrar el mapa más grande?

Actualizar:

Y no me refiero a hacer zoom. Me refiero a escalar el nivel de zoom actual para que sea legible en dispositivos de alta resolución. Imagina la captura de pantalla de arriba en un teléfono inteligente pequeño: es pequeño. Ni siquiera puedo leer los nombres de las calles.

2da actualización

Las respuestas actuales a continuación NO responden a la pregunta. Se trata de escalar los mosaicos en línea que son BITMAPS y NO de cómo influir en la representación de los datos vectoriales.

3ra actualización

La respuesta accedida finalmente resolvió el problema.


El tamaño del mosaico de la vista de mapa es lo que define la representación, tanto en mapas vectoriales como rasterizados.

Tenemos ejemplos con fuentes de mosaicos ráster en la aplicación de ejemplos de Mapsforge, por ejemplo, DownloadLayerViewer. Allí se usa un tamaño de mosaico fijo de 256 píxeles, como lo proporciona la fuente de mosaico:

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

Si elimina esa línea, el tamaño del mosaico de la vista del mapa se calculará automáticamente en función de los ppp del dispositivo (como en los mapas vectoriales), por lo que los mosaicos de trama aparecerán más grandes (aunque algo borrosos).

Fuente: MapsForge Google Development Group

Eliminar esta línea lo hizo funcionar. Anteriormente intenté establecer el tamaño del mosaico en un valor diferente, pero nunca intenté eliminar la configuración por completo.


No me refiero a hacer zoom. Me refiero a escalar el nivel de zoom actual para que sea legible en dispositivos de alta resolución.

Esto simplemente no es una distinción que existe en la realidad.

Lo que estás describiendo es básicamente una textura, así que usaré la palabra ''textura'' en lugar de ''mapa de bits''.

En cualquier nivel de zoom, una cantidad determinada de píxeles de la pantalla se asigna a un área particular del mundo real en metros. Esta es la escala de su mapa o "nivel de zoom": la cosa en la esquina de cualquier mapa. Por ejemplo, 10 píxeles = 1km.

Su imagen tiene un área que representa, por ejemplo, un cuadrado de 1 km en Londres, y un tamaño en píxeles, por ejemplo, 40x40.

Cuando el software intenta dibujar su textura en la pantalla, necesita asignar los píxeles de su textura a los píxeles de la pantalla. En nuestro ejemplo, nuestro nivel de zoom es 10 píxeles = 1 km, por lo que un cuadrado de 1 km en la pantalla es 10x10 píxeles. Nuestra textura también representa un cuadrado de 1 km, pero tiene más píxeles (40x40).

Debido a que estos valores son diferentes, necesitamos reducir nuestra textura de alguna manera. Esto se denomina filtrado de texturas y también se puede hacer para agrandar una textura.

La razón por la que su textura se ve mal en un dispositivo de alta resolución se debe a cómo se comporta el filtrado. Es posible que pueda lograr resultados aceptables si utiliza algún tipo de mipmap , lo que reduce el nivel de detalle a medida que el usuario se aleja. Esto sería análogo a la forma en que Google Maps elimina las etiquetas a medida que avanza.

Nunca podrá ver un alto nivel de detalle desde un alto nivel de zoom. Es por eso que la respuesta que dice "solo haz zoom in!" Son técnicamente correctos.

Si simplemente aumenta el área a la que se aplica la textura sin escalar (acercar) el mapa por igual , su textura y el mapa subyacente se desincronizarán y eso definitivamente no es deseable.


Busqué y encontré este enlace y este problema (Soporte de imágenes dependientes de la resolución en temas de render) sobre el problema de la ilegibilidad en dispositivos de alta resolución. Parece que hay dos preocupaciones aquí:

Representación del texto: ¿Cómo agrandar el texto (etiquetas)?

La solución para este problema es usar TileRendererLayer.setTextScale(float textScale) :

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

Representación de símbolos / iconos:

Ludwig Brinckmann dice en el segundo enlace :

Hay bastante apoyo para esto en la rama de Rescue mediante el uso de imágenes SVG y la escala de mosaico.

Esta es esa rama pero creo que ya está fusionada con el proyecto. Así que parece que para los iconos, necesita usar el renderizador SVG que, según los RenderTheme , se escala automáticamente:

Símbolos SVG

Los símbolos se pueden definir en el formato PNG ráster o como gráficos vectoriales en formato SVG.

...

SVG escalado

Los recursos SVG ahora se pueden escalar automáticamente para adaptarse a diferentes resoluciones de dispositivos.


Hay muchas formas de ''escalar'' en mapsforge.
Como se muestra en este example , puede intentar .zoom() mapViewPosition lugar de escalar el modelo directamente.
Si eso es lo que estás pidiendo, prueba lo siguiente:

Código:

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

Ni siquiera puedo leer los nombres de las calles.

Pero si está hablando sobre el TEXTO UI , puede intentar cambiarlo así:

mapView.setTextScale(XX); // Again, number goes here

Si solo el tamaño del texto no es suficiente para usted, puede intentar crear un nuevo RenderTheme en RenderTheme lugar.
Ejemplo de documentos:

Código:

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>


JUST ........ ZOOM ......... IN !!!!!!!!! Además, intenta configurar esto:

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

a esto:

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


Según esta documentaion , (Lea la sección Especificar la posición ) puede especificar el área a mostrar y en qué nivel de zoom.

this.mapView.setCenter(new LatLong(52.517037, 13.38886)); this.mapView.setZoomLevel((byte) 12);

La solución anterior funcionará como se proporciona en la documentación oficial.

Aparte de esto, también he buscado sobre esto y descubro que también podemos establecer MapPosition en MapViewPosition como (Ver este link ).

MapPosition mapPosition1 = new MapPosition(new LatLong(52.517037, 13.38886), (byte) 12); this.mapView.getModel().mapViewPosition.setMapPosition(mapPosition1);

Espero que esto te ayudará.