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