Java: Scale Mapsforge Map lors de l'utilisation de tuiles bitmap en ligne au lieu de renderer hors ligne

j'utilise MapsForge 0.8 pour afficher des cartes dans mon application Android. Lors de l'utilisation de tuiles en ligne (qui ne sont que des bitmaps et non des données vectorielles qui peuvent être ajustées dans le renderer runtime), la carte est vraiment minuscule sur mon appareil Hi-résolution et je ne peux rien lire.

screenshot

je voudrais escalader la carte et j'ai essayé ce qui suit:

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

Et:

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

Mais il ne change pas quoi.

comment agrandir la carte?

mise à Jour:

<!-Et je ne veux pas dire zoomer. Je veux dire mettre à l'échelle le niveau de zoom actuel pour le rendre lisible sur les appareils à haute résolution. Imaginez la capture d'écran ci-dessus sur un petit smartphone, c'est minuscule. Je ne peux même pas lire les noms de rue.

2ème mise à Jour

les réponses actuelles ci-dessous ne répondent pas à la question. Il s'agit de mettre à l'échelle des tuiles en ligne qui sont des BITMAPS - et pas comment influencer le rendu des données vectorielles.

3ème mise à Jour

la réponse acceptée a finalement résolu le problème.

28
demandé sur juergen d 2017-01-14 23:31:24

6 réponses

ce documentaion,(Lire spécifier la Position section), vous pouvez spécifier la zone à afficher et à quel niveau de zoom.

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

la solution ci-dessus fonctionnera comme elle est fournie dans la documentation officielle.

en dehors de cela, j'ai également cherché à ce sujet et découvrir que nous pouvons aussi définir MapppositionMapViewPosition (Voir lien).

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

J'espère que va vous aider.

6
répondu Pravin Divraniya 2017-01-17 10:45:40

il y a beaucoup de façons de "passer à l'échelle" dans mapsforge.

comme il est montré dans ce exemple, vous pouvez essayer d' .zoom()mapViewPosition au lieu de mettre le modèle à l'échelle directement.

Si c'est ce que vous demandez, essayez ce qui suit:

Code:

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

je ne peux même pas lire les noms de rue.

mais si vous parlez de TEXTE DE L'UI à la place, vous pouvez essayer de modifier comme ceci:

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

si seulement la taille du texte ne vous suffit pas, vous pouvez essayer de créer un nouveau RenderTheme à la place.

Exemple De Docs:

Code:

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>
1
répondu Mateus 2017-01-17 12:40:29

j'ai cherché et trouvé ce lien et ce problème (Support dépendant de la résolution des images de rendu-thèmes) sur le problème de l'illisibilité dans les appareils à haute résolution. Il semble qu'il y ait ici deux préoccupations:

rendu de Texte: comment agrandir le texte (étiquettes)?

Solution pour ce problème est d'utiliser TileRendererLayer.setTextScale(float textScale):

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

Rendu Des Symboles/Icônes:

Ludwig Brinckmann dit deuxième lien:

il y a beaucoup de soutien pour cela dans la branche de sauvetage l'utilisation des images SVG et de la mise à l'échelle des tuiles.

C'est branche mais je pense qu'il a déjà fusionné avec le projet. Il semble donc que pour les icônes, vous devez utiliser SVG renderer qui selon docs, à l'échelle automatiquement:

symboles SVG

les symboles peuvent être soit définis dans le format matriciel PNG ou comme vecteur graphiques au format SVG.

...

SVG mise à l'Échelle

les ressources SVG peuvent maintenant être ajustées automatiquement pour s'adapter à différentes résolutions de périphérique.

1
répondu Omid 2017-01-17 14:45:18

Je ne veux pas dire zoomer. Je veux dire mettre à l'échelle le niveau de zoom actuel pour faire lisible sur les appareils à haute résolution.

Ce n'est tout simplement pas une distinction qui existe dans la réalité.

Ce que vous décrivez est fondamentalement une texture, donc je vais utiliser le mot "texture" au lieu de' bitmap'.


à n'importe quel niveau de zoom, une quantité définie de pixels d'écran est mappée à une zone du monde réel en mètres. C'est votre échelle de carte ou "niveau de zoom" - la chose dans le coin de n'importe quelle carte. Par exemple, 10 pixels = 1km.

votre image a une zone qu'elle représente, disons 1km carré à Londres, et une taille en pixels, disons 40x40.

lorsque le logiciel essaie de dessiner votre texture à l'écran, il a besoin de mapper les pixels de votre texture à l'écran. Dans notre exemple, notre niveau de zoom est de 10 pixels = 1km, donc un carré de 1km sur l'écran est de 10x10 pixels. Notre texture représente également un carré de 1km mais a plus de pixels (40x40).

parce que ces valeurs sont différentes, nous avons besoin de rendre notre texture plus petite. Ceci est appelé filtrage de texture, et peut aussi être fait pour faire une texture plus grande.

la raison pour laquelle votre texture semble Mauvaise sur un périphérique haute résolution est due à la façon dont le filtrage se comporte. Vous pourriez obtenir des résultats acceptables si vous utilisez une sorte de mappage, réduisant le niveau de détail au fur et à mesure que l'utilisateur zoome. Ce serait soyez analogue à la façon dont Google maps supprime les étiquettes que vous obtenez plus loin.


Vous ne pourrez jamais voir un niveau de détail élevé à partir d'un niveau de zoom élevé. C'est pourquoi la réponse en disant: "zoomer!"techniquement droit.

Si vous augmentez simplement la zone de la texture s'applique sans également mise à l'échelle (zoomage) la carte, votre texture et la carte sous-jacente seront hors de synchronisation et ce n'est certainement pas souhaitable.

0
répondu Michael 2017-05-17 10:21:09

vue de la carte la taille des carreaux est ce qui définit le rendu, à la fois dans les cartes vectorielles et matricielles.

nous avons des exemples avec des sources de tuiles matricielles dans L'application Mapsforge samples, par exemple DownloadLayerViewer. Une taille de tuile fixe de 256px est utilisée, comme cela est fourni par la source de tuile:

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

si vous supprimez cette ligne, alors la taille de la tuile de vue de carte sera auto-calculée sur la base du périphérique dpi (comme dans les cartes vectorielles) et donc les tuiles matricielles apparaîtraient plus grand (bien qu'un peu floue).

Source: MapsForge Google Development Group

la suppression de cette ligne l'a fait fonctionner. auparavant, j'ai essayé de définir la taille de la tuile à une valeur différente, mais je n'ai jamais essayé de supprimer complètement ce paramètre.

0
répondu juergen d 2017-12-01 17:53:02

juste........ZOOM......... DANS!!!!!!!!! Aussi, essayez d'ajuster ceci:

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

à:

mapView.getModel().displayModel.setDefaultUserScaleFactor(3.0f);
-4
répondu Iguanodon_Bubbles7777777 2017-01-17 01:40:34