LoadTuilesIGN

Soyez le premier à donner votre avis sur cette source.

Snippet vu 658 fois

Contenu du snippet

import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import javax.imageio.*;
import javax.swing.*;

public class LoadTuilesIGN extends JFrame {
private static final boolean DEBUG = false;
private static final String URL1 = "https://wxs.ign.fr/an7nvfzojv5wa96dsga5nk8w/geoportail/wmts?layer=GEOGRAPHICALGRIDSYSTEMS.MAPS&style=normal&tilematrixset=PM&Service=WMTS&Request=GetTile&Version=1.0.0&Format=image%2Fjpeg&TileMatrix=" ;
private static final String URL2 = "&TileRow=" ;
private static BufferedImage image ;
private final JButton btnplus, btnmoins, btwplus, btwmoins, btsplus, btsmoins, bteplus, btemoins ;
private static final short hauteurtuile = 256 ;
private static final short largeurtuile = 256 ;
private static int[] tuileNum = new int [4] ;
private static final short irangsup = 0 ; // indice ds tuileNum du N° de tuile de la rangée supérieure
private static final short icolgauche = 1 ;
private static final short iranginf = 2 ; // indice ds tuileNum du N° de tuile de la rangée supérieure
private static final short icoldroite = 3 ;
private static final double RADIUS_MAJOR = 6378137.0;
@FunctionalInterface
private interface xAxisProjectionSphericalMercator {double convertir(double longin);}
private static xAxisProjectionSphericalMercator maxAxisProjectionSphericalMercator = longin -> Math.toRadians(longin) * RADIUS_MAJOR ;
@FunctionalInterface
private interface yAxisProjectionSphericalMercator {double convertir(double latin);}
private static final yAxisProjectionSphericalMercator mayAxisProjectionSphericalMercator = latin -> Math.log(Math.tan(Math.PI / 4 + Math.toRadians(latin) / 2)) * RADIUS_MAJOR ;
private static final short arglon = 1, arglat = 2, argmat = 3 ;
private JScrollPane pancarte ; // panneau image
private ImageIcon imcarte = new ImageIcon ();
private static int rwidth, rheight ; // taille JFrame
private static Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
private static int nbTuilesHaut, nbTuilesLarg ; // ns de tuiles en H et V
private static String defargs[] = {"Plainfaing.png", "7.014816999999994", "48.17267500000001", "15"} ;
private static final int IndRESOLUTION = 0, IndTopLeftCornerX0 = 1, IndTopLeftCornerY0 = 2 ; // indice ds TabMatrix donnant la col pour la Résolution (m/px)
private static final double TabMatrix[][] = { // info relatives au zoom : 1ère col : résolutions telles qu'indiquées en https://geoservices.ign.fr/documentation/geoservices/wmts.html#rsolutions-et-chelles-en-webmercator-sphrique
{156543.0339280410},
{}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {},
{4.7773142678, -20037508.3427892476320267, 20037508.3427892476320267}} ;

public LoadTuilesIGN (String nomfichier) {
super ("Géoportail crawler V0.91") ;
final File outputfile = new File(nomfichier);
final String filetype = nomfichier.substring(nomfichier.lastIndexOf(".") + 1) ;
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e) {
try { // retrieve image
ImageIO.write(image, (filetype.equals("*.jpg,*.JPG") || filetype.equals("*.png,*.PNG") || filetype.equals("*.gif,*.GIF") || filetype.equals("*.jpeg,*.JPEG") || filetype.equals("*.bmp,*.BMP")) ? ".jpg" : filetype, outputfile);
} catch (IOException ew) {
ew.printStackTrace();
}
System.exit(0);
}
});
rwidth = Math.min(screenSize.width, largeurtuile * (tuileNum[icoldroite] - tuileNum[icolgauche] + 1)) ;
rheight = Math.min(screenSize.height, hauteurtuile * (tuileNum[iranginf] - tuileNum[irangsup] + 1)) ;
if (DEBUG) System.out.println( "*** DEBUG *** LoadTuilesIGN, rwidth="+rwidth+", rheight="+rheight);
Construimage ( ) ;
setPreferredSize(new Dimension(rwidth, rheight)); setLocation (50,50) ;
pancarte = new JScrollPane(new JLabel(imcarte)) ;
getContentPane().add(pancarte, BorderLayout.CENTER ) ;
Box Panboun = Box.createHorizontalBox() ;
btnplus = new JButton ("+") ; btnplus.setPreferredSize(new Dimension(rwidth/5,15)); btnplus.addActionListener(new btnListener(irangsup, -1)); Panboun.add(btnplus) ;
btnmoins = new JButton ("-") ; btnmoins.setPreferredSize(new Dimension(rwidth/5,15)); btnmoins.addActionListener(new btnListener(irangsup, 1)); Panboun.add(btnmoins) ;
getContentPane().add(Panboun, BorderLayout.NORTH ) ;
Box Panbouw = Box.createVerticalBox() ;
btwmoins = new JButton () ; Verticalize (btwmoins, "-", false) ; btwmoins.setPreferredSize(new Dimension(15,rheight/5)); btwmoins.addActionListener(new btnListener(icolgauche, 1)); Panbouw.add(btwmoins) ;
btwplus = new JButton () ; Verticalize (btwplus, "+", false) ; btwplus.setPreferredSize(new Dimension(15,rheight/5)); btwplus.addActionListener(new btnListener(icolgauche, -1)); Panbouw.add(btwplus) ;
getContentPane().add(Panbouw, BorderLayout.WEST ) ;
Box Panbous = Box.createHorizontalBox() ;
btsmoins = new JButton ("-") ; btsmoins.setPreferredSize(new Dimension(rwidth/5,15)); btsmoins.addActionListener(new btnListener(iranginf, -1)); Panbous.add(btsmoins) ;
btsplus = new JButton ("+") ; btsplus.setPreferredSize(new Dimension(rwidth/5,15)); btsplus.addActionListener(new btnListener(iranginf, 1)); Panbous.add(btsplus) ;
getContentPane().add(Panbous, BorderLayout.SOUTH ) ;
Box Panboue = Box.createVerticalBox() ;
bteplus = new JButton () ; Verticalize (bteplus, "+", true) ; bteplus.setPreferredSize(new Dimension(15,rheight/5)); bteplus.addActionListener(new btnListener(icoldroite, 1)); Panboue.add(bteplus) ;
btemoins = new JButton () ; Verticalize (btemoins, "-", true) ; btemoins.setPreferredSize(new Dimension(15,rheight/5)); btemoins.addActionListener(new btnListener(icoldroite, -1)); Panboue.add(btemoins) ;
getContentPane().add(Panboue, BorderLayout.EAST ) ;
pack() ;
setVisible(true) ;
}

