LoadTuilesIGN

Soyez le premier à donner votre avis sur cette source.

Snippet vu 2 851 fois - Téléchargée 3 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
}*


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

Compatibilité : 0.91
Ajouter un commentaire Commentaires
tarek_dotzero Messages postés 817 Date d'inscription jeudi 19 juillet 2007 Statut Membre Dernière intervention 12 avril 2022
3 mars 2019 à 11:33
Le code fonctionne bien, mais j'ai quelques propositions :
  • Le code nécessite un refactoring pour le rendre plus lisible, à titre d'exemple, séparer la configuration et créer une représentation des actions (zoom in et out).
  • Il est aussi possible de mettre le code de récupération de l'image dans un thread à part : l'UI bloque au moment de chargement.
  • Améliorer l'UI avec des hints et en proposant où sauvegarder l'image à la fin.
Whismeril Messages postés 18301 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 29 mars 2023 622
3 mars 2019 à 08:30
Salut, un modérateur l'a fait
tarek_dotzero Messages postés 817 Date d'inscription jeudi 19 juillet 2007 Statut Membre Dernière intervention 12 avril 2022
3 mars 2019 à 00:05
C'est vraiement illisible. SVP, ajoutez la balise "code"
Whismeril Messages postés 18301 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 29 mars 2023 622
Modifié le 27 déc. 2018 à 11:13
Bonjour,

Plutot que de poster 2 sources. Tu aurais pu mettre l’autre à jour.
Et tant que tu y es, ajouter la coloration syntaxique histoire que ce soit lisible.
Voir ici https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
mant2011 Messages postés 2 Date d'inscription lundi 1 août 2011 Statut Membre Dernière intervention 27 décembre 2018
27 déc. 2018 à 08:15
Voici une nouvelle version de https://codes-sources.commentcamarche.net/source/54980-creation-de-cartes-a-partir-du-geoportail-de-l-ign#opinions ; le résultat est le même ; les arguments donnés sur la ligne de commande ont changé : sauf le premier qui est tjrs le nom du fichier qui sera l'image de la carte résultat, les 2è et 3è sont respectivement les longitude et latitude en degrés décimaux du lieu central de la carte, le 4è est le degré de zoom de la carte (seule la valeur 15 est implémentée, mais le programme est facilement extensible pour les autres) ; mais on peut lancer à titre d'exemple "java -jar LoadTuilesIGN.jar" équivalent à "java -jar LoadTuilesIGN.jar Plainfaing.png 7.014816999999994 48.17267500000001 15" ; à vs de changer les arguments

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.