Hello,
Please find below a solution for Mobac
Note :
the cards are not centered (France Z10 in Norway).
I use two affine functions based on four cities.
Brest <-> Strasbourg for the horizontal and
Dunkerque <-> Perpignan for the vertical
Nicolas
Please find below a solution for Mobac
Code Select
// Nom de la carte affiché dans MOBAC
name = "France, cartes papiers Michelin (Rev.081)-Z(10,11,12)-2019";
// Nom du serveur
String MyServer = ".viamichelin.com";
String MyServer_2 = "map.viamichelin.com";
// Key au format "/blabla"
String MyKey = "";
// MyUserAgent correspond à celui créé notemment 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 "/blabla"
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
Zoom10=0;
Zoom11=0;
Zoom12=0;
CorrectionX=0;
CorrectionY=0;
String getTileUrl(int Zoom, int X, int Y) {
// Autres paramètres spécifiques GetTile
// TileMatrix = Zoom : Le nom de la matrice qui contient la tuile
// TileCol = X : Le numéro de colonne du coin supérieur gauche de la tuile
// TileRow = Y : Le numéro de ligne du coin supérieur gauche de la tuile
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 "http://mt0.google.com/vt/lyrs=m@176103410&hl=fr&s=Galileo&scale=1&z=" + Zoom + "&x=" + X + "&y=" + Y;
}else if (Zoom < 10){
Zoom10=0;
Zoom11=0;
Zoom12=0;
// url = ""
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;
if (Zoom10==0) {
// X(A,B)->X, A1,A2,B1,B2
// Brest <-> Strasbourg
CorrectionX = EchelleXY(X,499,16,534,37);
// Dunkerque <-> Perpignan
CorrectionY = EchelleXY(Y,343,34,377,55);
Zoom10=1;
}
return "http://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;
// pour geneve correction X-993,Y-687
if (Zoom11==0) {
// X(A,B)->X, A1,A2,B1,B2
// Brest <-> Strasbourg
CorrectionX = EchelleXY(X,998,14,1067,73);
// Dunkerque <-> Perpignan
CorrectionY = EchelleXY(Y,685,5,754,65);
Zoom11=1;
}
return "http://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;
// pour geneve correction X-2017,Y-1386
if (Zoom12==0) {
// X(A,B)->X, A1,A2,B1,B2
// Brest <-> Strasbourg
CorrectionX = EchelleXY(X,1996,11,2136,112);
// Dunkerque <-> Perpignan
CorrectionY = EchelleXY(Y,1370,8,1509,112);
Zoom12=1;
}
return "http://m" + Num_Server + MyServer + MyFolder + ";" + urlstring(Zoom,X-CorrectionX,Y-CorrectionY);
}else{
// url = ""
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 EchelleXY
//
static import java.lang.Math.*;
int EchelleXY(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);
}
//
// Fonction projecion de ViaMichelin
//
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];
switch (new_zoom) {
case 10:
String tilestring = tiles2string(String.valueOf(tileA),String.valueOf(tileB));
//javax.swing.JOptionPane.showMessageDialog(null,tilestring);
break;
case 11:
String tilestring = tiles2string(String.valueOf(tileA),String.valueOf(tileB));
break;
case 12:
String tilestring = tiles2string(String.valueOf(tileA),String.valueOf(tileB));
break;
default:
String tilestring = tiles2string(String.valueOf(tileA),String.valueOf(tileB));
break;
}
// 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
//
Note :
the cards are not centered (France Z10 in Norway).
I use two affine functions based on four cities.
Brest <-> Strasbourg for the horizontal and
Dunkerque <-> Perpignan for the vertical
Nicolas