PC SOFT

PROFESSIONAL NEWSGROUPS
WINDEVWEBDEV and WINDEV Mobile

Home → WINDEV Mobile 2024 → OpenStreepMaps dans Android (Leaflet?)
OpenStreepMaps dans Android (Leaflet?)
Started by François SCHAAL, Jul., 17 2018 5:15 PM - 34 replies
Registered member
1,603 messages
Popularité : +64 (70 votes)
Posted on July, 17 2018 - 5:15 PM
Bonjour,

Quelqu'un a t'il déjà intégré une carte OpenStreepMaps dans Android éventuellement avec la librairie Leaflet ?

Faut-il passer par un champ HTML ?

Mes premiers essais sur l'émulateur ne sont guère concluants...

--
Cordialement
François

http://intra.fr http://intrasoftware.fr
Registered member
179 messages
Popularité : +17 (17 votes)
Posted on July, 18 2018 - 9:23 AM
Bonjour François,

la démarche est correcte, utiliser Leaflet fonctionne sous Android et iOS.

Ensuite il faut affecter dans l'initialisation du champ HTML ce code (exemple, à adapter selon le besoin) :

<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">

<link rel="stylesheet" href="https://unpkg.com/leaflet@1.2.0/dist/leaflet.css" integrity="sha512-M2wvCLH6DSRazYeZRIm1JnYyh22purTM+FDB5CsyxtQJYeKq83arPe5wgbNmcFXGqiSH2XR8dT/fJISVA1r/zQ==" crossorigin=""/>
<script src="https://unpkg.com/leaflet@1.2.0/dist/leaflet.js" integrity="sha512-lInM/apFSqyy1o6s89K4iQUKg6ppXEgsVxT35HbzUupEVRh2Eu9Wdl4tHj7dZO0s1uvplcYGmt3498TtHq+log==" crossorigin=""></script>

<style>body { padding: 0; margin: 0; } html, body, #mapid { height: 100%; width: 100vw; }</style>

<div id="mapid"></div>
<script>


var redIcon = L.icon({
iconUrl: 'https://www.openstreetmap.org/assets/marker-red-172ef4ff60a0826f89e4acde3df7bef3087ad15c71ab545337828d9ad57be162.png',
iconSize: [24, 41], // size of the icon
shadowSize: [41, 41], // size of the shadow
iconAnchor: [12, 41], // point of the icon which will correspond to marker's location
shadowAnchor: [14, 41], // the same for the shadow
popupAnchor: [0, -41] // point from which the popup should open relative to the iconAnchor
});



var mymap = L.map('mapid').setView([46.44493, 6.97472], 11);
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
maxZoom: 19,
attribution: '© <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>'
}).addTo(mymap);



L.marker([46.44493, 6.97472], {icon: redIcon, zIndexOffset: 0}).addTo(mymap)
.bindPopup("Sommet de la Dent de Jaman");

var popup = L.popup();
function onMapClick(e) {
popup
.setLatLng(e.latlng)
.setContent(e.latlng.toString())
.openOn(mymap);

}
mymap.on('click', onMapClick);
</script>


Et ça fonctionne ! ;)
Registered member
1,603 messages
Popularité : +64 (70 votes)
Posted on July, 18 2018 - 10:14 AM
Bonjour Jérôme,

Merci pour ton code que je vais tester.

J'ai solutionné ce matin mon souci par l'affectation au champ HTML de l'URL paramétrée d'une page AWP en HTML 5 qui va afficher ma carte OpenStreepMaps avec Leaflet et pour mon besoin avec un marqueur : cela fonctionne aussi :)

C'est peut-être ensuite moins compliqué pour les codes Javascript - je n'ai pas encore approfondi la question mais je pense que son intégration dans WM n'est certainement pas évidente.

L'objectif à terme est de désengager des cartes Google Maps. Google m'a demandé les coordonnées de ma carte bancaire et je n'arrive pas encore (depuis hier) à utiliser le champ carte dans WM.

Excellents développements "libres"...

--
Cordialement
François

http://intra.fr http://intrasoftware.fr
Registered member
2,566 messages
Popularité : +222 (260 votes)
Posted on July, 18 2018 - 10:47 AM
Bonjour,

