banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

GEODATA DAYS 2024

#1 Tue 13 July 2010 11:30

Paul
Participant assidu
Lieu: Paris
Date d'inscription: 31 Jul 2008
Messages: 157

[GeoTools] Affichage de shapefiles dans une seule fenêtre

Bonjour,

Je suis un nouveau dans le monde Java/GeoTools. J'aimerais pour l'instant avoir une fenêtre avec une barre de menu et lorsque je vais dans > Menu Fichier > Ajouter une couche, avoir une invite de navigation vers mon shape et qu'il s'affiche dans la fenêtre principale du programme.
Mon souci c'est que j'arrive bien à afficher un shapefile, mais il me l'affiche dans une nouvelle fenêtre JMapFrame (en suivant les instructions de cette page : http://docs.geotools.org/stable/usergui … tart.html)
Si je comprends bien il faudrait que je lui dise d'afficher mon shapefile dans mon JMapPane qui se trouve sur la fenêtre principale ??

Je joins mon code à ce message.

Si quelqu'un a une solution, je suis preneur avec joie !

Merci d'avance !

Paul

Le code :

package HydrocalSpatial;

import java.io.File;

import java.io.IOException;

import javax.swing.*;

import java.awt.*;
import java.awt.event.*;

import org.geotools.data.FeatureSource;
import org.geotools.data.FileDataStore;
import org.geotools.data.FileDataStoreFinder;
import org.geotools.map.DefaultMapContext;
import org.geotools.map.DefaultMapLayer;
import org.geotools.map.MapContext;
import org.geotools.map.MapLayer;
import org.geotools.swing.JMapFrame;
import org.geotools.swing.JMapPane;
import org.geotools.swing.data.JFileDataStoreChooser;


class EckhardtSIG extends JFrame
{
    //On définit un JMapPane qui recuillera nos couches
    private JMapPane mapPane = new JMapPane();
    private MapContext mapContext;
   
    //Un constructeur de la classe EckhardtSIG
    public EckhardtSIG()
    {
        //On definit une fenêtre principale qu'on affiche directement en plein écran
        //et qu'on baptise "JHydrocal"
        JFrame fenPrincipale = new JFrame();
        fenPrincipale.setExtendedState(MAXIMIZED_BOTH);
        fenPrincipale.setTitle("JHydrocal");
       
        //On construit une barre de menu et une zone de carte
        fenPrincipale.setJMenuBar(buildMenu());
        //fenPrincipale.getContentPane().add(BorderLayout.CENTER,buildMap());
       
        //On place le JMapPane fond de carte
        mapPane.setVisible(true);
        mapPane.setBackground(Color.blue);
        this.getContentPane().add(BorderLayout.CENTER,mapPane);
       
        //On rend la fénêtre visible
        fenPrincipale.setVisible(true);
    }
   
    //Une classe de construction de la barre de menu, des menus et des items
    private JMenuBar buildMenu()
    {
        //Construction de la barre de menu JMenuBar
        JMenuBar menu = new JMenuBar();
       
        //Construction des menus
        //Un menu "Fichier"
        JMenu mFichier = new JMenu("Fichier");
        //Un menu "A propos"
        JMenu mAPropos = new JMenu("?");
       
        //On ajoute le menu "Fichier" à la barre de menu
        menu.add(mFichier);
        //On ajoute le menu "?" à la barre de menu
        menu.add(mAPropos);
       
        //Construction des items du menu Fichier
        //Un item "Ajouter une couche vecteur"
        JMenuItem iAjoutVecteur = new JMenuItem("Ajouter une couche vecteur");
        //Un item "Quitter"
        JMenuItem iQuitter = new JMenuItem("Quitter JHydrocal");
       
       
        iAjoutVecteur.addActionListener(new ActionListener()
        {

            public void actionPerformed(ActionEvent e)
            {
                ImportVecteur importVecteur = new ImportVecteur(mapContext);
                try
                {
                importVecteur.ouvreAfficheShp();
                }
                catch(Exception exp)
                {
                }
                mapPane.setMapContext(mapContext);
            }
        });
           
       
        //On associe l'action de quitter le programme lorsqu'on clique sur "Quitter"
        //via une classe anonyme
        iQuitter.addActionListener(new ActionListener()
        {

            public void actionPerformed(ActionEvent e)
            {
                System.exit(0);
            }
        });
       
        //On ajoute ces deux items au menu Fichier
        mFichier.add(iAjoutVecteur);
        mFichier.add(iQuitter);
       
        //On retourne l'objet menu
        return menu;
       
    }
}



class ImportVecteur
{
    MapContext mapContext;
   
    ImportVecteur(MapContext mapContext)
    {
        this.mapContext = mapContext;
    }
   
    public MapContext ouvreAfficheShp() throws Exception
    {
        File coucheVecteur = JFileDataStoreChooser.showOpenFile("shp", null);
        if (coucheVecteur == null)
        {
            return mapContext;
        }
        FileDataStore store = FileDataStoreFinder.getDataStore(coucheVecteur);
        FeatureSource featureSource = store.getFeatureSource();
       
        mapContext = new DefaultMapContext();
        mapContext.addLayer(featureSource, null);
        return mapContext;
    }
}



public class EckhardtSpatial
{
    public static void main(String[] args)
    {
        EckhardtSIG eckhardtSIG = new EckhardtSIG();
       
        System.out.println("OK");
    }
}

P.S. : désolé pour la longueur du message...


Paul

Hors ligne

 

#2 Thu 15 July 2010 10:45

