Création de cartes à partir du géoportail de l'ign

Soyez le premier à donner votre avis sur cette source.

Snippet vu 7 785 fois - Téléchargée 18 fois

Contenu du snippet

Ce programme extrait des dalles de cartes IGN et génère en sortie une carte ajustable dynamiquement. Exemple de script de lancement : "java LoadImageApp plainfaing.png 11365 17020 11368 17023" où "plainfaing.png" est le nom de l'image qui sera créée en sortie de programme et les couples "11365 17020" d'une part et "11368 17023" d'autre part sont d'une part, les N° de rangée et de colonne de la dalle de coin en haut et à gauche d'autre part, les N° de rangée et de colonne de la dalle de coin en bas et à droite tels qu'on peut les trouver ds le cache de FireFox après une visite sur Geoportail de l'endroit d'où on veut extraire la carte.
Ce programme simplifie la procédure décrite en http://jrepetto.free.fr/ttmaps/geoportail

Source / Exemple :


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

public class LoadImageApp extends JFrame {
    private static final boolean DEBUG = false;
    private static BufferedImage image ;
    private JButton btnplus, btnmoins, btwplus, btwmoins, btsplus, btsmoins, bteplus, btemoins ;
    private    final short  hauteurtuile = 256 ;
    private    final short  largeurtuile = 256 ; 
    private int iranghaute, irangbasse, icolgauche, icoldroite ;  
    private    JScrollPane pancarte ;                                           // panneau image
    private    ImageIcon    imcarte = new ImageIcon ();
    private int rwidth, rheight ;                                               // taille JFrame
    private int swidth, sheight ;