Je n'ai pas encore fait les tests, mais je vais me pencher sur ce problème d'ici peu. Je veux moi aussi sortir du giron de Google et OSM me semble un bon compromis avec Leaflet.

Il faut aussi que je vois comment héberger les cartes OSM et les mettre à jour régulièrement pour être complètement indépendant.

Je cherche aussi à enregistrer une partie de carte sur le mobile pour pouvoir fonctionner en déconnecté. Je ne sais pas si c'est possible avec OSM, à voir !!!

--
Cordialement,

Philippe SAINT-BERTIN
Registered member
179 messages
Popularité : +17 (17 votes)
Posted on July, 19 2018 - 11:55 AM
@François
J'utilises sous iOS et Android des marqueurs, cercles, polygones et polylignes. Tout fonctionne très bien et l'avantage est d'avoir le même rendu sous des OS différents. Ce n'est pas si compliqué une fois ce premier test réussi, ça prend juste un peu de temps pour bien mettre en place ce que l'on veut.

Oui je trouve aussi que c'est un projet libre incroyable, j'encourage toujours les personnes à y contribuer (même ceux qui n'ont aucunes connaissances techniques particulières) avec des App mobiles comme StreetComplete (https://play.google.com/store/apps/details…).

@Philippe
Un très bon site pour débuter avec l'hébergement de ses propres tuiles est celui-ci : https://switch2osm.org/fr/

Le fonctionnement en déconnecté est possible en mobile avec OSM (OsmAnd le fait très bien), maintenant comment le faire est une autre question ! ;)
Registered member
2,566 messages
Popularité : +222 (260 votes)
Posted on July, 19 2018 - 12:45 PM
@Jérôme: J'ai lu ce site un peu ça ce matin mais je dois avouer que ça m'intéresse fortement. Il faut que je fasse ça entre 2 projets, c'est pas toujours simple.

On se tient au courant pour la suite...:merci:

--
Cordialement,

Philippe SAINT-BERTIN
Registered member
102 messages
Popularité : +4 (4 votes)
Posted on July, 22 2018 - 11:58 AM
Salut,
Pour le moment je n'ai fait que survoler ce sujet, mais apriori vous ne parlez que de l'affichage des maps.
Est-ce qu'il y a aussi moyen de faire des recherches de géolocalisation soit "automatique" soit à partir d'une adresse saisie par l'utilisateur (cf. l'API Google Place) ?
Cordialement
DC
Posted on July, 22 2018 - 2:50 PM
Dav. wrote:
Salut,
Pour le moment je n'ai fait que survoler ce sujet, mais apriori vous ne parlez que de l'affichage des maps.
Est-ce qu'il y a aussi moyen de faire des recherches de géolocalisation soit "automatique" soit à partir d'une adresse saisie par l'utilisateur (cf. l'API Google Place) ?
Cordialement
DC


Y a-t-il un moyen? oui c'est, pouvez-vous reproduire la fonctionnalité google. NON. les adresses ne sont pas précises et ne s'afficheront jamais de la même manière que google les afficher. Donc, pour avoir de bons résultats, vous devez continuer à faire ce côté de l'application avec Google malheureusement.
Registered member
179 messages
Popularité : +17 (17 votes)
Posted on July, 23 2018 - 11:29 AM
@Dav.

Il y a le service Nominatim d'OSM qui fait ça :
- pour le tester : https://nominatim.openstreetmap.org
- pour la doc : https://wiki.openstreetmap.org/wiki/Nominatim

En gros il faut faire un appel de webservice sur l'URL : https://nominatim.openstreetmap.org/search/Le%20Mol%C3%A9son…

(ici avec les 10 résultats les plus pertinents demandés, en format JSON et avec un polygon "entourant" le lieu recherché).
Registered member
102 messages
Popularité : +4 (4 votes)
Posted on July, 23 2018 - 12:23 PM
Super !!
C'est exactement ce que je cherchais.
merci Jérôme !!
Je vais faire des tests mais ca semble plutôt fiable.
Au passage, Google est loin de renvoyer toujours de bons résultats...
Encore merci Jérôme
Registered member
179 messages
Popularité : +17 (17 votes)
Posted on July, 23 2018 - 2:07 PM
Content d'avoir pu vous aider ! ;)

