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 : Pb animation features : modification en mémoire de la valeur d'un attribut


Sujet :

SIG : Système d'information Géographique

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4
    Points : 4
    Points
    4
    Par défaut GeoTools : Pb animation features : modification en mémoire de la valeur d'un attribut
    Salut,
    Bon je vais essayer d'être assez clair quand à mes objectifs et mon problème, c'est pas simple.
    Mon but est d'animer en temps (semi) réel (=toutes les secondes) une carto de traffic routier. En gros dans un premier temps je veux faire clignoter des feux.
    J'ai donc un shapefile de point (ou polygon rond) représentant mes feux. Je veux ensuite selon un évenement "état de mon feu" changer le style du point n° x(et attention d'un seul point evidemmment).
    Donc dans un premier temps, je défini des attributs "N°_Feu" et "Etat" dans mon dbf (lié au shapefile); et je défini des règles de style de mes points dans mon fichier .sld (lié au shape également). J'ai donc qui dit genre : "si mon attribut "Etat" est à 0 alors je suis rouge, si mon attribut "Etat" est à 1 alors je suis vert"...
    <!-- RULE FOR GREEN STATE -->
    <Rule>
    <Name>rule1</Name>
    <Filter>
    <PropertyIsEqualTo>
    <PropertyName>navig</PropertyName>
    <Literal>0</Literal>
    </PropertyIsEqualTo>
    </Filter>
    <PointSymbolizer>
    <Graphic>
    <ExternalGraphic>
    <OnlineResource
    xmlnslink="http://www.w3.org/1999/xlink"
    xlink:type="simple" xlink:href="file:/C:\DEV\workspace\ExampleGeoToolsAPI\img\fgreen.png"/>
    <Format>image/png</Format>
    </ExternalGraphic>
    <Size>15.0</Size>
    </Graphic>
    </PointSymbolizer>
    </Rule>


    Ensuite dans mon code quand je reçois mon évenement "le feux N°1 est à l'état 1" je met à jour l'attribut "Etat" de mon shape. ça se fait très bien avec des filtres :
    Filter filter1 = StyledFilters.createCompareEqualFilter("N°_Feu", 1);
    //ça defini un filtre qui me retourne uniquement le point de N° feu 1
    ((FeatureStore)source).modifyFeatures("Etat",Integer.toString(current_state), filter1);
    //Pour changer la valeur de l'attribut Etat

    Bref voila, donc tout marche bien, sauf que le FeatureStore ne trouve rien de mieux à faire que de changer "en dur", donc directmeent dans le fichier la valeur de l'attribut au lieu de faire le changement en mémoire. Donc ça veut dire que pour X animations, j'ai X écritures dans le fichier !! et ça c pas possible en terme de perf ( et en plus ça plante quand ça va trop vite)

    Donc je voulais savoir s'il existait un moyen de changer la valeur d'un attribut d'une feature en mémoire et que ça se répercute sur la map (JMapPane)

    Merci

    Manu

  2. #2
    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


    Idée 1 :
    je n'avais pas vue le probleme comme ca (pas dans le sens animation en tout cas).

    Ta solution est la bonne dans le sens où en SIG le style se base sur des attributs. Ce qui te force a modifier l'attribut.

    A mon avis il va falloir partir sur autrechose. Tu pourrais faire une classe qui implemente PointSymbolizer. Il y a la methode getGraphic() ce qui te permettrai de faire ton symbol sur mesure et mettre autant de methodes que tu veux.

    reste la question de l'animation, ..., compliqué ca,... le jmappane redessine toute les couches à chaque fois, ca va couter cher en performance pour faire clignoter tes feux :/ .


    Idée 2 :
    J'ai vu un MemoryDatastore quelquepart...
    mais je ne sais vraiment rien a son sujet.
    c'est une piste

    *pas d'autre idée pour le moment*
    Systèmes d'Informations Géographiques
    - Projets : Unlicense.science - Apache.SIS

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

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    Rep Idée 1 :
    Oui mais l'idée est de ne pas rester cloisoner a une animation de Points, mais également de lignes et de Text (et polygon suremment dans le futur). C'est pour cela que l'idée de modification d'un attribut avec des regle de style dependant de celui-ci etait a mon avis la plus facile.

    Rep Idée 2 :
    Je l'ai vu aussi mais je sais pas ce que ça donne, j'ai peur que une fois loader le shapefile avec un ShapeFileDataStore, ça soit difficile de passer en MemoryDataStore uniquement pour le Writer. Enfin je vais voir on sait jamais

    Idée 3 :
    J'avais aussi une autre idée, uniquement valable pour les style celle-la (donc pas de texte dynamique). En gros je créait (pr mes feux (Point)) un style avec 3 Rules (ruleGreen, ruleYellow et ruleRed) et quand je reçoit un event avec l'ID de mon feux et son Etat, je créait un filtre et selon l'état je le lié à la bonne rule.
    ça doit marcher mais c fachement + compliqué a mettre en place. En plus ça fait créer n filtres pour les n feux en animations (pas top non plus)

    Pour la perf, c pas trop le soucis, car dans l'avenir je ne vais afficher l'anim des feux qu'a un certain niveau de zoom (et a priori avec peut de layers). D'ailleurs à ce propos, si tu sais s'il existe un filtre permettant de filtrer les features selon le zoom ça m'arrangerait :p
    a+

  4. #4
    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
    Pour la perf, c pas trop le soucis, car dans l'avenir je ne vais afficher l'anim des feux qu'a un certain niveau de zoom (et a priori avec peut de layers). D'ailleurs à ce propos, si tu sais s'il existe un filtre permettant de filtrer les features selon le zoom ça m'arrangerait :p
    a+
    pour les echelles d'affichages tu trouve ca dans les "Rules" qui precede les styles. j'ai jamais utilisé, je sais juste que c'est la
    Systèmes d'Informations Géographiques
    - Projets : Unlicense.science - Apache.SIS

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

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4
    Points : 4
    Points
    4
    Par défaut Soluce
    Re
    Bon j'ai trouvé le truc pour que ça marche.
    C tout bêbête mais encore fallait il y penser. Donc je post pr les prochains qui auront le pb, on sait jamais...

    Soluce : En fait, il faut juste apres le chargement du ShapeFileDataStore, recup toutes ces features et les mettre dans un MemoryDataStore, et c'est lui qui est ajouter à la MapLayer et dc au MapContext. Ce qui fait que Toutes les données sont en mémoire et le changement de valeurs d'attibuts passe comme une lettre a la poste
    exemple :
    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
            URL shapeURL = new URL("file:/"+System.getProperty("user.dir")+"/ressources/communes/Loisirs.shp");        
            ShapefileDataStore store = new ShapefileDataStore(shapeURL);
            String name = store.getTypeNames()[0];
            FeatureSource source = store.getFeatureSource(name);       
            file = new File(System.getProperty("user.dir")+"/ressources/communes/Loisirs.sld");
            SLDParser stylereader = new SLDParser(factory,file);
            Style style = stylereader.readXML();
            
            //On prend les features de la source (shapeFile) et on les colle en Memoire
            MemoryDataStore mds = new MemoryDataStore(source.getFeatures());
            String typeName = mds.getTypeNames()[0]; 
            FeatureSource sourceM = mds.getFeatureSource(typeName);  
            
            
            maplayer = new DefaultMapLayer(sourceM,style[0]); //ICI ON LOAD le FeatureSource en mémoire !!!!!!!
    Voili voila!!

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

Discussions similaires

  1. KML : modification "en mémoire" avec actualisation de l'affichage
    Par saxrub dans le forum IGN API Géoportail
    Réponses: 2
    Dernier message: 04/01/2013, 10h51
  2. [AC-2007] ADO rajout/modif champ dans MySQL montant valeur * par 100
    Par jj4822 dans le forum VBA Access
    Réponses: 1
    Dernier message: 28/01/2011, 19h11
  3. [GeoTools] Erreur ajout Feature WFS (champ Date)
    Par jojodu31 dans le forum SIG : Système d'information Géographique
    Réponses: 0
    Dernier message: 08/06/2010, 16h46
  4. Modification d'algo problème de valeur null
    Par goblin dans le forum Langage
    Réponses: 5
    Dernier message: 09/03/2007, 18h41
  5. [XML] Modification de la valeur d'un attribut
    Par chrix10.2 dans le forum Général Python
    Réponses: 2
    Dernier message: 06/12/2006, 09h16

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