public class btnListener implements ActionListener {
private int incrément ; // valeur de l'incrément
private short tuind ; // index ds "tuileNum" N° de rangée ou de col de tuile à incrémenter

/**
  • constructeur de btnListener
  • @param incrément
  • la valeur à incrémenter (+1 ou -1)
  • @param tuind
  • N° de rangée ou de col de tuile à incrémenter
  • /

public btnListener (short tuind, int incrément) {
this.incrément = incrément ;
this.tuind = tuind ;
} // fin de btnListener

public void actionPerformed(ActionEvent e) {
if (DEBUG) System.out.println( "*** DEBUG *** btnListener::actionPerformed, tuileNum["+tuind+"] = "+tuileNum[tuind]+", incrément = "+incrément);
tuileNum[tuind] = tuileNum[tuind] + incrément ;
Construimage ( ) ;
if (tuileNum[icolgauche] == tuileNum[icoldroite]) { btwmoins.setVisible(false); btemoins.setVisible(false); }
else { btwmoins.setVisible(true); btemoins.setVisible(true); }
if (tuileNum[irangsup] == tuileNum[iranginf]) { btnmoins.setVisible(false); btsmoins.setVisible(false); }
else { btnmoins.setVisible(true); btsmoins.setVisible(true); }
pancarte.repaint();
pack() ;
}
}
static void Verticalize (JButton btn, String caption, boolean clockwise) {
Font f = btn.getFont ();
FontMetrics fm = btn.getFontMetrics (f);
int captionHeight = fm.getHeight ();
int captionWidth = fm.stringWidth (caption);
BufferedImage bi = new BufferedImage (captionHeight + 4,
captionWidth + 4, BufferedImage.TYPE_INT_ARGB);
Graphics2D g = (Graphics2D) bi.getGraphics ();

g.setColor (new Color (0, 0, 0, 0)); // transparent
g.fillRect (0, 0, bi.getWidth (), bi.getHeight ());

g.setColor (btn.getForeground ());
g.setFont (f);
g.setRenderingHint (RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);

if (clockwise) {
g.rotate (Math.PI / 2);
} else {
g.rotate (- Math.PI / 2);
g.translate (-bi.getHeight (), bi.getWidth ());
}
g.drawString (caption, 2, -6);

Icon icon = new ImageIcon (bi);
btn.setIcon (icon);

btn.setMargin (new Insets (15, 2, 15, 2));
btn.setActionCommand (caption);
}

private void Construimage () {
image = new BufferedImage (largeurtuile * (tuileNum[icoldroite] - tuileNum[icolgauche] + 1), hauteurtuile * (tuileNum[iranginf] - tuileNum[irangsup] + 1), BufferedImage.TYPE_INT_RGB) ;
if (DEBUG) System.out.println( "*** DEBUG *** Construimage, largeur image="+image.getWidth()+", hauteur d'image="+image.getHeight()+", tuileNum[irangsup]= "+tuileNum[irangsup]+", tuileNum[icolgauche]= "+tuileNum[icolgauche]+", tuileNum[iranginf]= "+tuileNum[iranginf]+", tuileNum[icoldroite]= "+tuileNum[icoldroite]);
Graphics g = image.getGraphics();
BufferedImage tuile = null ;
for (int r = tuileNum[irangsup] ; r <= tuileNum[iranginf] ; r++) // pour chaque rangée
for (int c = tuileNum[icolgauche] ; c <= tuileNum[icoldroite] ; c++) { // pour chaque colonne
try {
HttpURLConnection httpcon = (HttpURLConnection) (new URL(URL1+defargs[argmat]+URL2+ String.valueOf(r) + "&TileCol=" + String.valueOf(c) )).openConnection();
httpcon.setRequestProperty("User-Agent", "Mozilla/5.0 Gecko/20100101"); // contourne l'erreur 403
InputStream in = httpcon.getInputStream() ;
tuile = ImageIO.read(in);
tuile.addTileObserver(null) ;
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
g.drawImage(tuile, largeurtuile * (c - tuileNum[icolgauche]), hauteurtuile * (r - tuileNum[irangsup]), null);
} // pour chaque colonne
imcarte.setImage(image) ;
if (DEBUG) System.out.println( "*** DEBUG *** Construimage, largeur imageIcon="+imcarte.getIconWidth()+", hauteur d'imageIcon="+imcarte.getIconHeight());
} // Construimage

public static void main(String[] args) { // méthode principale
/** Le premier argument donne le nom de l'image qui sera créée en sortie de programme
  • et les 2 arguments suivants donnent les coordonnées (longitude et latitude) du point central de la carte,
  • et le dernier donne le niveau de zoom de la carte résultante (pour l'instant seul 15 est implémenté)
  • Ex Plainfaing.png 7.014816999999994 48.17267500000001 15
  • args[0] : fichier image en sortie
  • args[1] : longitude en degrés décimaux (DD) du point central de la carte
  • args[2] : latitude en degrés décimaux (DD) du point central de la carte
  • args[3] : niveau de zoom (pour l'instant seul 15 est implémenté)
  • Algorithme
  • 1 Si l'utilisateur a donné des arguments sur la ligne de commande alors remplacer les arg par défault par ces derniers
  • 2 forcer le niveau de zoom à 15
  • 3 calculer l'espace disponible ds l'écran d'affichage et en déduire les nbs de tuiles affichables
  • 4 calculer les rang et col de tuiles selon l'algorithme donné en https://geoservices.ign.fr/documentation/geoservices/wmts.html#rsolutions-et-chelles-en-webmercator-sphrique
  • /

if (args.length == 4) defargs = args ; // des arguments sont là // les arguments n'étaient pas là
if (Short.valueOf(defargs[argmat]) < 15 || Short.valueOf(defargs[argmat]) > 15) defargs[argmat] = "15" ;
if (DEBUG) System.out.println( "*** DEBUG *** main, nom = "+defargs[0]+", longitude = "+defargs[arglon]+", latitude = "+defargs[arglat]+", defargs[argmat] = "+defargs[argmat]+", IndRESOLUTION = "+IndRESOLUTION+", TabMatrix[0][0] = "+TabMatrix[0][0]);
nbTuilesHaut = screenSize.height / hauteurtuile ; nbTuilesLarg = screenSize.width / largeurtuile ;
if (DEBUG) System.out.println( "*** DEBUG *** main, screenSize.height = "+screenSize.height+", screenSize.width = "+screenSize.width+ ", nbTuilesHaut = "+nbTuilesHaut +", nbTuilesLarg = "+nbTuilesLarg);
tuileNum[irangsup] = (int) ((TabMatrix[Short.valueOf(defargs[argmat])][IndTopLeftCornerY0] - mayAxisProjectionSphericalMercator.convertir(Double.valueOf(defargs[arglat])))/(TabMatrix[15][IndRESOLUTION] * hauteurtuile)) - nbTuilesHaut/2;
tuileNum[iranginf] = tuileNum[irangsup] + nbTuilesHaut ;
tuileNum[icolgauche] = (int) ((maxAxisProjectionSphericalMercator.convertir(Double.valueOf(defargs[arglon]))-TabMatrix[Short.valueOf(defargs[argmat])][IndTopLeftCornerX0])/(TabMatrix[15][IndRESOLUTION] * hauteurtuile)) - nbTuilesLarg/2;
tuileNum[icoldroite] = tuileNum[icolgauche] + nbTuilesLarg ;
if (DEBUG) System.out.println( "*** DEBUG *** main, tuileNum[irangsup] = "+tuileNum[irangsup]+", tuileNum[icolgauche] = "+tuileNum[icolgauche]+", tuileNum[iranginf] = "+tuileNum[iranginf]+", tuileNum[icoldroite] = "+tuileNum[icoldroite]);
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new LoadTuilesIGN (defargs[0]) ;
}
});
} // méthode principale
}

Compatibilité : 0.91
Ajouter un commentaire

Commentaires

Commenter la réponse de mant2011

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.