Faites attention de respecter les conditions d'usage si c'est pour une grosse application : https://operations.osmfoundation.org/policies/nominatim/
Registered member
1,603 messages
Popularité : +64 (70 votes)
Posted on July, 24 2018 - 8:12 AM
Merci Jérôme je ne connaissais pas ! :merci:

--
Cordialement
François

http://intra.fr http://intrasoftware.fr
Posted on July, 26 2018 - 7:30 PM
Bonjour Jérôme,
je recherche également une solution de remplacement au couple WL/Google maps et cette discussion m’intéresse particulièrement et je vous remercie d'y participer. :merci:
Actuellement je travaille sur une appli windev mobile 23 pour une utilisation sous Android et iOS. L'appli intègre une fenêtre carto avec un affichage de plusieurs couches marqueurs selon le zoom. Je dois dire que je pense avoir atteint les limites du possible en n'utilisant que les fonctions natives du WL. C'est pour cette raison que j'ai depuis un moment un oeil braqué sur Leaflet, sans jamais avoir osé m'y attaquer. Le moment est venue et je viens donc d'essayer ton bout de code que j'ai du mal à le mettre en œuvre.
Sans vouloir exagérer de votre temps, pourriez-vous créer un mini projet Windev mobile d'exemple fonctionnel d'intégration de Leaflet et le mettre à la dispo de la communauté. Je suppose que cette contribution en intéresserait plus d'un et moi en premier.

Bien cordialement,
Claude
Registered member
102 messages
Popularité : +4 (4 votes)
Posted on July, 27 2018 - 1:24 PM
Salut, voici ce code WindevMobile23 qui fonctionne sous Android et en partie sous Universal :
// VIDAGE DU CHAMP HTML
HTM_SansNom1 = [
<div></div>
]

