Cartographie avec GeoTools


précédentsommairesuivant

II. Première carte

Chap1Contact.java

II-A. Le décor

Commençons par récupérer les librairies qui nous seront nécessaires.
GeoTools : http://geotools.codehaus.org/Downloadshttp://geotools.codehaus.org/Downloads
JAI : https://jai.dev.java.net/binary-builds.htmlhttps://jai.dev.java.net/binary-builds.html
Et deux fichiers de données : shapefilesshapefiles

JAI est une API pour la lecture et le traitement des images, il est fortement conseillé de l'avoir avec Geotools car certaines fonctions nécessitent celle-ci afin d'améliorer la vitesse ou simplement afin de marcher.

Commençons par une petite fenêtre, rien que du classique :

 
Sélectionnez

public Main() {        
	JFrame frm = new JFrame();
	frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	frm.setSize(800,600);
	frm.setTitle("Ma Première carte avec GeoTools");
 
 
	JPanel pfond = new JPanel(new BorderLayout());
	frm.setContentPane(pfond);
 
	frm.setJMenuBar(buildMenu());
	frm.getContentPane().add(BorderLayout.CENTER,buildMap());
	frm.getContentPane().add(BorderLayout.NORTH,buildTool());
 
	frm.setVisible(true);        
}
 
private JMenuBar buildMenu() {
	JMenuBar menu = new JMenuBar();
	JMenu mfichier = new JMenu("Fichier");
	JMenuItem iquitter = new JMenuItem("Quitter");
	iquitter.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent e) {
			System.exit(0);
		}
	});
	mfichier.add(iquitter);
	menu.add(mfichier);
 
    return menu;
}

II-B. La carte

Voyons maintenant ce qui nous intéresse vraiment.

Nous allons prendre soin de déclarer un objet JMapPane pour la classe :

 
Sélectionnez

private JMapPane mappane = new JMapPane();

