Générer une carte 'automatique' de votre monde minetest


#1

Automatique, ok mais pas en temps réel. Soyons clair dès le début.

Ce sujet fait suite à la discussion débutée là : Backup du world et un mod

Commençons par rendre à César ce qui appartient à Jules. Tout ce qui suit est basé sur le projet MTSatellite de Sascha L. Teichmann et sur les différentes idées exprimées dans le sujet cité ci-dessus.
Le projet MTSatellite permet la génération en temps réel (ou presque) de la carte d’un monde. Ici, nous nous limiterons à une génération planifiée.
Pourquoi ? Et bien tout simplement parce que les versions des dépôts officiels de Minetest pour Debian ou Fedora sont compilées sans le support des bases redis nécessaires à la mise en place de la partie ‘temps réel’ de MTSatellite.
Du coup, on se contentera de regénérer la totalité de la carte toutes les X heures.

Pour cela, nous aurons besoin des éléments suivants :

  • 2 des 4 utilitaires du projet MTSatellite : mtredisalize et mtseeder
  • 1 fichier html avec tous ses petits copains css/js/fonts pour l’affichage du résultat (basé sur celui fourni avec mtwebmapper)
  • autant de fichiers CSV contenant les POI qu’il y a de couches à afficher sur la carte

Et c’est parti pour les explications.

D’abord le principe de fonctionnement :
Toutes les X heures (ou à la demande, c’est à chacun de voir), on génére une sauvegarde du fichier map.sqlite de minetest.
À partir de cette sauvegarde, on génère l’ensemble des tuiles nécessaires à l’affichage.
On affiche le résultat via un fichier html utilisant LeafletJS et quelques-uns de ses plugins.
Ce fichier fait des requêtes sur le web pour récupérer les fichiers CSV contenant les POI et les captures d’écran.

Le résultat : https://framinetest.org/carte/


#2

Étape 1 : Récupérer la partie affichage.

L’ensemble du projet (fichiers statiques) est sur Framagit : https://framagit.org/fat115/framinetest
Et quand je dis l’ensemble, c’est même trop puisque ce qui nous intéresse n’est que ce qui est dans le dossier carte. Vous pouvez négliger tout le reste (qui n’est autre que le contenu du site Framinetest).

Par rapport à la partie web du pojet MTSatellite, ici nous utiliserons les outils suivants :

Le fichier index.html à la racine du dossier carte est entièrement commenté, je ne redétaillerai donc pas ici.

En gros, on crée un fond de carte world qui s’appuie sur les tuiles générées par mtseeder.
On y rajoute 3 couches : ciel, surface et soussol pour afficher les POI.
On récupère via des requêtes Ajax les fichiers CSV respectifs et on ajoute les données aux couches ci-dessus.

Dans le cas de la carte Framinetest, ces fichiers CSV sont là aussi sur Framagit : https://framagit.org/fat115/Framinetest_map_POIs


#3

Étape 2 : Récupérer la partie génération des tuiles.

C’est sur le dépôt Framagit indiqué ci-dessus :wink:
Vous y trouverez les binaires mtseeder et mtredisalize pour Debian 8 et Fedora 24, uniquement en 64 bits.
Si vous êtes sous Windows, Sascha L. Teichmann les fournit en téléchargement => https://bitbucket.org/s_l_teichmann/mtsatellite/downloads

Vous y trouverez aussi le script Python qui se charge de tout : sauvegarde du fichier sqlite, lancement de mtredisalize puis de mtseeder
Ce script nécessite le module APSW.
Installation sur Debian : apt-get install python-apsw
Installation sur Fedora : dnf install python2-apsw
Installation sur Windows : https://github.com/rogerbinns/apsw/releases
Installation de Python 2.7 sur Windows : https://www.python.org/downloads/windows/

Pour Windows, il est un peu lourd d’installer Python et APSW juste pour automatiser le tout. Surtout si vous faites tourner votre serveur Minetest uniquement de temps en temps.
La solution la plus simple est alors d’arrêter le serveur, de faire une copie du fichier map.sqlite (ou de travailler directement à partir de lui), de lancer mtredisalize sur le fichier sqlite adéquat (original ou backup) puis mtseeder.