// LISTING DES MARQUEURS
sListeMarqueurs est une chaîne = ""
tabLatitudes, tabLongitudes est un tableau de réels
HLitPremier(donnees)
nCompteur est un entier = 1
TANTQUE HTrouve(donnees) ET nCompteur<HNbEnr()
TableauAjoute(tabLatitudes,donnees.latitude)
TableauAjoute(tabLongitudes,donnees.longitude)
sListeMarqueurs = sListeMarqueurs+[
var marker = L.marker([
]+donnees.latitude+", "+donnees.longitude+[
], {icon: redIcon, zIndexOffset: 0}).addTo(mymap)
.bindPopup("
]+donnees.Titre+[
");

function onMarkerClick(marker) {
latlong.innerHTML=marker.latlng;
WL.Execute("marqueur",latlong.innerHTML);
latlong.innerHTML="";
}
marker.on('click', onMarkerClick);
]+RC
HLitSuivant(donnees)
nCompteur++
FIN

TableauTrie(tabLatitudes,ttCroissant)
TableauTrie(tabLongitudes,ttCroissant)
// POSITION
rDeltaLat est un réel = 0.5*(tabLatitudes[TableauOccurrence(tabLatitudes)]-tabLatitudes[1])
rDeltaLong est un réel = 0.5*(tabLongitudes[TableauOccurrence(tabLongitudes)]-tabLongitudes[1])
rPositionX, rPositionY est un réel
rPositionX = tabLatitudes[1]+rDeltaLat
rPositionY = tabLongitudes[1]+rDeltaLong

// ZOOM
rLat1, rLat2, rLon1, rLon2 est un réel
// conversion degrés->radians
SI rDeltaLat>rDeltaLong ALORS
rLat1 = tabLatitudes[1]*0n3.141592653589793/180
rLat2 = tabLatitudes[TableauOccurrence(tabLongitudes)]*0n3.141592653589793/180
rLon1 = tabLongitudes[1]*0n3.141592653589793/180
rLon2 = tabLongitudes[1]*0n3.141592653589793/180
SINON
rLat1 = tabLatitudes[1]*0n3.141592653589793/180
rLat2 = tabLatitudes[1]*0n3.141592653589793/180
rLon1 = tabLongitudes[1]*0n3.141592653589793/180
rLon2 = tabLongitudes[TableauOccurrence(tabLongitudes)]*0n3.141592653589793/180
FIN
rDeltaLatR est un réel = 0.5*(rLat2-rLat1)
rDeltaLongR est un réel = 0.5*(rLon2-rLon1)
nTemp est un réel = (Sinus(rDeltaLatR)*Sinus(rDeltaLatR))+Cosinus(rLat1)*Cosinus(rLat2)*(Sinus(rDeltaLongR)*Sinus(rDeltaLongR))
nTemp2 est un réel = 2*(ArcTang2(Racine(nTemp),Racine(1-nTemp)))
rDistance est un réel = 6378.137*nTemp2 // Terre = sphère de 6378km de rayon

rLargeur est un réel = 40075.017
nZoom est un entier = 0
TANTQUE rLargeur>rDistance ET nZoom<16
rLargeur = rLargeur/2
nZoom++
FIN
nZoom--

// MAP
sTemp est une chaîne = [
<head>
<meta charset="utf-8"/>
<meta name="viewport"content="width=device-width, initial-scale=1.0">

<link rel="stylesheet"href="https://unpkg.com/leaflet@1.2.0/dist/leaflet.css"
integrity="sha512-M2wvCLH6DSRazYeZRIm1JnYyh22purTM+FDB5CsyxtQJYeKq83arPe5wgbNmcFXGqiSH2XR8dT/fJISVA1r/zQ=="
crossorigin=""/>
<script src="https://unpkg.com/leaflet@1.2.0/dist/leaflet.js"
integrity="sha512-lInM/apFSqyy1o6s89K4iQUKg6ppXEgsVxT35HbzUupEVRh2Eu9Wdl4tHj7dZO0s1uvplcYGmt3498TtHq+log=="
crossorigin=""></script>

</head>

<style>body { padding: 0; margin: 0; } html, body, #map { height: 98%; width: 100vw; }</style>

<BODY>
<div id="map"></div>
<div id="latlong"></div>
<script>

var redIcon = L.icon({
iconUrl: '

',
iconSize: [24, 41], // size of the icon
shadowSize: [41, 41], // size of the shadow
iconAnchor: [12, 41], // point of the icon which will correspond to marker's location
shadowAnchor: [14, 41], // the same for the shadow
popupAnchor: [0, -41] // point from which the popup should open relative to the iconAnchor
});

var mymap = L.map('map').setView([
]+rPositionX+", "+rPositionY+[
],
]+nZoom+[
);

L.tileLayer('

', {
maxZoom:18,
attribution: 'MapData&copy; <a href="http://openstreetmap.org">OpenStreetMap</a> ' +
'<a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-by-SA</a>, ' +
'Imagery© <a href="http://mapbox.com">Mapbox</a>',
id: 'mapbox.streets'
}).addTo(mymap);

]+sListeMarqueurs+
[
var popup = L.popup();
function onMapClick(e) {
latlong.innerHTML=e.latlng;
WL.Execute("coordonnees",latlong.innerHTML);
latlong.innerHTML="";
popup
.setLatLng(e.latlng)
.setContent(e.latlng.toString())
.openOn(mymap);
}
mymap.on('click', onMapClick);

</script>
</BODY>
]
HTM_SansNom1 =sTemp

-> on affiche la carte,
-> on ajoute tous les marqueurs de la BDD,
-> on positionne au centre des marqueurs,
-> on adapte le zoom (à améliorer),
-> au clic sur la carte ou sur les marqueurs, on fait sortir les coordonnées dans des procédures Windev "marqueur" et "coordonnees".
La <div latlong> est le seul moyen que j'ai trouvé pour transmettre les paramètres aux procédures.
Pour le moment je n'arrive qu'à récupérer les coordonnées des marqueurs ce qui pourrait poser pb s'il sont trop proches. Et puis ca demande de faire une recherche sur les lat et long pour retrouver la donnee correspondante.
Normalement on devrait pourvoir utiliser title ou alt mais marker.title donne "undefined". A améliorer donc.

Je vais bientôt tester sous iOS. Sous universal, ne pouvant pas utiliser WL.execute, je ne sais pas comment sortir les paramètres. Une idée ?
En attendant, ca fonctionne sur les 3 plateformes via une page php développée sous webdev21 en remplaçant WL.execute directement par la procédure !!

