IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SIG : Système d'information Géographique Discussion :

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


Sujet :

SIG : Système d'information Géographique

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 19
    Points : 10
    Points
    10
    Par défaut [GeoTools] Affichage de shapefile 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/user...uickstart.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 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    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...

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 19
    Points : 10
    Points
    10
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    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);
            fenMap.setMapContext(mapContext);
        	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");
    	}
    
    }

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 19
    Points : 10
    Points
    10
    Par défaut
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mapContext = new DefaultMapContext();
    Vraiment tout bête.

    Bonne journée à tous !

  4. #4
    Membre chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    Par défaut
    Citation Envoyé par Chamois Rouge Voir le message
    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();
    Ca n'explique pas l'erreur. Ou plus probable, c'est la call stack qui est incomplete (c'est donc l'utilisation de cet objet qui a provoqué l'exception et non pas la ligne indiquée).

    a+

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 19
    Points : 10
    Points
    10
    Par défaut
    Bonjour hwoarang,

    Excuse moi, je ne suis pas encore un java-geek. Qu'appelles-tu "call stack" ??

    CR

  6. #6
    Membre chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    Par défaut
    C'est la pile d'appel. Elle contient la liste des fonctions appelantes à tous moment. Par exemple, si tu as :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void fct1() {
    fct2();
    }
    
    void fct2() {
    String str = null;
    str = ""; // Si tu mets un breakpoint ici
    }
    Si dans main(), tu appelles fct1, ta pile sera, au moment du breakpoint :
    main
    fct1
    fct2

    A partir d'une exception, tu peux afficher la pile avec
    e.printStackTrace();

    Je t'ai fait la remarque parce que dans la ligne que tu montres, il n'y a pas d'utilisation de pointeur donc il ne devrait pas y avoir de pointeur null. Par contre, il y a un appel à new DefaultMapContext(); qui, lui, peux utiliser un pointeur null. Autrement dit, l'exception doit etre levée dans la fonction appelee et pas à la ligne indiquée.

    a+

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 19
    Points : 10
    Points
    10
    Par défaut
    Je te remercie de cette réponse.

    Bonne journée à toi !

    CR

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 20/05/2010, 12h28
  2. [WD14] Deux boutons validation dans une seule fenêtre
    Par ilalaina dans le forum WinDev
    Réponses: 4
    Dernier message: 29/09/2009, 16h05
  3. graphique dans une seule fenêtre
    Par nostress dans le forum SAS STAT
    Réponses: 2
    Dernier message: 06/08/2008, 11h54
  4. [WinDev 12] 2 fichiers dans une seule fenêtre
    Par Xsara 167 cv dans le forum WinDev
    Réponses: 5
    Dernier message: 24/01/2008, 09h09
  5. Ouvrir une adresse dans une seule fenêtre
    Par efficks dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 01/04/2006, 10h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo