LoadTuilesIGN

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
}*


EDIT : Ajout des balises de code (modération !)

Compatibilité : 0.91

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.