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 :

Import de shapefile + geotoolkit


Sujet :

SIG : Système d'information Géographique

  1. #1
    Membre du Club
    Inscrit en
    Octobre 2010
    Messages
    111
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 111
    Points : 44
    Points
    44
    Par défaut Import de shapefile + geotoolkit
    bonjour ,
    je developpe une petite application cartographique avec geotoolkit , et là je voudrais avoir comme map un shapefile que j'ai en local , donc le code est a priori le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    java.net.URL pURL = new URL("//france_administrative.shp");
            DataStore pDS = DataStoreFinder.getDataStore("url",pURL);
            Name pName = pDS.getNames().iterator().next();
    FeatureCollection pFC = pDS.createSession(true).getFeatureCollection(QueryBuilder.all(pName));
    
    MapLayer pLayer = MapBuilder.createFeatureLayer(pFC, RandomStyleFactory.createDefaultVectorStyle(pFC));
    
    context.layers().add(pLayer);
    mais ca m'affiche le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Exception in thread "main" java.net.MalformedURLException: no protocol: //france_administrative.shp
            at java.net.URL.<init>(URL.java:567)
            at java.net.URL.<init>(URL.java:464)
            at java.net.URL.<init>(URL.java:413)
            at projet1.projet1.main(projet1.java:102)
    une idée SVP ?

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    605
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 605
    Points : 670
    Points
    670
    Par défaut
    Bonjour,

    Moi je mettrais bien quelque-chose comme:

    java.net.URL pURL = new URL("file://C:/monrepertoire/france_administrative.shp");


    Grunt.

  3. #3
    Membre du Club
    Inscrit en
    Octobre 2010
    Messages
    111
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 111
    Points : 44
    Points
    44
    Par défaut
    bonjour grunt2000,
    merci pour votre reponse , en effet je me suis dit que j'ai un probleme de syntaxe , et puis j'ai indique un path comme ca
    "file://C:/monrepertoire/france_administrative.shp"
    et ca ne donne tjrs rien , a priori y 'a un fichier qui manque : je n'ai trouve que 3 , on m'a dit qu'il fallait 4

  4. #4
    Membre éclairé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    605
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 605
    Points : 670
    Points
    670
    Par défaut
    Quel est le message que vous avez à présent?

  5. #5
    Membre du Club
    Inscrit en
    Octobre 2010
    Messages
    111
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 111
    Points : 44
    Points
    44
    Par défaut
    ca me donne
    nullpointerexception : ca s'ameliore j'ai plus de problemes avec l'url mais c'est comme ci le fichier n'y est pas pourtant il y est

  6. #6
    Membre éclairé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    605
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 605
    Points : 670
    Points
    670
    Par défaut
    Postes le bout de code source qui te pose un problème en nous précisant la ligne.

    N'oublies pas de faire un
    dir <chemin entier vers ton fichier>
    et de vérifier que tu le trouves vraiment. Le fait que tu le vois de tes yeux ne suffit pas: tu es à la merci d'une faute de frappe. Ou d'un répertoire relatif que tu crois être bon, mais qui ne l'est pas.

    Le nombre de fichiers que j'aurais juré qui étaient là, et que par cette vérification j'ai vu qu'ils n'étaient pas trouvés est impressionnant.

  7. #7
    Membre du Club
    Inscrit en
    Octobre 2010
    Messages
    111
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 111
    Points : 44
    Points
    44
    Par défaut
    bonjour grunt2000,
    pour le fichier je ne vais pas jurer

    voila le bout de 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
    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
    
    package projet1;
    
    import com.vividsolutions.jts.geom.Coordinate;
    import com.vividsolutions.jts.geom.GeometryFactory;
    import com.vividsolutions.jts.geom.LineString;
    import com.vividsolutions.jts.geom.Point;
    import java.math.BigDecimal;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import org.geotoolkit.data.FeatureCollection;
    import org.geotoolkit.data.FeatureWriter;
    import org.geotoolkit.data.memory.GenericMappingFeatureCollection;
    import org.geotoolkit.data.memory.MemoryDataStore;
    import org.geotoolkit.data.query.QueryBuilder;
    import org.geotoolkit.feature.FeatureTypeBuilder;
    import org.geotoolkit.referencing.CRS;
    import org.opengis.feature.Feature;
    import org.opengis.feature.simple.SimpleFeatureType;
    import org.opengis.feature.type.PropertyDescriptor;
    
    import com.vividsolutions.jts.geom.Coordinate;
    import com.vividsolutions.jts.geom.GeometryFactory;
    import com.vividsolutions.jts.geom.Point;
    import java.awt.BorderLayout;
    import java.io.Serializable;
    import java.net.URL;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import org.geotoolkit.data.DataStore;
    import org.geotoolkit.data.DataStoreFinder;
    import org.geotoolkit.data.DataUtilities;
    import org.geotoolkit.data.FeatureCollection;
    import org.geotoolkit.factory.FactoryFinder;
    import org.geotoolkit.feature.FeatureTypeBuilder;
    import org.geotoolkit.feature.simple.SimpleFeatureBuilder;
    import org.geotoolkit.gui.swing.go2.JMap2D;
    import org.geotoolkit.gui.swing.go2.control.JNavigationBar;
    import org.geotoolkit.map.MapBuilder;
    import org.geotoolkit.map.MapContext;
    import org.geotoolkit.map.MapLayer;
    import org.geotoolkit.referencing.crs.DefaultGeographicCRS;
    import org.geotoolkit.style.MutableStyle;
    import org.geotoolkit.style.MutableStyleFactory;
    import org.geotoolkit.style.StyleConstants;
    import org.geotoolkit.util.RandomStyleFactory;
    import org.geotoolkit.wms.WebMapServer;
    import org.geotoolkit.wms.map.WMSMapLayer;
    import org.opengis.feature.simple.SimpleFeature;
    import org.opengis.feature.simple.SimpleFeatureType;
    import org.opengis.feature.type.Name;
    public class projet1 {
    
        /**
         * @param args the command line arguments
         */
    
        public static void main(String[] args)throws Exception {
    
            //pour creer des geometries, points, lignes, polygons ...
            final com.vividsolutions.jts.geom.GeometryFactory GF = new com.vividsolutions.jts.geom.GeometryFactory();
            final org.geotoolkit.style.MutableStyleFactory MSF = (org.geotoolkit.style.MutableStyleFactory)FactoryFinder.getStyleFactory(null) ;
    
    
            //on définit le modele de données
            final org.geotoolkit.feature.FeatureTypeBuilder ftb = new org.geotoolkit.feature.FeatureTypeBuilder();
            ftb.setName("MonModel");
    
            //un attribut de type Point avec projection cartographique CRS:84 (longtitude/latitude)
            ftb.add("geometry", Point.class, DefaultGeographicCRS.WGS84);
            ftb.setDefaultGeometry("geometry");
            final org.opengis.feature.simple.SimpleFeatureType type = ftb.buildSimpleFeatureType();
            maconnexion c = new maconnexion();
            String s = new String();
            s = "id";
             final org.geotoolkit.data.FeatureCollection collection = org.geotoolkit.data.DataUtilities.collection("id-col", type);
            while (c.rs.next())
            {
    
              //creation de quelques valeurs
              final org.geotoolkit.feature.simple.SimpleFeatureBuilder sfb = new org.geotoolkit.feature.simple.SimpleFeatureBuilder(type);
    
              sfb.set("geometry", GF.createPoint(new com.vividsolutions.jts.geom.Coordinate(c.rs.getInt(1),c.rs.getInt(2))));
              final org.opengis.feature.simple.SimpleFeature feature1 = sfb.buildFeature(s+"d");
    
                   //creation d'une collection de valeur
    
            collection.add(feature1);
            }
    
    
            //creation une couche de donnée pour affichage, données + style
            final org.geotoolkit.style.MutableStyle style = MSF.style(StyleConstants.DEFAULT_POINT_SYMBOLIZER);
            final org.geotoolkit.map.MapLayer featureLayer = MapBuilder.createFeatureLayer(collection, style);
    
    
    
            java.net.URL pURL = new URL("file:C:\france.shapefiles\france_administrative.shp");
            DataStore pDS = DataStoreFinder.getDataStore("url",pURL);
            Name pName = pDS.getNames().iterator().next();
            FeatureCollection pFC = pDS.createSession(true).getFeatureCollection(QueryBuilder.all(pName));
            MapLayer pLayer = MapBuilder.createFeatureLayer(pFC, RandomStyleFactory.createDefaultVectorStyle(pFC));
    //pMapCntx.layers().add(pLayer);
    //JMap2DFrame.show(pMapCntx);
    
    
    
            //ensemble des couches a afficher
            final org.geotoolkit.map.MapContext context = org.geotoolkit.map.MapBuilder.createContext();
            
            context.layers().add(featureLayer);
            context.layers().add(pLayer);
            //creation de la fenetre pour affichage
             final org.geotoolkit.gui.swing.go2.JMap2D map = new JMap2D();
            //map.setToolTipText("bonjour");
             map.getContainer().setContext(context);
            map.getCanvas().getController().setVisibleArea(context.getBounds());
            final JNavigationBar bar = new JNavigationBar(map);
            final JPanel panneau = new JPanel(new BorderLayout());
            panneau.add(BorderLayout.NORTH,bar);
            panneau.add(BorderLayout.CENTER,map);
    
            final JFrame frm = new JFrame();
            frm.setContentPane(panneau);
            frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frm.setSize(800, 600);
            frm.setLocationRelativeTo(null);
            frm.setVisible(true);
    
     // context.layers().clear(); permet la suppression des layers
     //featureLayer.setSelectable(true);
      //      featureLayer.setVisible(true);
       //     context.layers().add(featureLayer);
    // Methods in org.geotoolkit.map with parameters of type LayerListener
     //void 	MapLayer.addLayerListener(LayerListener listener)
    
        }
    }
    et la il m'indique que l'erreur est au niveau de cette ligne
    Name pName = pDS.getNames().iterator().next();

  8. #8
    Membre éclairé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    605
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 605
    Points : 670
    Points
    670
    Par défaut
    Pour ton fichier:

    Change la ligne

    java.net.URL pURL = new URL("file:C:\france.shapefiles\france_administrative.shp");

    en:
    java.net.URL pURL = new URL("file://C:\france.shapefiles\france_administrative.shp");

    Et sur une ligne de commande, vérifies dans le même temps que:
    dir C:\france.shapefiles\france_administrative.shp

    te répond:
    france_administrative.shp
    1 fichier trouvé.


    Sinon, s'il met 0 fichier trouvé, ton fichier n'est pas à l'emplacement où tu pensais qu'il était.


    Le NullPointerException que tu reçois:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DataStore pDS = DataStoreFinder.getDataStore("url",pURL);
    Name pName = pDS.getNames().iterator().next();
    vient de
    DataStoreFinder.getDataStore("url",pURL) qui ne résoud pas l'URL et qui renvoie null dans pDS. En général, les API renvoient plutôt une exception dans ce cas là, mais là visiblement, il faut faire un test à la main.


    En tout cas, je pense que ce sera corrigé quand ton fichier aura été bien désigné.
    Si tu as du mal à créer l'URL vers le fichier, il me semble que tu peux faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    File f = new File("C:\france.shapefiles\france_administrative.shp");
    URL url = f.toURL();
    C'est une méthode dépréciée, mais si pour l'instant cela peut t'aider...

    Grunt.

  9. #9
    Membre du Club
    Inscrit en
    Octobre 2010
    Messages
    111
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 111
    Points : 44
    Points
    44
    Par défaut
    bonjour grunt2000,
    j'ai changé le chemin de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java.net.URL pURL = new URL("file://C:\france.shapefiles\france_administrative.shp");
    et re vérifié que mon dossier existe bel et bien a l'endroit ou il est supposé être et ..........ca donne tjrs rien ,

    j'ai même utilisé la méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new File("c:\...").toURI().toURL()
    File f = new File("C:\france.shapefiles\france_administrative.shp");
    URL url = f.toURL();
    et je l'ai essayé tout de même
    je commence a me dire que le fichier que j'ai utilisé est le maillon faible , voila je vous passe le lien , peut être que vous verrez ce dont je suis incapable de voir
    http://www.maplibrary.org/stacks/gadm/FRA/index.php

  10. #10
    Rédacteur
    Avatar de eclesia
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    2 108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 108
    Points : 3 203
    Points
    3 203
    Par défaut
    J'ai testé ce fichier et il marche pour moi, a condition d'ajouter le fichier de projection .prj (comme j'ai du te le dire l'un des autres forums dédié au sig).
    Systèmes d'Informations Géographiques
    - Projets : Unlicense.science - Apache.SIS

    Pour un monde sans BigBrother IxQuick ni censure RSF et Les moutons

  11. #11
    Membre du Club
    Inscrit en
    Octobre 2010
    Messages
    111
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 111
    Points : 44
    Points
    44
    Par défaut
    bonsoir eclesia,
    ça fait toujours plaisir de vous retrouver,

    oui je l'ai ajouté comme vous me l'avez suggéré l'autre fois , je revérifierais la totalité des 4 fichiers , c'est sur que ce n'est pas un problème de path ....

  12. #12
    Membre éclairé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    605
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 605
    Points : 670
    Points
    670
    Par défaut
    Citation Envoyé par eclesia Voir le message
    J'ai testé ce fichier et il marche pour moi, a condition d'ajouter le fichier de projection .prj (comme j'ai du te le dire l'un des autres forums dédié au sig).
    S'agit-il bien de cette fonction ?

    Si elle rencontre un problème qui se traduit par une exception, elle a l'air de la renvoyer (des catch(Throwable t), arghhh! ==> Laissez les Error stopper les programmes, c'est leur but absolu: on ne contre jamais un Error.)


    En fait, le code que je vois à l'air solide (mais il a été mis à jour ce 02/01/2011? Je lis: date Sun Jan 02 16:17:58 2011 +0100 (5 hours ago)) Je pense que freddy000 n'a pas cette version. S'il l'avait eue, un message l'aurait certainement informé de quelque-chose).

    Le seul endroit où il pourrait être ambigu, c'est ici:
    canProcess = fac.canProcess(parameters);

    Car si canProcess contient false, on renvoie null sans expliquer pourquoi canProcess a refusé ce qu'on lui proposait. (et donc, tu dis toi: c'est un fichier .prj qui manque, mais enfin l'idéal, ce serait que GeoToolKit lui-même s'en explique puisqu'il sait bien au moment où il décline une proposition pourquoi il la décline).

    Et du coup, on ne peut pas faire la différence avec ce cas là:
    la fonction qui a renvoyé null, parce que le
    while(getAvailableDataStores().hasNext()) (je simplifie)
    n'avait absolument aucun élément à examiner.

    Ici, null peut être renvoyé par deux situations d'échec.

    Peut être vaudrait-il mieux renvoyer une exception à tout les coups quand on ne trouve pas. Même si l'une d'entre elles doit accumuler toutes les raisons pour lesquelles on a du abandonner tous les candidats. Si canProcess renvoie false pour dix séries de paramètres, alors il faut finir par une exception:
    "Je n'ai pas retenu les paramètres Jeu1 parce que Raison1,
    Je n'ai pas retenu les paramètres Jeu2 parce que Raison2,
    ....
    Je n'ai pas retenu les paramètres Jeu10 parce que Raison10.
    "

    Bon, c'est un peu lourdingue. Le plus simple c'est de lâcher un log.info à chaque fois que l'on écarte un DataStore proposé (quel qu'en soit le motif). Et si à la fin, il y avait au moins un candidat et que tous ont été refusés lever une exception: "Aucun des {0,numbers} DataStores proposés n'a été retenu.". Les messages de log d'info passés permettant à l'utilisateur de comprendre DataStore par DataStore ce qui s'est passé pour chacun d'entre-eux.



    Et dans l'autre cas (celui où getAvailableDataStores() est simplement vide):
    "Il n'y a aucune source de données déclarée disponible."

    Mais peut être que le piège vient de ce que cette fonction appelle justement getAvailableDataStores()?

    En effet:
    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
     /**
     * @see DataStoreFinder#getAvailableDataStores()
     * Get all available datastores of a given class.
     */
     public static synchronized <T extends DataStoreFactory> Iterator<T> getAvailableDataStores(final Class<T> type) {
     final Iterator<T> allStores = getAllDataStores(type);
    
     final Set<T> availableStores = new HashSet<T>();
    
     while (allStores.hasNext()) {
     final T dsFactory = allStores.next();
     if (dsFactory.availability().pass()) {
     availableStores.add(dsFactory);
     }
    }
     return availableStores.iterator();
     }
    Pose le problème qu'elle ne justifie pas de la raison pour laquelle elle écarte un DataStore!


    En tout cas, getDataStore risque pour le moment de renvoyer null non pas seulement quand elle ne trouve pas de fichier, mais quand autre chose la frappe. Donc, je pense qu'il faut la réviser encore un peu, pour que pour toute raison d'échec, elle en expose très clairement la cause.

    Grunt.

  13. #13
    Rédacteur
    Avatar de eclesia
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    2 108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 108
    Points : 3 203
    Points
    3 203
    Par défaut
    le availability a surtout été ajouté dans les cas des datastores de type JDBC. afin de verifier que le driver jdbc est bien présent ou que d'eventuel contrainte sont satisfaites (connexion internet etc...). dans le cas de shapefile il ne test que la presence de deux classes.
    http://hg.geotoolkit.org/geotoolkit-...reFactory.java
    Dans le cas ou ca ne marche pas la methode retourne un object ConformanceResult qui est sensé contenir les informations sur ce qui n'a pas marché. Le datastoreFinder n'est qu'une classe utilitaire pour epargner le passage par le registry, on devrait pouvoir facilement lui faire logger plus d'information dans le cas ou un datastorefactory n'est pas en état de marche, mais dans le cas présent je doute fortement que ca soit le probleme.

    je ne vois toujours pas la raison pour laquelle ca ne marche pas chez toi. les shapefiles sont utilisés depuis plusieurs années sans problemes.
    il y a plusieurs demo dans geotk-pending qui les utilisent comme celle ci :
    http://hg.geotoolkit.org/geotoolkit-...adingDemo.java

    Si tu pouvais fournir le code de ton application ca nous avancerai pour trouver la solution. c'est a mon avis une petite broutille quelque part ou un jar manquant.
    Systèmes d'Informations Géographiques
    - Projets : Unlicense.science - Apache.SIS

    Pour un monde sans BigBrother IxQuick ni censure RSF et Les moutons

  14. #14
    Membre du Club
    Inscrit en
    Octobre 2010
    Messages
    111
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 111
    Points : 44
    Points
    44
    Par défaut
    bonjour,
    @ grunt2000 : la ce me dépasse ce que vous dites : je me suis basé sur des bouts de codes de "johann Sorel" concernant l'import de shapefiles ....
    j'essaye de faire tourner des applications mais je suis encore "novice" dans le domaine java + cartographie

    @ eclesia : oui je vous passe volontiers le code, j'imagine que j'ai négligé quelques chose , laquelle je ne sais toujours pas
    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
    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
    
    package projet1;
    
    import com.vividsolutions.jts.geom.Coordinate;
    import com.vividsolutions.jts.geom.GeometryFactory;
    import com.vividsolutions.jts.geom.LineString;
    import com.vividsolutions.jts.geom.Point;
    import java.math.BigDecimal;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import org.geotoolkit.data.FeatureCollection;
    import org.geotoolkit.data.FeatureWriter;
    import org.geotoolkit.data.memory.GenericMappingFeatureCollection;
    import org.geotoolkit.data.memory.MemoryDataStore;
    import org.geotoolkit.data.query.QueryBuilder;
    import org.geotoolkit.feature.FeatureTypeBuilder;
    import org.geotoolkit.referencing.CRS;
    import org.opengis.feature.Feature;
    import org.opengis.feature.simple.SimpleFeatureType;
    import org.opengis.feature.type.PropertyDescriptor;
    
    import com.vividsolutions.jts.geom.Coordinate;
    import com.vividsolutions.jts.geom.GeometryFactory;
    import com.vividsolutions.jts.geom.Point;
    import java.awt.BorderLayout;
    import java.io.Serializable;
    import java.net.URL;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import org.geotoolkit.data.DataStore;
    import org.geotoolkit.data.DataStoreFinder;
    import org.geotoolkit.data.DataUtilities;
    import org.geotoolkit.data.FeatureCollection;
    import org.geotoolkit.factory.FactoryFinder;
    import org.geotoolkit.feature.FeatureTypeBuilder;
    import org.geotoolkit.feature.simple.SimpleFeatureBuilder;
    import org.geotoolkit.gui.swing.go2.JMap2D;
    import org.geotoolkit.gui.swing.go2.control.JNavigationBar;
    import org.geotoolkit.map.MapBuilder;
    import org.geotoolkit.map.MapContext;
    import org.geotoolkit.map.MapLayer;
    import org.geotoolkit.referencing.crs.DefaultGeographicCRS;
    import org.geotoolkit.style.MutableStyle;
    import org.geotoolkit.style.MutableStyleFactory;
    import org.geotoolkit.style.StyleConstants;
    import org.geotoolkit.util.RandomStyleFactory;
    import org.geotoolkit.wms.WebMapServer;
    import org.geotoolkit.wms.map.WMSMapLayer;
    import org.opengis.feature.simple.SimpleFeature;
    import org.opengis.feature.simple.SimpleFeatureType;
    import org.opengis.feature.type.Name;
    public class projet1 {
    
        /**
         * @param args the command line arguments
         */
    
        public static void main(String[] args)throws Exception {
    
            //pour creer des geometries, points, lignes, polygons ...
            final com.vividsolutions.jts.geom.GeometryFactory GF = new com.vividsolutions.jts.geom.GeometryFactory();
            final org.geotoolkit.style.MutableStyleFactory MSF = (org.geotoolkit.style.MutableStyleFactory)FactoryFinder.getStyleFactory(null) ;
    
    
            //on définit le modele de données
            final org.geotoolkit.feature.FeatureTypeBuilder ftb = new org.geotoolkit.feature.FeatureTypeBuilder();
            ftb.setName("MonModel");
    
            //un attribut de type Point avec projection cartographique CRS:84 (longtitude/latitude)
            ftb.add("geometry", Point.class, DefaultGeographicCRS.WGS84);
            ftb.setDefaultGeometry("geometry");
            final org.opengis.feature.simple.SimpleFeatureType type = ftb.buildSimpleFeatureType();
            maconnexion c = new maconnexion();
            String s = new String();
            s = "id";
             final org.geotoolkit.data.FeatureCollection collection = org.geotoolkit.data.DataUtilities.collection("id-col", type);
            while (c.rs.next())
            {
    
              //creation de quelques valeurs
              final org.geotoolkit.feature.simple.SimpleFeatureBuilder sfb = new org.geotoolkit.feature.simple.SimpleFeatureBuilder(type);
    
              sfb.set("geometry", GF.createPoint(new com.vividsolutions.jts.geom.Coordinate(c.rs.getInt(1),c.rs.getInt(2))));
              final org.opengis.feature.simple.SimpleFeature feature1 = sfb.buildFeature(s+"d");
    
                   //creation d'une collection de valeur
    
            collection.add(feature1);
            }
    
    
            //creation une couche de donnée pour affichage, données + style
            final org.geotoolkit.style.MutableStyle style = MSF.style(StyleConstants.DEFAULT_POINT_SYMBOLIZER);
            final org.geotoolkit.map.MapLayer featureLayer = MapBuilder.createFeatureLayer(collection, style);
    
    
    
            java.net.URL pURL = new URL("file:C:\france.shapefiles\france_administrative.shp");
            DataStore pDS = DataStoreFinder.getDataStore("url",pURL);
            Name pName = pDS.getNames().iterator().next();
            FeatureCollection pFC = pDS.createSession(true).getFeatureCollection(QueryBuilder.all(pName));
            MapLayer pLayer = MapBuilder.createFeatureLayer(pFC, RandomStyleFactory.createDefaultVectorStyle(pFC));
    //pMapCntx.layers().add(pLayer);
    //JMap2DFrame.show(pMapCntx);
    
    
    
            //ensemble des couches a afficher
            final org.geotoolkit.map.MapContext context = org.geotoolkit.map.MapBuilder.createContext();
            
            context.layers().add(featureLayer);
            context.layers().add(pLayer);
            //creation de la fenetre pour affichage
             final org.geotoolkit.gui.swing.go2.JMap2D map = new JMap2D();
            //map.setToolTipText("bonjour");
             map.getContainer().setContext(context);
            map.getCanvas().getController().setVisibleArea(context.getBounds());
            final JNavigationBar bar = new JNavigationBar(map);
            final JPanel panneau = new JPanel(new BorderLayout());
            panneau.add(BorderLayout.NORTH,bar);
            panneau.add(BorderLayout.CENTER,map);
    
            final JFrame frm = new JFrame();
            frm.setContentPane(panneau);
            frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frm.setSize(800, 600);
            frm.setLocationRelativeTo(null);
            frm.setVisible(true);
    
     // context.layers().clear(); permet la suppression des layers
     //featureLayer.setSelectable(true);
      //      featureLayer.setVisible(true);
       //     context.layers().add(featureLayer);
    // Methods in org.geotoolkit.map with parameters of type LayerListener
     //void 	MapLayer.addLayerListener(LayerListener listener)
    
        }
    }
    désolé pour le code , je sais qu'il n'est pas trop propre

  15. #15
    Membre éclairé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    605
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 605
    Points : 670
    Points
    670
    Par défaut
    Citation Envoyé par eclesia Voir le message
    le availability a surtout été ajouté dans les cas des datastores de type JDBC. afin de verifier que le driver jdbc est bien présent ou que d'eventuel contrainte sont satisfaites (connexion internet etc...). dans le cas de shapefile il ne test que la presence de deux classes.
    http://hg.geotoolkit.org/geotoolkit-...reFactory.java
    Dans le cas ou ca ne marche pas la methode retourne un object ConformanceResult qui est sensé contenir les informations sur ce qui n'a pas marché. Le datastoreFinder n'est qu'une classe utilitaire pour epargner le passage par le registry, on devrait pouvoir facilement lui faire logger plus d'information dans le cas ou un datastorefactory n'est pas en état de marche, mais dans le cas présent je doute fortement que ca soit le probleme.

    je ne vois toujours pas la raison pour laquelle ca ne marche pas chez toi. les shapefiles sont utilisés depuis plusieurs années sans problemes.
    il y a plusieurs demo dans geotk-pending qui les utilisent comme celle ci :
    http://hg.geotoolkit.org/geotoolkit-...adingDemo.java

    Si tu pouvais fournir le code de ton application ca nous avancerai pour trouver la solution. c'est a mon avis une petite broutille quelque part ou un jar manquant.

    En fait, un début de problème de la fonction pourrait être le suivant:
    Elle filtre l'ensemble des DataStores existants par:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public static synchronized <T extends DataStoreFactory> Iterator<T> getAvailableDataStores(final Class<T> type) {
       final Iterator<T> allStores = getAllDataStores(type);
    
       final Set<T> availableStores = new HashSet<T>();
    
       while (allStores.hasNext()) {
       final T dsFactory = allStores.next();
       if (dsFactory.availability().pass()) {
          availableStores.add(dsFactory);
     }
     }
    
     return availableStores.iterator();
    }
    avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    @Override public ConformanceResult availability() {
       DefaultConformanceResult result = new DefaultConformanceResult();
       try {
          ShapefileDataStore.class.getName();
          IndexedShapefileDataStore.class.getName();
          Geometry.class.getName();
          result.setPass(true);
       } catch (Exception e) {
          result.setPass(false);
       }
       return result;
    }
    availabilty() renvoie un ConformanceResult, mais il n'est pas utilisé pour connaitre la raison de l'échec. On applique sur lui la méthode pass() qui renvoie un booléen true ou false.

    Deuxième problème:
    catch (Exception e) {
    result.setPass(false);
    }

    et e.getMessage() vaut quoi? On ne le saura jamais, puisque l'on n'en fait rien.
    EDIT:
    Citation Envoyé par eclesia
    c'est a mon avis une petite broutille quelque part ou un jar manquant.
    Et c'est même à mon avis, si ton intuition est bonne et que c'est un jar qui manque, à cet endroit que le problème apparaît et n'est du coup pas révélé.


    Que je sois sur une bonne piste ou une mauvaise, je ne sais pas.
    Mais il est sûr que la fonction coince. Parce qu'elle ne dit pas ce qui lui arrive.
    Une fonction de service, comme celle-ci, ne peut pas renvoyer null. Si elle ne parvient pas à trouver quelque-chose, il faut qu'il y ait une raison (il y en forcément une). Et c'est à cette fonction de la renvoyer explicitement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public DataStore getDataStore(...) throws <LaRaisonPourLaquelleJ'aiRienTrouvé>
    Et dans la javadoc, abandonner la mention: "Cette fonction renvoie null si elle trouve pas le datastore.". Ainsi, soit cette fonction réussit et donne quelque-chose, soit elle ne réussit pas - pour n'importe quelle raison - mais alors elle s'explique.


    Parce que sinon, tous les débutants, tels que freddy (ou même moi, d'ailleurs), sont obligés de se perdre en conjectures sur ce qui se passe, tout simplement parce que la fonction appelée a oublié de le dire. Et c'est là que l'on bouffe du temps: trouver tout ce qui pourrait être la cause qu'elle ait renvoyé null. Alors que c'est son boulot de nous le dire.


    Si c'est un problème de shapefile invalide, la fonction doit nous le dire.
    Si c'est un problème d'élément de shapefile manquant (.prj), la fonction doit nous le dire.
    Si on lui passe "file://c:\toto.shp" comme fichier et que la fonction ne le trouve pas, elle doit nous dire qu'elle ne l'a pas trouvé, mais en levant cette exception strictement et uniquement à l'endroit où elle s'est mangé un FileNotFoundException ou un message d'URL invalide. Sinon, elle pourrait faire une mauvaise interprétation.

    La gestion des exceptions est extrêmement importante. Elle est primordiale ici. Une cause d'erreur = une classe d'exception (avec héritage pour se simplifier la vie). Pour qu'il n'y ait jamais d'ambiguïté sur un problème.


    Là, avec null, on ne sait rien. On "croit que". Et ça ne peut pas convenir.

    Grunt.

  16. #16
    Rédacteur
    Avatar de eclesia
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    2 108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 108
    Points : 3 203
    Points
    3 203
    Par défaut
    @grunt : les patchs sont les bienvenues
    (et apres quelques patchs on offre le droit de commit, comme tout projet libre)
    Je n'ai rien a redire sur tes remarques qui sont tout a fait justes, il reste a le faire.

    @freddy : le code semble bon, aurais tu la liste des jars que tu utilises ?
    ps : je suis encore en vacances, et ne pourrais tester que mercredi.
    Systèmes d'Informations Géographiques
    - Projets : Unlicense.science - Apache.SIS

    Pour un monde sans BigBrother IxQuick ni censure RSF et Les moutons

Discussions similaires

  1. Réponses: 0
    Dernier message: 23/01/2014, 11h28
  2. Import/Affichage shapefile: PostgreSQL/PostGIS/MapServer
    Par abir_rzg dans le forum PostgreSQL
    Réponses: 0
    Dernier message: 31/07/2009, 15h41
  3. [DEV-C++]#import de fichier .tlb
    Par pdl dans le forum Dev-C++
    Réponses: 6
    Dernier message: 19/07/2002, 22h46
  4. Importer des objets de 3dsMax
    Par Anonymous dans le forum OpenGL
    Réponses: 3
    Dernier message: 06/05/2002, 13h53
  5. IMPORTANT! A lire avant tout chose
    Par Aurelien.Regat-Barrel dans le forum Windows
    Réponses: 0
    Dernier message: 01/05/2002, 16h55

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