Quelques points importants :
mtredisalize DOIT être lancé avec les options -interleaved=false et -driver=sqlite si vous utilisez une base sqlite non modifiée (cas du fichier orignal map.sqlite ou d’un backup).
Pour mtseeder, vous devez adapter la variable d’environnement GOMAXPROCS et l’option -workers=X à l’ordinateur utilisé.
Pour plus d’informations sur les options : https://bitbucket.org/s_l_teichmann/mtsatellite/src/default/SETUP.md?fileviewer=file-view-default
Pour les couleurs, vous trouverez dans le dossier /bin du dépôt les fichiers predefined.json, amc_nodes.txt et mtautocolors.txt correspondant aux mods installés sur le serveur Framinetest.
Ils ne correspondront pas forcément à ceux dont vous avez besoin. Il vous faudra alors passer par les sources du logiciel MTAutocolors, la compilation, l’installation du mod sur votre serveur puis la génération de votre fichier colors.txt.
Le site du projet MTAutocolors : https://bitbucket.org/s_l_teichmann/mtautocolors


#4

Étape 4 : les POI (Points Of Interest).

Avoir une carte c’est bien, pouvoir y faire apparaitre des infos supplémentaires, c’est mieux.
Et c’est ce qu’a fait @talou dans le sujet indiqué au tout début.

Exemple :

Partant de là et pour permettre une édition collaborative avec modération, je suis parti des marqueurs ajoutés un par un, puis via une couche GeoJSON pour arriver au GeoCSV avec hébergement des fichiers CSV sur un dépôt Framagit.
Ça permet la modération via les Merge Request. Oui, c’est tordu, ça oblige les modérateurs a avoir un compte Framagit, etc. Et en plus ça ne marche (enfin seulement à partir de demain) qu’à partir de framinetest.org.
Y’avait bien la solution Framapad mais aucun de mes essais ne m’a satisfait, il manquait toujours quelque chose. Idem avec Framacalc, pourtant pour du CSV c’était le plus logique.
Pour les captures d’écran, c’est plus simple, il suffit de se servir de Framapic pour les stocker.


La structure des fichiers CSV :
Ils comportent 7 colonnes => x;y;titre;createur;capture;marker;color
x & y sont les coordonnées du point (obligatoires)
titre est le titre qui apparait en gras dans l’exemple ci-dessus (obligatoire)
createur apparait en dessous en italique (obligatoire, dans le doute, mettre ?? comme l’a fait @talou )
capture c’est le lien vers l’image (facultatif, peut être relatif ou absolu)
marker (facultatif, permet de personnaliser le marqueur de ce point sinon utilise celui par défaut de la couche)
color (facultatif, permet de personnaliser la couleur du marqueur de ce point sinon utilise celle par défaut de la couche)

Concernant les captures, il est tout à fait possible de les mettre dans un sous-dossier spécifique (ex : captures) puis d’indiquer un lien de type captures/mon_image.jpg dans la colonne concernée. C’est la solution appropriée pour une utilisation en local ou mono-utilisateur.


Utilisation uniquement en local, sans serveur, sans lien vers internet.
C’est possible mais vous devrez faire quelques ajustements dans le fichier index.html pour que cela fonctionne.
Tout d’abord, vous n’aurez plus besoin des 3 scripts js fournis par framasoft.org, lignes 49, 50 & 53 => à effacer
Ensuite, vous devrez ajuster la position de la map, ligne 19 => top: 0;
Vous devrez modifier légèrement le contenu des fichiers CSv pour les transformer en fichier JS (plus de détails ci-après).
Vous devrez charger ces fichiers js dans le body entre le div ‘map’ et le début du script principal : <script src="geocsv.soussol.js"></script> par exemple
Et vous devrez supprimer les requêtes Ajax et les remplacer par le chargement des données venant des fichiers js évoqués juste avant.

Fichier js dérivé du fichier csv :

var cielcsv = "x;y;titre;createur;capture;marker;color\
0;2000;Ile dans le ciel;zorglub;;;\
33;-118;Deux petites îles dans le ciel;??;;;"

En fait, on va définir une variable javascript.
Pour cela on ajoute var ciel = " au tout début du fichier,
un \ à chaque fin de ligne (chaîne multiligne en javascript),
et un " en toute fin de fichier

Et on remplace la requête Ajax correspondante :

$.get("https://framagit.org/fat115/Framinetest_map_POIs/raw/master/ciel.csv", function(data){
  ciel.addData(data);
}); 

par

ciel.addData(cielcsv);

J’ai certainement oublié plein de choses donc n’hésitez pas à poser des questions.


#5

Super boulot ! Et explication complète ! Bravo.
Une petite question : tu ne souhaitais pas garder la coordonnée Z ? Pour d’autres usages, quitte à enregistrer l’info, autant tout recueillir.


#6

Gros (très gros) Merci @fat115, c’est du super boulot qui sera très utile à beaucoup d’entre nous en établissement. :heart_eyes:

@bientôt
Sangokuss