    public LoadImageApp (String nomfichier, String rangsup, String colgauche, String ranginf, String coldroite) {
        super ("Géoportail crawler V0.9") ;
        final File outputfile = new File(nomfichier);
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); // get the screen size as a java dimension
        sheight = screenSize.height * 3 / 4 ;                 // get 3/4 of the height, and 3/4. of the width
        swidth = screenSize.width * 3 / 4 ;
        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);
                }
            });
        iranghaute = Integer.parseInt(rangsup) ; irangbasse = Integer.parseInt(ranginf) ;
        icolgauche =Integer.parseInt(colgauche) ; icoldroite =Integer.parseInt(coldroite) ;
        rwidth = Math.min(swidth, largeurtuile * (icoldroite - icolgauche + 1)) ;
        rheight = Math.min(sheight, hauteurtuile * (irangbasse - iranghaute + 1)) ;
        if (DEBUG) System.out.println( "*** DEBUG *** LoadImageApp,swidth="+swidth +", sheight="+sheight+", rwidth="+rwidth+", rheight="+rheight);
        Construimage ( ) ;
        setPreferredSize(new Dimension(rwidth, rheight)); setLocation (50,50) ;
        pancarte = new JScrollPane(new JLabel(imcarte)) ;
        getContentPane().add(pancarte, BorderLayout.CENTER ) ;
        Ecouteurbtn ec = new Ecouteurbtn () ;
        JPanel Panboun = new JPanel () ;
        btnplus = new JButton ("+") ; btnplus.setPreferredSize(new Dimension(rwidth/5,15)); btnplus.addActionListener(ec); Panboun.add(btnplus) ;
        btnmoins = new JButton ("-") ; btnmoins.setPreferredSize(new Dimension(rwidth/5,15)); btnmoins.addActionListener(ec); Panboun.add(btnmoins) ;
        getContentPane().add(Panboun, BorderLayout.NORTH ) ;
        JPanel Panbouw = new JPanel () ;  Panbouw.setLayout(new BoxLayout(Panbouw, BoxLayout.Y_AXIS) );
        btwmoins = new JButton () ; Verticalize (btwmoins, "-", false) ; btwmoins.setPreferredSize(new Dimension(15,rheight/5)); btwmoins.addActionListener(ec); Panbouw.add(btwmoins) ;
        btwplus = new JButton () ; Verticalize (btwplus, "+", false) ; btwplus.setPreferredSize(new Dimension(15,rheight/5)); btwplus.addActionListener(ec); Panbouw.add(btwplus) ;
        getContentPane().add(Panbouw, BorderLayout.WEST ) ;
        JPanel Panbous = new JPanel () ;
        btsmoins = new JButton ("-") ; btsmoins.setPreferredSize(new Dimension(rwidth/5,15)); btsmoins.addActionListener(ec); Panbous.add(btsmoins) ;
        btsplus = new JButton ("+") ; btsplus.setPreferredSize(new Dimension(rwidth/5,15)); btsplus.addActionListener(ec); Panbous.add(btsplus) ;
        getContentPane().add(Panbous, BorderLayout.SOUTH ) ;
        JPanel Panboue = new JPanel () ;  Panboue.setLayout(new BoxLayout(Panboue, BoxLayout.Y_AXIS) );
        bteplus = new JButton () ; Verticalize (bteplus, "+", true) ; bteplus.setPreferredSize(new Dimension(15,rheight/5)); bteplus.addActionListener(ec); Panboue.add(bteplus) ;
        btemoins = new JButton () ; Verticalize (btemoins, "-", true) ; btemoins.setPreferredSize(new Dimension(15,rheight/5)); btemoins.addActionListener(ec); Panboue.add(btemoins) ;
        if (icolgauche == icoldroite) { btwmoins.setVisible(false); btemoins.setVisible(false); }
        if (iranghaute == irangbasse) { btnmoins.setVisible(false); btsmoins.setVisible(false); }
        getContentPane().add(Panboue, BorderLayout.EAST ) ; 
        pack() ;
        setVisible(true) ;
    }
    public class Ecouteurbtn implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            Object source = e.getSource();
            if(source == btnplus)                iranghaute--;          
            else if(source == btnmoins)                iranghaute++; 
            else if(source == btwplus)                icolgauche--;          
            else if(source == btwmoins)                icolgauche++; 
            else if(source == btsplus)                irangbasse++;          
            else if(source == btsmoins)                irangbasse--; 
            else if(source == bteplus)                icoldroite++;          
            else if(source == btemoins)                icoldroite--; 
            Construimage ( ) ;
            if (icolgauche == icoldroite) { btwmoins.setVisible(false); btemoins.setVisible(false); }
            else { btwmoins.setVisible(true); btemoins.setVisible(true); }
            if (iranghaute == irangbasse) { 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 () {
        if (DEBUG) System.out.println( "*** DEBUG *** Construimage, irangbasse="+irangbasse+", iranghaute="+iranghaute+", icoldroite="+icoldroite+", icolgauche="+icolgauche);
        image = new BufferedImage (largeurtuile * (icoldroite - icolgauche + 1), hauteurtuile * (irangbasse - iranghaute + 1), BufferedImage.TYPE_INT_RGB) ;
        if (DEBUG) System.out.println( "*** DEBUG *** Construimage, largeur image="+image.getWidth()+", hauteur d'image="+image.getHeight());
        Graphics g = image.getGraphics();
        BufferedImage tuile = null ;
           for (int r = iranghaute; r <= irangbasse ; r++)   // pour chaque rangée
            for (int c = icolgauche ; c <= icoldroite ; c++) {  // pour chaque colonne
                try {	 
                    URL urlImage = new URL("http://gpp3-wxs.ign.fr/..."+ String.valueOf(r) + "&TILECOL=" + String.valueOf(c) + "&extParamId=aHR0cDovL3d3dy5nZW9wb3J0YWlsLmdvdXYuZnIvYWNjdWVpbA==");	 
                    InputStream in = urlImage.openStream();
                    tuile = ImageIO.read(in);
                    tuile.addTileObserver(null) ;
                    in.close();	 
                } catch (MalformedURLException e) {	 
                    e.printStackTrace();	 
                } catch (IOException e) {        	 
                    e.printStackTrace();	 
                }            
                g.drawImage(tuile, largeurtuile * (c - icolgauche), hauteurtuile * (r - iranghaute), 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
        /**

  • args[0] : nom du fichier image en sortie
  • args[1] : numéro de rangée supérieure
  • args[2] : numéro de colonne gauche
  • args[3] : numéro de rangée inférieure
  • args[4] : numéro de colonne droite
  • /
final String[] brgs = args ; if (DEBUG) System.out.println( "*** DEBUG *** main, brgs[0] = "+brgs[0]+", brgs[1]="+brgs[1]+", brgs[2]="+brgs[2]+", brgs[3]="+brgs[3]+", brgs[4]="+brgs[4]); SwingUtilities.invokeLater(new Runnable() { public void run() { new LoadImageApp (brgs[0], brgs[1], brgs[2], brgs[3], brgs[4]) ; } }); } // méthode principale }

A voir également

Ajouter un commentaire Commentaires
Messages postés
4
Date d'inscription
vendredi 25 avril 2014
Statut
Membre
Dernière intervention
10 mai 2014

Je continue mon petit monologue, sauf que c'est mon dernier message, puisque le script fonctionne ici => http://forum.ubuntu-fr.org/viewtopic.php?id=1559421
Merci encore à soshy.
Messages postés
4
Date d'inscription
vendredi 25 avril 2014
Statut
Membre
Dernière intervention
10 mai 2014

Salut,

C'est en réalité un fichier source Java, pas un script.
Un script est directement exécutable.
En java, le fichier source doit être compilé, et ensuite seulement, exécuté.

compilation du programme :

javac LoadImageApp.java

Il y a un fichier .class de généré.

Ensuite il faut l'exécuter avec :

java LoadImageApp plainfaing.png 11365 17020 11368 17023

Mais l'URL dans le script est faux (problème d'API!).

Affaire à suivre...

Merci soshy!
Messages postés
4
Date d'inscription
vendredi 25 avril 2014
Statut
Membre
Dernière intervention
10 mai 2014

Salut,

je n'ai pas réussi à faire tourner ce script. Je pense qu'il ne fonctionne pas à cause de la résolution IGN sur geoportail, qui n'est pas à 1:25 000 pile mais à 27 084.

Pour ceux qui souhaiterais tout de même essayer, la démarche à suivre est la suivante :

- dans un bloc note, coller le script et nommer le fichier LoadImageApp.java (pas de .txt à la fin bien sûr)

- se déplacer dans le dossier qui contient le fichier, ex : cd c:\Users\

- lancer le script avec la la commande suivante (en ayant au préalable installé JDK de java!) javac LoadImageApp.java plainfaing.png 11365 17020 11368 17023
11365 et 17020 sont respectivement les numéros de lignes et de colonnes obtenus dans le cache de votre navigateur, (par cacheviewer par exemple). Le premier couple désigne l'image en haut à gauche, le deuxième couple désigne l'image en bas à droite, de sorte d'encadrer la carte que vous souhaiter obtenir.

J'ai toujours obtenu ce message d'erreur :
javac: invalid flag: 11365
Usage: javac <options> <source files>
use -help for a list of possible options


si quelqu'un trouve la solution merci de partager!
Messages postés
4
Date d'inscription
vendredi 25 avril 2014
Statut
Membre
Dernière intervention
10 mai 2014

Bonjour,

je déterre ce topic, qui le mérite je pense!

je suis intéressé par ton script, mais comme je suis un noob, je ne sais pas comment utiliser le script, que ça soit sous windows ou sous linux.

J'ai mis le script dans un bloc note, et après? J'ai essayé de comprendre en fouinant sur google, mais le jargon me manque pour comprendre ;)

En tout cas c'est une super initiative!

Merci!

Mika.
Merci MANT2011, ça marche ! J'avais bien suivi cette procédure mais omis de régler l'échelle à 1/25000, ce qui fait que TILEROW et TILECOL avaient des valeurs trop faibles et l'application générait une erreur.
Afficher les 9 commentaires

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.

Du même auteur (mant2011)