Pages: 1
- Sujet précédent - [GeoTools] Affichage de shapefiles dans une seule fenêtre - Sujet suivant
#1 Tue 13 July 2010 11:30
- Paul
- Participant assidu
- Lieu: Paris
- Date d'inscription: 31 Jul 2008
- Messages: 158
[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: 158
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: 158
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
Pages: 1
- Sujet précédent - [GeoTools] Affichage de shapefiles dans une seule fenêtre - Sujet suivant