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

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#1 Fri 16 December 2016 09:57

Gayake
Participant occasionnel
Date d'inscription: 13 Sep 2014
Messages: 26

Gerer le style de parcelles en fonction des données

Bonjour à tous,
J' ai créé une fonction qui calcule la moyenne de production de plusieurs parcelles (50 parcelles)
L'idée serait d'afficher des couleurs différentes en fonction du rapport production de la parcelle par rapport de la moyenne de production de toutes les parcelles: par exemple,
si parcelle 1 a sa production < à la moyenne des productions, elle est en rouge,
si parcelle 1 a sa production > à la moyenne des productions, elle est en vert.
Voici le code de la moyenne des parcelles et le code pour gérer le style des parcelles. Je n'arrive pas à faire le lien. Les parcelles gardent la couleur de départ. Un problème de variable? L'appel de ma fonction moyProd() se fait que je clic sur une parcelle. Est-ce correct?
Une idée?

Code:

function moyProd(){
    var calendrier...//ici j'ai créé un calendrier
    
    if(nbParcelles>0){
        var listeValeurProd = new Array(calendrier.length);//valeur Y pour chaque jour
        for(var p = 0; p<nbParcelles;p++)
        {
            var idParcelle = geojson_OGRGeoJSON.features[p]["properties"]["id"]; //info id de la parcelle
            var courbeProd = new Array(listeNomParametre.length); //tableau des param sigmo
            var cumulProdParcelle =-1;            //variable Total production pour une parcelle
        //Get Valeurs de la courbe depuis GeoJson
            for(var nomDuParametre=0; nomDuParametre < listeNomParametre.length; nomDuParametre++){
                var Param = [listeNomParametre[nomDuParametre];
                var testVal =geojson_OGRGeoJSON.features[p]["properties"][preParam];
                if(testVal!= null || isNaN(testVal)!=false){
                    courbeProd[listeNomParametre[nomDuParametre]]=parseFloat(testVal);
                    
                }
                
            }
            listeValeurProd =courbe(calendrier, courbeProd);        //il ne faut pas que la prod soit NaN
            cumulProdParcelle = SommeValeurs(listeValeurProd,calendrier);  //cumul de la production pour une parcelle
             try {
                    var x = cumulProdParcelle;

                        if(x == "") throw "empty";
                        if(isNaN(x)) throw "not a number";
                        x = Number(x);
                        resCumulTotal = resCumulTotal + cumulProdParcelle;
                    }
                    catch(err) {
                        console.log("Input is " + err );
                    }
        }
        return resCumulTotal / nbParcelles;  // cumul total des productions de toutes les parcelles/ nombre de parcelles concernées
    }
    else{
        return null;
    }

}

et pour gérer le style des parcelles

Code:

// style par defaut
    var defaultStyle = new ol.style.Style({
   fill: new ol.style.Fill({
     color: [250,250,250,1]
   }),
   stroke: new ol.style.Stroke({
     color: [220,220,220,1],
     width: 1
   })
 });

// permet de mettre les styles en cache pour améliorer le temps d'affichage
   var styleCache = {};
   var cumulProdParcellefaible=  cumulProdParcelle<(resCumulTotal / nbParcelles);
   var cumulProdParcellefort= cumulProdParcelle>(resCumulTotal / nbParcelles);

/* fonction qui va gérer les couleurs de chaque parcelle en fonction du rapport production de la parcelle et moyenne production de toutes les parcelles*/
function styleFunction(feature, resolution) {
   // recupere l'info du polygone
   var id = feature.get('s.id');
   var couleurMoyCumul='#39F600';  // couleur pour la moyenne du cumul 
   if(id== cumulParcelleGaifaible){
      couleurMoyCumul='#00DDF6';  // couleur si cumul Prod parcelle supérieur à la moyenne production de toutes les parcelles
   }
   if(id== cumulProdParcellefort){                // couleur si GAI parcelle inférieur à la moyenne production de toutes les parcelles
       couleurMoyCumul='#F600DD';
   }
   console.log(id== cumulProdParcellefaible);
   // si le style n'est pas encore en cache dans le tableau styleCache
   if (!styleCache[id]) {
   //on cree le style
     styleCache[id] = new ol.style.Style({
       fill: new ol.style.Fill({
         color: couleurMoyCumul      // on lui met la couleur correspondante dans le tableau
       }),
       stroke: new ol.style.Stroke({
         color: [120,120,120,1],
         width: 2
       })
     });
   }
   // a ce stade le style de la couche courante est en cache
   // so return it (comme un tableau!)
   return [styleCache[id]];
}

Hors ligne

 

#2 Tue 31 January 2017 01:07

Nekultra
Participant occasionnel
Lieu: France
Date d'inscription: 21 Oct 2013
Messages: 18

Re: Gerer le style de parcelles en fonction des données

Bonsoir,
Pour commencer, tu peux utiliser la console (F12) de ton navigateur et regarder si tu as un message d'erreur ou non. Ensuite essaie de lire tes lignes de code pas à pas à l'aide de cette console et du debugger.

Tu peux nous mettre le message d'erreur que renvoie cette console dans un premier temps... (Méthode facile pour nous  ^ ^ )

Sinon on regardera de plus près ton code smile

Dernière modification par Nekultra (Tue 31 January 2017 01:11)

Hors ligne

 

#3 Thu 16 March 2017 10:44

cherbe
Participant occasionnel
Date d'inscription: 1 Nov 2008
Messages: 41

Re: Gerer le style de parcelles en fonction des données

Bonjour
Au cas où la question serait encore d'actualité, voici comment j'ai géré un problème similaire. La carte est un PLU (plan local d'urbanisme). Chaque zone (polygone) du PLU se voit affectée une couleur différente. Notez aussi la possibilité de faire une recherche dans le fichier Json à partir d'un clic sur le polygone :
   

Code:

    var PLU=new L.geoJson(PLU_graphique,{style:style_plu,
            onEachFeature: function (feature, layer) {
                    var cherche = '<b>calque PLU</b><br>zone : '+feature.properties.LAYER;
                    layer.bindPopup(cherche);
                        }
        }).addTo(map);

function couleur_plu(a){
  return  a=="AU" ? '#FFCC99':   
          a=="1AU" ? '#CCCCFF':
          a=="AUj" ? '#FFCCFF':
          a=="UA" ? '#CCCCFF':
          a=="As" ? '#66CC55':
          a=="N" ? '#00FF00':
          a=="Ni" ? '#0000FF':
          a=="Nj" ? '#008800':
          a=="Ns" ? '#CC9999':
          a=="1AU" ? '#FF6600':
          a=="1AUj" ? '#FFFFCC':
          a=="Nag" ? '#FFFF00':
          a=="UB" ? '#FF0000':
          a=="UBj" ? '#FFFFFF':
          a=="A" ? '#22AA00':
          a=="1AUx" ? '#999999':
          a=="2AUE" ? '#FF0000':
          a=="2AU" ? '#AA00AA':
                  '#14C7E9C0'; 
        }
function style_plu(features){ 
    return{
        fillColor: couleur_plu(features.properties.LAYER),
        weight: 2,
        opacity: 0.2,
        color: 'white',
        fillOpacity: 0.7,
        clickable: true
    };

Hors ligne

 

Pied de page des forums

Powered by FluxBB