// Documentation : http://randochartreuse.free.fr/mobac2.x/documentation/#bsh // Version : 16/10/2023 // Nom de la carte affiché dans MOBAC name = "France, cartes ViaMichelin (Classic)"; // Nom du serveur String MyServer = "map.viamichelin.com"; // MyUserAgent correspond à celui créé notamment avec la clé IGN // Par défaut, on trouve souvent MyUserAgent = "Mozilla/5.0 Gecko/20100101 Firefox/49.0"; String MyUserAgent = "Mozilla/5.0 Gecko/20100101 Firefox/49.0"; // MyReferer peut être demandé String MyReferer = ""; // MyFolder au format "dossier" ou "dossier1/dossier2/etc" String MyFolder = "map/mapsgene/dm/mapdirect"; tileType = "png"; // Type d’image fourni par le serveur (png, jpg or gif) tileSize = 256; // Facultatif : Supprimer la ligne dans le doute minZoom = 2; // Facultatif : Zoom minimal souhaité (et/ou fourni par le serveur) maxZoom = 19; // Facultatif : Zoom maximal souhaité (et/ou fourni par le serveur) -> Maximum 22 pour Mobac // Gestion des passages de zooms pour recentrer la carte tileUpdate = TileUpdate.IfModifiedSince; //tileUpdate = TileUpdate.LastModified; String getTileUrl(int Zoom, int X, int Y) { if (Zoom < 7) { // gestion Zoom < 7, on prend une carte générique Google pour voir le monde entier return "https://mt0.google.com/vt?lyrs=m&hl=fr&z=" + Zoom + "&x=" + X + "&y=" + Y; }else{ // urlX_de_test = "https://map.viamichelin.com/map/mapsgene/dm/mapdirect;dmlhbWljaGVsaW4uYmFja2dyb3VuZEB6MTE=;MDAwMDAwMTY3MzAwMDAwMDAxMTY=?x=1057&y=732" return "https://" + MyServer + "/" + MyFolder + ";" + urlstring(Zoom,X+1,Y+1) + "?x=" + X + "&y=" + Y; } } void addHeaders(java.net.HttpURLConnection conn) { conn.addRequestProperty("Referer",MyReferer); conn.addRequestProperty("User-Agent",MyUserAgent); } // // Fonction projecion de ViaMichelin // import java.lang.Math; import java.util.Base64; String urlstring(int zm,int My_col,int My_row) { int[] tile; int new_zoom=zm; String zs; switch (new_zoom) { case 1 : zs="viamichelin.background@z1" ; break; //dmlhbWljaGVsaW4uYmFja2dyb3VuZEB6MQ== case 2 : zs="viamichelin.background@z2" ; break; //dmlhbWljaGVsaW4uYmFja2dyb3VuZEB6Mg== case 3 : zs="viamichelin.background@z3" ; break; //dmlhbWljaGVsaW4uYmFja2dyb3VuZEB6Mw== case 4 : zs="viamichelin.background@z4" ; break; //dmlhbWljaGVsaW4uYmFja2dyb3VuZEB6NA== case 5 : zs="viamichelin.background@z5" ; break; //dmlhbWljaGVsaW4uYmFja2dyb3VuZEB6NQ== case 6 : zs="viamichelin.background@z6" ; break; //dmlhbWljaGVsaW4uYmFja2dyb3VuZEB6Ng== case 7 : zs="viamichelin.background@z7" ; break; //dmlhbWljaGVsaW4uYmFja2dyb3VuZEB6Nw== case 8 : zs="viamichelin.background@z8" ; break; //dmlhbWljaGVsaW4uYmFja2dyb3VuZEB6OA== case 9 : zs="viamichelin.background@z9" ; break; //dmlhbWljaGVsaW4uYmFja2dyb3VuZEB6OQ== case 10 : zs="viamichelin.background@z10" ; break; //dmlhbWljaGVsaW4uYmFja2dyb3VuZEB6MTA= case 11 : zs="viamichelin.background@z11" ; break; //dmlhbWljaGVsaW4uYmFja2dyb3VuZEB6MTE= case 12 : zs="viamichelin.background@z12" ; break; //dmlhbWljaGVsaW4uYmFja2dyb3VuZEB6MTI= case 13 : zs="viamichelin.background@z13" ; break; //dmlhbWljaGVsaW4uYmFja2dyb3VuZEB6MTM= case 14 : zs="viamichelin.background@z14" ; break; //dmlhbWljaGVsaW4uYmFja2dyb3VuZEB6MTQ= case 15 : zs="viamichelin.background@z15" ; break; //dmlhbWljaGVsaW4uYmFja2dyb3VuZEB6MTU= case 16 : zs="viamichelin.background@z16" ; break; //dmlhbWljaGVsaW4uYmFja2dyb3VuZEB6MTY= case 17 : zs="viamichelin.background@z17" ; break; //dmlhbWljaGVsaW4uYmFja2dyb3VuZEB6MTc= case 18 : zs="viamichelin.background@z18" ; break; //dmlhbWljaGVsaW4uYmFja2dyb3VuZEB6MTg= case 19 : zs="viamichelin.background@z19" ; break; //dmlhbWljaGVsaW4uYmFja2dyb3VuZEB6MTk= } tile = cr2tile(My_col,My_row); int tileA = tile[0]; int tileB = tile[1]; String tilestring = tiles2string(String.valueOf(tileA),String.valueOf(tileB)); // Encode Base64 String mapb64string = Base64.getEncoder().encodeToString(zs.getBytes("utf-8")); String tileb64string = Base64.getEncoder().encodeToString(tilestring.getBytes("utf-8")); return mapb64string + ";"+ tileb64string; } int[] cr2tile(int My_col,int My_row) { // original cell: // A:B // child cells: // 2B:2A 2B+1:2A // 2B:2A+1 2B+1:2A+1 int[] tile2 = new int[2]; int A; int B; if ((My_col==1)&&(My_row==1)) { A = 0; B = 0; } else { // transformation en decimal -> (double) Double col0=(Double)My_col; Double row0=(Double)My_row; int col2 = round(col0/2); int row2 = round(row0/2); tile2 = cr2tile(col2,row2); int tile2A = tile2[0]; int tile2B = tile2[1]; A = tile2B * 2 + ((My_col-1) % 2); B = tile2A * 2 + ((My_row-1) % 2); // note that the A/B switch above is intentional } return new int[] {A,B}; } String tiles2string(String a,String b) { String ps=""; String qs=""; int p=a.length(); int q=b.length(); for(i=0;i<(10-p);p++) ps=ps+"0"; for(i=0;i<(10-q);q++) qs=qs+"0"; return ps + a + qs + b; } // // FIN ViaMichelin //