Cet objet est le composant graphique qui va nous permettre de voir notre carte. Ce genre de composant graphique est assez rare dans GeoTools. GeoTools essaie de séparer le côté pratique (calcul, chargement des données ... ) de l'aspect visuel. On ne trouve donc que le strict minimum graphique dans GeoTools. La tâche de présentation est laissée aux développeurs que nous sommes.

 
Sélectionnez

    private JPanel buildMap() {
 
        mappane.setBackground(new Color(157,201,255));
 
        try{
 
            MapContext mapcontext = new DefaultMapContext();
            mapcontext.setTitle( "Projet" );
 
            mappane.setContext(mapcontext);
 
            MapLayer maplayer;   

On commence par donner une couleur de fond bleu à notre composant graphique.
Voilà un nouvel objet, le MapContext, celui-ci représente notre projet au sens cartographique. Cet objet va stocker les informations, par exemple les différentes couches (fichiers) qui ont été chargées, la projection (la représentation du global terrestre) ou encore l'ordre des couches présentes.

La classe Mapcontext est une interface tandis que DefaultMapContext en est une implémentation. Dans GeoTools il y a de très nombreuses interfaces, il est conseillé de manipuler les objets par leur interface.
Petite chose à noter, GeoTools est en constante mutation, si vous tombez sur des méthodes ou des classes dépréciées parmi les exemples que je donne ou sur le site officiel, ne soyez pas surpris.

L'objet MapLayer est une couche qui sera ajoutée au MapContext.

Si vous êtes assez peu familier avec les termes SIG, je vous propose d'aller explorer les liens ci-dessous :
http://www.cartographie.ird.fr/publi/documents/sig1.pdfhttp://www.cartographie.ird.fr/publi/documents/sig1.pdf
http://fr.wikipedia.org/wiki/Système_d'information_géographiquehttp://fr.wikipedia.org/wiki/Système_d'information_géographique

Ainsi que ce document (trouvé au hasard) qui montre bien le problème de la représentation cartographique :
Il ne s'agit pas de le comprendre mais juste de constater que ce n'est pas chose aisée.
http://www.carto.net/papers/florent_chuffart/florent_chuffart_-_webmapping_3D.pdfhttp://www.carto.net/papers/florent_chuffart/florent_chuffart_-_webmapping_3D.pdf

 
Sélectionnez

            URL shapeURL = Main.class.getResource("/occ_sol.shp");
 
            ShapefileDataStore store = new ShapefileDataStore(shapeURL);
            String name = store.getTypeNames()[0];
            FeatureSource source = store.getFeatureSource(name);
 

Ci-dessus il s'agit de récupérer des données vectorielles contenues dans un fichier shape (.shp).
On récupère l'URL de ce fichier puis on construit un ShapefileDataStore avec. Le fichier peut être situé à différents endroits, en local, sur un serveur ou dans le jar de l'application.
Le ShapefileDataStore ou plus généralement les DataStore sont des classes qui vont nous permettre de lire et écrire nos données.
Le FeatureSource correspond au jeu de données une fois en mémoire, on pourra parcourir les éléments grâce à lui.

Je reviendrai plus avant sur les DataStore dans un prochain article.

 
Sélectionnez

            StyleBuilder sb = new StyleBuilder();
 
            PolygonSymbolizer ps = sb.createPolygonSymbolizer( new Color(253,241,187),new Color(163,151,97),1);
            Style solstyle = sb.createStyle();
            solstyle.addFeatureTypeStyle(sb.createFeatureTypeStyle(ps));            

Maintenant que nous avons chargé nos données vectorielles, il faut leur attribuer un style, autrement la façon dont on visualisera les géométries sur la carte. Ici on crée une symbologie pour un polygone avec sa couleur de fond, sa couleur de contour et l'epaisseur du contour.

Je reviendrai plus avant sur la Symbologie dans un prochain article.

 
Sélectionnez

            maplayer = new DefaultMapLayer(source,solstyle);
            maplayer.setTitle("occ_sol.shp");
            maplayer.setVisible(true);
            maplayer.setQuery(Query.ALL);
            mapcontext.addLayer(maplayer);

Les données et le style définis, on peut maintenant créer notre couche, lui donner un nom et la rendre visible, on termine en l'ajoutant au mapcontext. Le "maplayer.setQuery(Query.ALL);" signifie que l'on veut que toutes les données soient visibles, on pourrait très bien choisir de n'afficher que les données selon un certain attribut.

Je reviendrai plus avant sur le requêtage dans un prochain article.

 
Sélectionnez

            shapeURL = Menu.class.getResource("/reseau_route.shp");
 
            store = new ShapefileDataStore(shapeURL);
            name = store.getTypeNames()[0];
            source = store.getFeatureSource(name);
 
            sb = new StyleBuilder();
 
            LineSymbolizer ls2 = sb.createLineSymbolizer(Color.RED, 1);
            Style roadsStyle = sb.createStyle();
            roadsStyle.addFeatureTypeStyle(sb.createFeatureTypeStyle(ls2));
 
            maplayer = new DefaultMapLayer(source,roadsStyle);
            maplayer.setTitle("reseau_route.shp");
            maplayer.setVisible(true);
            maplayer.setQuery(Query.ALL);
            mapcontext.addLayer(maplayer);

Même chose que précédemment, on charge une nouvelle couche de données.

 
Sélectionnez

            StreamingRenderer render = new StreamingRenderer();
 
            mappane.setRenderer(render);
            mappane.setMapArea(mapcontext.getLayerBounds());
 
 
        } catch(Exception e){
            e.printStackTrace();
        }        
 
        return mappane;
    }

Le StreamingRenderer est un objet qui définit divers paramètres pour le rendu graphique des données, ignorez cela pour le moment.
On définit ensuite le MapArea (la zone visible de la carte) avec le rectangle englobant de nos données.

II-C. Le contrôle

 
Sélectionnez

    private JPanel buildTool() {
        JPanel outil = new JPanel(new FlowLayout(FlowLayout.LEFT));
 
        JButton plus = new JButton("+");
        plus.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                mappane.setState(JMapPane.ZoomIn);
            }
        });
        outil.add(plus);
 
        JButton moins = new JButton("-");
        moins.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                mappane.setState(JMapPane.ZoomOut);
            }
        });
        outil.add(moins);
 
        JButton pan = new JButton("Pan");
        pan.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                mappane.setState(JMapPane.Pan);
            }
        });
        outil.add(pan);
 
        return outil;
    }

Un seul élément à noter ici :
- mappane.setState(JMapPane.ZoomIn);
- mappane.setState(JMapPane.ZoomOut);
- mappane.setState(JMapPane.Pan);
Cela va changer le comportement de la navigation sur la carte quand on cliquera avec la souris.

II-D. Le Résultat


Si tout s'est bien passé vous devriez obtenir ceci :
Image non disponible
Voilà déjà un début intéressant.


précédentsommairesuivant

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

  

Copyright © 16/06/2007 Johann Sorel. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.