// Documentation : http://randochartreuse.free.fr/mobac2.x/documentation/#bsh // Version : 16/10/2023 // Nom de la carte affiché dans MOBAC name = "France, cartes papiers Michelin (Rev.081)-Z(10,11,12)"; // Nom du serveur String MyServer = ".viamichelin.com"; String MyServer_2 = "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 = "mapsgene/dm/mapdirect"; String MyFolder_2 = "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; Zoom10 = 0; Zoom11 = 0; Zoom12 = 0; CorrectionX = 0; CorrectionY = 0; MessageIntro = "Oui"; String getTileUrl(int Zoom, int X, int Y) { if (Zoom < 7) { Zoom10=0; Zoom11=0; Zoom12=0; // 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 if (Zoom < 10){ Zoom10=0; Zoom11=0; Zoom12=0; return "https://" + MyServer_2 + "/" + MyFolder_2 + ";" + urlstring(Zoom,X+1,Y+1); }else if (Zoom < 11){ Num_Server = (X % 3) + 10; // 10 11 12 Zoom11=0; Zoom12=0; // urlX_de_test = "https://m10.viamichelin.com/mapsgene/dm/mapdirect;ZXVyX2NfMTAwMGtfcjA1;MDAwMDAwMDA0MjAwMDAwMDAwMzY=" if (Zoom10==0) { Message_information(); MessageIntro = "Non"; // X(A,B)->X, A1,A2,B1,B2 // Brest <-> Strasbourg CorrectionX = CalculCorrectionXY(X,499,16,534,37); // Dunkerque <-> Perpignan CorrectionY = CalculCorrectionXY(Y,343,34,377,55); Zoom10=1; } return "https://m" + Num_Server + MyServer + "/" + MyFolder + ";" + urlstring(Zoom,X-CorrectionX,Y-CorrectionY); }else if (Zoom < 12){ Num_Server = (X % 3) + 10; // 10 11 12 Zoom10=0; Zoom12=0; // urlX_de_test = "https://m12.viamichelin.com/mapsgene/dm/mapdirect;ZnJhX2NfMDI3NWtfcjgx;MDAwMDAwMDA2MDAwMDAwMDAwNDc=" // pour geneve correction X-993,Y-687 if (Zoom11==0) { Message_information(); MessageIntro = "Non"; // X(A,B)->X, A1,A2,B1,B2 // Brest <-> Strasbourg CorrectionX = CalculCorrectionXY(X,998,14,1067,73); // Dunkerque <-> Perpignan CorrectionY = CalculCorrectionXY(Y,685,5,754,65); Zoom11=1; } return "https://m" + Num_Server + MyServer + "/" + MyFolder + ";" + urlstring(Zoom,X-CorrectionX,Y-CorrectionY); }else if (Zoom < 13){ Num_Server = (X % 3) + 10; // 10 11 12 Zoom10=0; Zoom11=0; // urlX_de_test = "https://m10.viamichelin.com/mapsgene/dm/mapdirect;ZnJhX2NfMDE4NWtfcjgx;MDAwMDAwMDA3NTAwMDAwMDAxMDE=" // pour geneve correction X-2017,Y-1386 if (Zoom12==0) { Message_information(); MessageIntro = "Non"; // X(A,B)->X, A1,A2,B1,B2 // Brest <-> Strasbourg CorrectionX = CalculCorrectionXY(X,1996,11,2136,112); // Dunkerque <-> Perpignan CorrectionY = CalculCorrectionXY(Y,1370,8,1509,112); Zoom12=1; } return "https://m" + Num_Server + MyServer + "/" + MyFolder + ";" + urlstring(Zoom,X-CorrectionX,Y-CorrectionY); }else{ Zoom10=0; Zoom11=0; Zoom12=0; return "https://" + MyServer_2 + "/" + MyFolder_2 + ";" + urlstring(Zoom,X+1,Y+1); } } void addHeaders(java.net.HttpURLConnection conn) { conn.addRequestProperty("Referer",MyReferer); conn.addRequestProperty("User-Agent",MyUserAgent); } // // Fonction CalculCorrectionXY // /* Cette fonction calcule la correction en X (ou en Y) qu’il faut apporter lors d’un changement de zoom pour recentrer la carte. Deux villes servent de référence en X (Brest et Strasbourg) et en Y (Dunkerque et Perpignan). On pose l’équation d’une droite qui passe par deux points A(a1;a2) et B(b1;b2) -> les 2 villes en X et on fait de même en Y. On calcule ensuite la nouvelle correction pour la position X (puis pour la position Y) en réolvant l’équation : corXY = A * XY + B */ int CalculCorrectionXY(int XY,int a1,int a2,int b1,int b2){ // *0.00001/100000 -> pour convertir avec 5 chiffres significatifs, sinon 0.0 float A = ((b2 - a2)*0.00001/(b1-a1))*100000; float B = a2 - A * a1; int corXY = round(A * XY + B); // javax.swing.JOptionPane.showMessageDialog(null,"XY" +XY+ "#" + (XY-corXY)); return (XY-corXY); } import java.lang.*; Message_information() { String Mon_message = "Cette première ébauche des anciennes cartes Michelin fonctionne correctement \n" + "si on reste sur le même zoom (10, 11 ou 12). \n"+ "Il est donc conseillé de centrer le secteur voulu, puis de fermer Mobac, \n"+ "et enfin de supprimer le dossier cache : \n" + "\\tilestore\\db-France, cartes papiers Michelin (Rev.081)-Z(10,11,12)-2020 \n" + "avant de relancer Mobac pour eviter les incohérences d'images. \n " + "Noter aussi que les cartes ne sont pas calibrées pour le GPS. \n \n" + "Ce message peut être supprimé en remplaçant la ligne 35 par : \n" + "MessageIntro = \"Non\";"; if (MessageIntro == "Oui") { javax.swing.JOptionPane.showMessageDialog(null, Mon_message); } } // // Fonction projecion de ViaMichelin // // Datum: Nouvelle Triangulation Francaise (Paris) -> https://epsg.io/4807 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="eur_c_1000k_r05" ; break; //ZXVyX2NfMTAwMGtfcjA1 case 11 : zs="fra_c_0275k_r81" ; break; //ZnJhX2NfMDI3NWtfcjgx case 12 : zs="fra_c_0185k_r81" ; break; //ZnJhX2NfMDE4NWtfcjgx 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 //