28 votes

Java : Mise à l'échelle de la carte Mapsforge lors de l'utilisation de tuiles bitmap en ligne au lieu du moteur de rendu hors ligne

J'utilise MapsForge 0.8 pour afficher des cartes dans mon application Android. Lorsque j'utilise des tuiles en ligne (qui ne sont que des bitmaps et non des données vectorielles pouvant être ajustées dans le moteur d'exécution), la carte est vraiment minuscule sur mon appareil haute résolution et je ne peux rien lire.

screenshot

Je voudrais mettre la carte à l'échelle et j'ai essayé ce qui suit :

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

Et :

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

Mais cela ne change rien.
Comment faire pour qu'il affiche la carte plus grande ?

Mise à jour :

Et je ne parle pas de zoomer. Je veux dire mettre à l'échelle le niveau de zoom actuel pour le rendre lisible sur des appareils à haute résolution. Imaginez la capture d'écran ci-dessus sur un petit smartphone : elle 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 la mise à l'échelle des tuiles en ligne qui sont des BITMAPS - et NON de la manière d'influencer le rendu des données vectorielles.

3ème mise à jour

El accepté La réponse a finalement résolu le problème !

3 votes

Veuillez expliquer en quoi, selon vous, "mettre à l'échelle le niveau de zoom actuel" est différent du zoom avant ?

0 votes

Si vous ne le comprenez pas après avoir lu la question, je ne sais pas quoi ajouter.

6voto

Pravin Divraniya Points 2748

Selon ce document documentaion (Lire Spécifier la position ), vous pouvez spécifier la zone à afficher et le niveau de zoom.

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

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

En dehors de cela, j'ai également fait des recherches à ce sujet et j'ai découvert que nous pouvons également définir MapPosition a MapViewPosition comme(Voir ceci enlace ).

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

J'espère que cela vous aidera.

1 votes

Excellente réponse mais pas ce que je cherchais. Voir ma mise à jour, s'il vous plaît.

0 votes

Après votre mise à jour, j'ai compris votre point de vue...... Vous devez mettre à l'échelle les éléments de l'interface utilisateur de la carte pour qu'elle soit lisible tout en conservant le niveau de zoom.

0 votes

Vérifiez ceci enlace . Je pense que c'est similaire à votre question et en amélioration . Vérifiez également ce .

1voto

Mateus Points 1448

Il existe de nombreuses façons de "mettre à l'échelle" dans mapsforge.
Comme on peut le voir dans ce exemple vous pouvez essayer de .zoom() le site mapViewPosition au lieu de mettre directement à l'échelle le modèle.
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 des rues.

Mais si vous parlez de la TEXTE DE L'IU à la place, vous pouvez essayer de le modifier comme ceci :

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

Si la seule taille du texte ne vous suffit pas, vous pouvez essayer de créer un nouveau fichier de type RenderTheme à la place.
L'exemple des docteurs :

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>

0 votes

Si vous utilisez le moteur de rendu - des graphiques vectoriels dont le rendu est effectué au moment de l'exécution - alors oui. Cela fonctionne déjà pour les cartes que j'ai téléchargées. Mais les tuiles en ligne - qui ne sont que des bitmaps - sont déjà telles quelles. Tout ce que je pourrais faire, c'est mettre à l'échelle les tuiles d'image d'une manière ou d'une autre. Mais pas comme vous le décrivez. Merci quand même.

1voto

omid Points 79

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

Rendu du texte : Comment agrandir le texte (étiquettes) ?

La solution à ce problème consiste à utiliser TileRendererLayer.setTextScale(float textScale) :

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

Rendu des symboles/icônes :

Ludwig Brinckmann dit dans deuxième lien :

Il y a pas mal de support pour cela dans la branche Rescue à travers l'utilisation d'images SVG et la mise à l'échelle des tuiles.

C'est cette branche mais je pense qu'il a déjà été intégré au projet. Il semble donc que pour les icônes, il faille utiliser le moteur de rendu SVG qui, selon la norme docs l'échelle automatiquement :

Symboles SVG

Les symboles peuvent être définis soit au format PNG matriciel, soit en tant que graphiques vectoriels au format SVG. au format SVG.

...

Mise à l'échelle SVG

Les ressources SVG peuvent désormais être automatiquement mises à l'échelle pour s'adapter aux différentes résolutions des appareils. résolutions de périphériques.

0 votes

Si vous utilisez le moteur de rendu (graphiques vectoriels dont le rendu est effectué au moment de l'exécution), alors oui. Cela fonctionne déjà pour les cartes que j'ai téléchargées. Mais les tuiles en ligne - qui ne sont que des bitmaps - sont déjà telles quelles. Tout ce que je pourrais faire, c'est mettre à l'échelle les tuiles d'image d'une manière ou d'une autre. Mais pas comme vous le décrivez. Merci quand même.

0voto

Michael Points 20266

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

Cette distinction n'existe pas dans la réalité.

Ce que vous décrivez est essentiellement une texture, et j'utiliserai donc le mot "texture" au lieu de "bitmap".


Quel que soit le niveau de zoom, une quantité donnée de pixels de l'écran est mise en correspondance avec une zone particulière du monde réel, exprimée en mètres. Il s'agit de l'échelle de la carte ou du "niveau de zoom", qui se trouve dans le coin de la carte. Par exemple, 10 pixels = 1 km.

Votre image a une surface qu'elle représente, disons un carré de 1 km de côté à Londres, et une taille en pixels, disons 40x40.

Lorsque le logiciel essaie de dessiner votre texture à l'écran, il doit faire correspondre les pixels de votre texture aux pixels de l'écran. Dans notre exemple, notre niveau de zoom est de 10 pixels = 1km, donc un carré de 1km à l'écran est de 10x10 pixels. Notre texture représente également un carré de 1 km de côté, mais avec plus de pixels (40x40).

Comme ces valeurs sont différentes, nous devons d'une manière ou d'une autre rendre notre texture plus petite. Cela s'appelle filtrage de la texture et peut également être utilisé pour agrandir une texture.

La raison pour laquelle votre texture semble mauvaise sur un appareil à haute résolution est due à la façon dont le filtrage se comporte. Vous pouvez obtenir des résultats acceptables si vous utilisez une sorte d'algorithme de filtrage. mipmap en réduisant le niveau de détail au fur et à mesure que l'utilisateur effectue un zoom arrière. Ce serait analogue à la façon dont Google Maps supprime les étiquettes à mesure que l'on s'éloigne.


Vous ne serez jamais en mesure de voir un niveau de détail élevé à partir d'un niveau de zoom élevé. C'est pourquoi les réponses disant "il suffit de zoomer !" ont techniquement raison.

Si vous augmentez simplement la zone sur laquelle la texture s'applique sans également En mettant la carte à l'échelle (en zoomant), votre texture et la carte sous-jacente seront désynchronisées, ce qui n'est absolument pas souhaitable.

0 votes

Les tuiles en ligne sont une grande image. Et cette image est très bien pour les détails qu'elle contient. Mais par exemple, les textes sont si petits que je ne peux pas les lire sur un téléphone.

0 votes

Oui, utilisez donc une mipmap qui supprime ces détails lorsqu'ils deviennent illisibles.

0 votes

Même si je zoome au maximum et qu'une seule rue est dans ma vue, j'aimerais voir le nom de la rue. C'est une information importante. Mais même dans ce cas, il serait illisible en petit.

0voto

juergen d Points 85039

La taille des tuiles de la vue cartographique est ce qui définit le rendu, tant pour les cartes vectorielles que pour les cartes matricielles.

Nous avons des exemples avec des sources de tuiles matricielles dans l'application d'échantillons Mapsforge, par exemple DownloadLayerViewer. Là, une taille de tuile fixe de 256px est utilisée, car elle est fournie par la source de tuiles :

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

Si vous supprimez cette ligne, la taille des tuiles de la vue cartographique sera calculée automatiquement en fonction du nombre de ppp de l'appareil (comme pour les cartes vectorielles) et les tuiles matricielles apparaîtront donc plus grandes (bien qu'un peu floues).

Source : MapsForge Groupe de développement de Google

En supprimant cette ligne, cela a fonctionné. Auparavant, j'ai essayé de régler la taille des tuiles sur une valeur différente, mais je n'ai jamais essayé de supprimer complètement ce paramètre.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X