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 Wed 10 November 2010 21:58

Delu
Participant actif
Lieu: Briançon
Date d'inscription: 29 Apr 2008
Messages: 76

filtrer la carte avec geoext

Bonjour,

lorsque l'on sélectionne une ligne dans une grid extjs construite avec comme selection Model le  GeoExt.grid.FeatureSelectionModel(), la géométrie correspondante est sélectionnée sur la carte aussi.
Par contre si on filtre ce grid avec la méthode filter() ou filterBy() de Extjs, toutes les géométries restent sur la carte.
Est-ce que qq'un connait une méthode pour provoquer ce filtre et ainsi mettre en adéquation la liste du grid et les objet affiché sur la carte.

voici mon store puis mon grid :

Code:

this.storeNotes = new GeoExt.data.FeatureStore({
        layer: this.notes
        ,fields: [
            {name: 'id_note', type: 'integer'}
            ,{name: 'annee', type: 'integer'}
            ,{name: 'date_note'}
            ,{name: 'date_insert'}
            ,{name: 'commentaire', type: 'string'}
            ,{name: 'geometry', type: 'string'}
            ,{name: 'id_auteur',type: 'integer'}
            ,{name: 'auteur',type: 'string'}
        ]
        // ,sortInfo: {field: 'date_note',direction: 'DESC'} 
    });

Code:

gridPanelNotes = new Ext.grid.GridPanel({
    id:"gridnotes"
        ,title: "Vos notes localisées"
        ,store: this.storeNotes
        ,columns: [
            {
                header: "N°"
                ,width: 50
                ,dataIndex: "id_note"
                ,sortable: true
                ,hidden:true
            },{
                header: "Auteur"
                ,width: 140
                ,dataIndex: "auteur"
                ,sortable: true
            },{
                header: "Date"
                ,width: 120
                ,dataIndex: "date_note"
                ,sortable: true
            },rowActionsCenter
        ]
        ,plugins: rowActionsCenter        
        ,sm: new GeoExt.grid.FeatureSelectionModel({singleSelect:true,layer:this.notes})
        ,tbar:application.toolbar.toolbarGridNotes
    });

Je filtre mon store comme ça mais ça ne filtre pas les features sur la carte

Code:

this.storeNotes.filterBy(function(r,id){condition...return true ou false})

Hors ligne

 

#2 Fri 19 November 2010 09:07

Yves
Membre du bureau
Lieu: Aix-les-Bains
Date d'inscription: 22 Mar 2006
Messages: 9860
Site web

Re: filtrer la carte avec geoext

Bonjour,

Peut-être dois tu mettre à jour la carte avec une méthode redraw() au niveau de la couche vecteur ?

Y.


Yves Jacolin, bénévole de l'association GeoRezo.net, agit au nom et pour le compte de l'association - Partageons ce qui nous départage !!  - GeoRezo vous aide ? Aidez GeoRezo !

Hors ligne

 

#3 Fri 19 November 2010 10:28

Delu
Participant actif
Lieu: Briançon
Date d'inscription: 29 Apr 2008
Messages: 76

Re: filtrer la carte avec geoext

Bonjour Yves et merci pour ta réponse.
Je viens de tester ce que tu proposes mais ça ne fonctionne pas.

pour m'en sortir j'ai du écrire une fonction et faire des boucles. Pour ceux qui aurait le même besoin, voici un exemple de code qui fonctionne.
L'application gère des notes localisées, saisies sur le terrain avec un PDA et que les utilisateurs peuvent consulter via une application web, une fois leur note exportées vers postgis via un script automatique (Talend)
application.layout.notes est ma couche vecteur. Je transmets à la fonction, le contenu de 2 critères de filtre : l'auteur de la note et un bout de chaine text à rechercher dans les commentaires de la note.

Code:

this.submitFilter = function(id_auteur,textField) {
        if(id_auteur!=null){var reg1=id_auteur;}
        gridPanelNotes.getSelectionModel().clearSelections();
        this.storeNotes.filterBy(function(r,id){  
            var commentaire = r.get('commentaire');
            var auteur = r.get('id_auteur');
            var id_note = r.get('id_note');
            var f = application.layout.notes.features;
            var match = new RegExp("("+textField+")",'gi').test(commentaire);
            if(id_auteur!=null){
                match = match && (auteur == reg1);
            }
            if(match){   
                Ext.each(f,function(item,index){
                    if(item.data.id_note == id_note){item.style=null;}
                })
            }
            else{   
                Ext.each(f,function(item,index){
                    if(item.data.id_note == id_note){item.style={display:'none'};}
                })
            }
                application.layout.notes.redraw();
            return match;
        })
    };

Donc je change le style de chacune de mes features (item.style={display:'none'} ou item.style=null) pour les masquer ou les afficher en fonction des résultats du filtre. le monStore.filterBy de Extjs fonctionne avec une fonction qui filtre ou pas les records en fonction de ce que retourne cette fonction (true ou false), d'où le return match à la fin.

Hors ligne

 

Pied de page des forums

Powered by FluxBB