Paul
Participant assidu
Lieu: Paris
Date d'inscription: 31 Jul 2008
Messages: 157

Re: [GeoTools] Affichage de shapefiles dans une seule fenêtre

Bonjour tout le monde,

J'ai changé de stratégie, je passe par une JMapFrame directement. Mais j'ai un souci. Avec le code que je mets en copie, lorsque je clique sur "Fichier" > "Ouvrir une couche vecteur", j'obtiens le message d'ereur suivant
"java.lang.NullPointerException"
Et je ne comprends pas quel objet "null" pose problème. L'erreur survient à la ligne en gras
fenMap.setMapContext(mapContext);
Après vérification, ni fenMap ni mapContext ne sont null

Je sèche, si l'un ou l'une d"entre vous a une réponse, ce serait magnifique !

Bonne journée

Paul P.


Code:

package HydrocalSpatial;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;

import javax.swing.*;

import org.geotools.data.FeatureSource;
import org.geotools.data.FileDataStore;
import org.geotools.data.FileDataStoreFinder;
import org.geotools.map.DefaultMapContext;
import org.geotools.map.MapContext;
import org.geotools.swing.JMapFrame;
import org.geotools.swing.data.JFileDataStoreChooser;


class EckhardtSIG2
{
    //On créé une JMapFrame
    static JMapFrame fenMap = new JMapFrame();
    //On déclare un MapContext qui accueillera nos couches
    //private MapContext mapContext = new DefaultMapContext();
    
    public EckhardtSIG2()
    {
        fenMap.setSize(1200, 900);
        fenMap.setTitle("JHydrocal");
        
        //*******************Création du menu***************
        //La barre de menu
        JMenuBar barreMenu = new JMenuBar();
    
        //Création des menus
        //Un menu "Fichier"
        JMenu mFichier = new JMenu("Fichier");
        JMenu mAPropos = new JMenu("?");
        //On ajoute les menus à la barre de menu
        barreMenu.add(mFichier);
        barreMenu.add(mAPropos);
    
        //Création des items
        //Un item "Ajouter une couche vecteur" dans le menu Fichier
        JMenuItem iAjoutVecteur = new JMenuItem("Ajouter une couche vecteur");
        //Un item "Quitter" dans le menu Fichier
        JMenuItem iQuitter = new JMenuItem("Quitter JHydrocal");
        //Un item "A propos dans le menu ?
        JMenuItem iAPropos = new JMenuItem("A propos de JHydrocal");
        //On ajoute les items aux menus
        mFichier.add(iAjoutVecteur);
        mFichier.add(iQuitter);
        mAPropos.add(iAPropos);
        
        //On ajoute la barre de menu à la fenêtre
        fenMap.setJMenuBar(barreMenu);
        
        MapContext map = new DefaultMapContext();
        
        fenMap.enableLayerTable(true);
        fenMap.setMapContext(map);
        fenMap.setVisible(true);
        
        //*******************Intéraction des menus***************
        //On associe l'action d'aller chercher un shapefile et de l'afficher lorsqu'on
        //clique sur l'item "Ajouter une couche vecteur"
        iAjoutVecteur.addActionListener(new ActionListener() 
        {
            public void actionPerformed(ActionEvent e)
            {
                try
                {
                    ImportVecteur2 importVecteur = new ImportVecteur2(fenMap);
                    importVecteur.chercheAfficheVecteur();
                }
                catch(Exception exp)
                {
                }
            }
        });
        
        //On associe l'action "quitter" lorsqu'on clique sur l'item "Quitter JHydrocal"
        //via une classe anonyme
        iQuitter.addActionListener(new ActionListener() 
        {
            public void actionPerformed(ActionEvent e) 
            {
                System.exit(0);
            }
        });
       
    }
}


class ImportVecteur2
{
    private JMapFrame fenMap;
    private MapContext mapContext;
    ImportVecteur2(JMapFrame fenMap)
    {
        //this.mapContext = mapContext;
        this.fenMap = fenMap;
    }
    
    public void chercheAfficheVecteur() //throws Exception
    {
        try
        {
        File file = JFileDataStoreChooser.showOpenFile("shp", null);
        if (file == null) 
        {
            return;
        }
        
        FileDataStore store = FileDataStoreFinder.getDataStore(file);
        FeatureSource featureSource = store.getFeatureSource();
        
        // Create a map context and add our shapefile to it
        mapContext = new DefaultMapContext();
        mapContext.addLayer(featureSource, null);
        
        // Now display the map
        fenMap.enableLayerTable(true);
       [b] fenMap.setMapContext(mapContext);[/b]
        fenMap.setVisible(true);
        }
catch(Exception e)
        {
            System.out.println(e);
        }
    }
}

public class EckhardtSpatial2 
{

    public static void main(String[] args) 
    {
        EckhardtSIG2 eckhardtSIG = new EckhardtSIG2();
        
        System.out.println("OK");
    }

}

Paul

Hors ligne

 

#3 Fri 16 July 2010 10:52

Paul
Participant assidu
Lieu: Paris
Date d'inscription: 31 Jul 2008
Messages: 157

Re: [GeoTools] Affichage de shapefiles dans une seule fenêtre

Je me réponds, histoire de clore ce sujet.

J'ai trouvé la solution, elle était vraiment idiote, j'en ai presque honte...
Dans la classe ImportVecteur2, il suffisait de supprimer la ligne
mapContext = new DefaultMapContext();
Vraiment tout bête.

Bonne journée à tous !

P.S. : est-il possible de mettre un [Résolu] au sujet ?


Paul

Hors ligne

 

Pied de page des forums

Powered by FluxBB