PS Pensez à cocher "Autoriser l'appel au WLangage..." sur le champ HTML
Bon week end
Dav
Registered member
102 messages
Popularité : +4 (4 votes)
Posted on July, 28 2018 - 11:22 AM
Confirmation : ce code fonctionne sur iPad 2 (iOS 9.3.5) et iPhone 6 (iOS 11..4.1)
Posted on August, 11 2018 - 5:13 PM
Merci à tous pour vos contributions,
suite à mes problèmes de zoom sur un champs carte (voir post : https://forum.pcsoft.fr/fr-FR/pcsoft.fr.windevmobile/31469-propriete-zoom-sous-ios/read.awp ), je viens également d'effectuer des essais de carto avec la librairie Leaflet et partant de vos codes d'exemple. C'est promoteur et je vais certainement poursuivre avec cette librairie en me mettant sérieusement au JavaScript.

Claude
Registered member
1 message
Posted on August, 14 2018 - 1:57 PM
Bonjour à tous,
ce sujet m’intéresse tout particulièrement car je souhaite développer une application WINDEV MOBILE pour Android avec OSM pour ne pas avoir à utiliser le champ carte de Google.

Je précise que j'utilise Windev Mobile en version 22 32 bits.
Malheureusement en utilisant les codes HTML des différents exemple (Jérôme ou Dav.) mon champ HTML ne charge pas la page est reste vide.

Est-ce lié à ma version de WINDEV Mobile ?
Je vous remercie pour votre aide.
Posted on August, 15 2018 - 11:22 PM
Bonjour Nicolas,

C'est possible sachant que l'option WL.Exécute est une nouveauté de la version 23 parmis les 923 nouveautés.

Si besoin, copie-colle le code dans un fichier .html et exécute le dans ton navigateur internet avec la console (Je te laisse chercher pour savoir comment la trouver.) Vois s'il y a des erreurs que tu peux corriger malgré ta version 22 qui t'empêchera malgré tout l'usage de WL.Exécute.

Bon développement !
Registered member
102 messages
Popularité : +4 (4 votes)
Posted on August, 18 2018 - 10:48 AM
Salut,
Après un rapide test avec WM21, je confirme qu'effectivement WL.Exécute ne fonctionne pas : c'est à dire qu'on ne peut pas l'utiliser pour sortir les coordonnées du clic vers une fonction en WLangage...
En revanche, aucun pb pour l'affichage de la carte, des marqueurs et les popup internes au HTML (titre et coordonnées) fonctionnent très bien.

Nicolas, est que le simple appel à un site du type HTM_SansNom1= "http://www.google.fr" fonctionne ?
Sinon il faut vérifier les permissions :
- pour Android il faut avoir "Android.permission.Internet"
- pour UW10 il faut cocher "Internet et réseaux publics (entrant et sortant)"
Registered member
1,287 messages
Popularité : +20 (72 votes)
Posted on September, 25 2018 - 10:02 AM
Pour suivre le fil de cette conversation. Merci déjà a tous les infos partagées ici

--
Bertin CARRIERE - SPRL RGPD.Zen-Project.be
bertin.carriere@gmail.com
http://www.zen-project.be http://www.linkedin.com/in/bertincarriere

Belgique +32(0)2/318.02.67
France +33(0)3/66.722.542
Espagne +34.5/12.702.266

http://www.be-dev.be
Registered member
204 messages
Popularité : +5 (5 votes)
Posted on September, 25 2018 - 11:12 AM
Bonjour,
je m'abonne également. Désolé, je n'ai pas trouvé comment faire sans déranger tout le monde ;(
Merci à tous les contributeurs
Registered member
204 messages
Popularité : +5 (5 votes)
Posted on September, 25 2018 - 1:04 PM
Ben en fait, j'ai trouvé : il suffit de s'abonner... en haut du fil des conversations. Mes excuses pour la pollution visuelle.
Posted on July, 21 2019 - 5:21 PM
@Jérôme Bonjour Jérôme, pouvez-vous s'il vous plaît me contacter dans l'e-mail suivant: grangulo7@gmail.com j'aimerai vous demander quelque chose en privé et je n'ai pas votre adresse email. est quelque chose sur ce sujet. Merci
Posted on November, 06 2020 - 8:32 PM
Bonjour,

Est ce que ce code peut fonctionner en mode Offline ?

Sinon avez-vous un exemple de code qui permet d'injecter la map dans un champ Conteneur Naitf ?

Merci, Alan
Registered member
964 messages
Popularité : +16 (20 votes)
Posted on November, 07 2020 - 12:15 PM
Pour ma part, j'utilise l'API géoportail avec Openlayer via une page HTML.
Ca marche bien mais pas de mode offline.
WM26 annonce des nouveautés pour le champ carte ; à suivre.
Ce serait bien que PCSoft développe un composant carte avec autre chose que Google Map.
Registered member
102 messages
Popularité : +4 (4 votes)
Posted on November, 08 2020 - 9:22 AM
Bonjour Pascal, après recherche, il semble que l'utilisation des données IGN est gratuite jusqu'à 2 000 000 de "transactions" par an.
Ca paraît beaucoup, mais ca prend en compte toutes les tuiles téléchargées par les utilisateurs... Le compteur doit finalement aller vite, non ?
Pouvez-vous nous faire un retour sur la conso moyenne par type de projet ?
DC
Registered member
964 messages
Popularité : +16 (20 votes)
Posted on November, 08 2020 - 11:35 AM
Bonjour
Je ne peux vous retourner l'information car le site pro est en rénovation (un an de retard à l'allumage) et je ne peux pas me connecter.
Par contre, pour prétendre à une licence gratuite, l'utilisation de votre web ou applications mobile doit être gratuite.
Ca fait 20 ans que j'utilise dans des WEB assez consommateur l'API Geoportail ; je n'ai jamais eu de blocage.
Ca fait trois ans que j'utilise une page WEB utilisant le geoportail dans mes applications.
Pascal
Registered member
964 messages
Popularité : +16 (20 votes)
Posted on November, 08 2020 - 11:41 AM


Registered member
102 messages
Popularité : +4 (4 votes)
Posted on November, 09 2020 - 8:36 AM
Merci Pascal, je vais étudier la question IGN.

Pour revenir à la question des maps locales voici un exemple avec Openstreet :
https://wiki.openstreetmap.org/wiki/OpenLayers_Local_Tiles_Example

A priori il faut au préalable télécharger les maps via
https://wiki.openstreetmap.org/wiki/OSMtiledownloader
C'est intéressant si on travail toujours dans la même zone géographique.
Après il doit y avoir possiblilité d'automatiser ces téléchargements à la demande...
A tester
DC
Posted on November, 23 2020 - 8:24 PM
Bonjour,

J'ai avance et maintenant je maitrise leaflet/OSM ( merci la derniere LST )

Maintenant, je cherche a intègre le plugin de leaflet qui permet le GPS ( cercle bleu a sa position, leaflet/locate/L.Control.Locate.min.js ) et pouvoir adapter un routing a chaque déplacement (leaflet/leaflet-routing-machine.js)

Si quelqu'un deja fait cela cela me serait TRES utile.

Merci, Alan
Registered member
102 messages
Popularité : +4 (4 votes)
Posted on November, 24 2020 - 8:15 AM
Bonjour Alan,
Avez-vous réussi à utiliser OpenStreetMap offline ?
Registered member
179 messages
Popularité : +2 (4 votes)
Posted on December, 24 2020 - 1:29 AM
Bonjour à vous.

J'utilise aussi OSM sur une application IOS et Android.
Cela fonctionne plutôt pas mal.

En revanche, lorsque l'on veut afficher des centaines de points voir des milliers avec une connexion internet pas géniale la c'est la galère car on attend le retour de OSM/Leaflet pour voir afficher les points ou clusters (j'utilise des clusters s'il y a plus de 50 points ç afficher)
L'utilisateur se demande alors quand les points ou clusters vont s'afficher?

Je n'ai pas trouver comment mettre un message d'attente le temps de ce retour. Auriez-vous une idée ?

Merci à vous
Posted on February, 18 2021 - 8:00 PM
Non toujours pas, j'ai teste plein de composants mais aucun n'arrive a etre maitrise pour etre exploitable ( graphhopper, osm, leaflet ... ), en online cela fonctionne plutot bien, mais mon besoin est vraiment offline.
Posted on February, 08 2022 - 6:10 PM
hi,
i need some code like your's or site that i can found similar
Best regard
Registered member
3,311 messages
Popularité : +93 (137 votes)
Posted on February, 09 2022 - 6:51 AM
Djemil copie ce que fait Map factor navigator
L'application télécharge les Map de OSM et les utilise off line
Et comme l'a expliqué dav