une seule méthode : surcharger la méthode comme dans le patch. L'API ne peut pas faire cela sans une configuration (à mettre en oeuvre) qui dirait tel attribut en titre, tel attribut pas visible ...
D'un autre côté, nettoyer les données avant est sûrement une meilleure soluce !
Cf. supra (tel attribut pas visible ...)
Je reviens sur ce phénomène de texte en double dans l'info-bulle... et dans le cas présent ce n'est pas un problème de données en double.
Actuellement, l'anomalie ne se produit plus que sur l'attribut <name>, qui apparait à la fois dans le titre et dans le corps de l'info-bulle. Voir la popup du contour du département de cette page.
Peut-on éviter tout simplement ce texte en double, sans pour autant supprimer totalement l'attribut <name> car il a l'avantage de disposer d'un CSS spécifique pour le titre ?
En effet, c'est corrigé depuis la récente mise à jour. Merci dgrichard.
Par contre, il reste une difficulté liée à l'affichage de tous les attributs, y compris ceux qu'il n'y a pas lieu de publier, du genre :
Existe t'il une astuce pour faire le tri des attributs à afficher ?<Type>12</Type>
<styleUrl>#FEATURES</styleUrl>
Plusieurs pistes :
* soit tu le fais « définitivement » (dans le KML) parce qu'ils ne te servent vraiment pas;
* soit tu nettoies les objets chargés (beforeFeatureInsert) en retirant les attributs en questions;
* soit tu récris (en fait modifies) Geoportal.Popup.Anchored.createPopUpForKMLFeature().
Hélas je ne sais pas faire - et je ne suis probablement pas le seul - d'où la question et j'ai bien conscience d'être un boulet.
La formule la plus adaptée (et accessible) semble être celle-ci :
Mais si on cherche « beforeFeatureInsert » sur Google : Que nenni ! Donc difficile pour un nom programmeur d'en tirer parti.
Y aurait-il un exemple simple (syntaxe et emplacement) permettant d'extraire par exemple <Type>12</Type> ; on pourrait ensuite extrapoler et ne plus "tourner autour" pour avoir la soluce ?
Normal, je me suis embrouillé le clavier : c'est preFeatureInsert qu'il faut utiliser
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 var kml= VISU.getMap().addLayer( "KML", "Nom", "URL", { ... preFeatureInsert:function(f) { if (!f) { return;} if (!(f.attributes && f.attributes.length>0)) { return;} delete f.attributes['Type']; Geoportal.Popup.setPointerCursorForFeature(f); } }, { ... });
Le code est dans cette page mais la couche concernée (Marqueurs KML) ne se charge plus ? ? ?
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 var mar= VISU.getMap().addLayer( "KML", "Marqueurs KML", "sites21-marqueurs-8.kml", { minZoomLevel: 0, maxZoomLevel:20, // preFeatureInsert: Geoportal.Popup.setPointerCursorForFeature,// Style du pointeur styleMap: MarqueursStyle, isBaseLayer: false, visibility:true,// Affichage : false=décoché dans le menu des couches preFeatureInsert:function() { if (!f) { return;} if (!(f.attributes && f.attributes.length>0)) { return;} delete f.attributes['Type']; Geoportal.Popup.setPointerCursorForFeature(f); } }, { formatOptions:{ extractStyles:true // true = lecture des styles KML }, preventDefaultBehavior:false, // true = pas de contrôleur Select });
Il manque le paramètre d'appel (mais, c'est de ma faute ...) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 preFeatureInsert:function(f) {
OK, le chargement se fait bien mais :
- La main du pointeur est remplacée par une croix,
- les "Type" sont toujours dans les popups.
Erreur Javascript :
qu'il faut enlever f.attributes est un Object, pas un Array
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 && f.attributes.length>0
Cela se voit de suite avec un deboggeur ...
Les marqueurs disparaissent si on remplace :
Par :if (!(f.attributes && f.attributes.length>0)) { return;}
if (!(f.attributes)) { return;}
Ben oui, tu as un style qui dépend de Type
C'est donc pas le bon attribut à enlever ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 MarqueursStyle.addUniqueValueRules("default", "Type", lookup);
Retour à la case départ (ou presque car tu peux enlever d'autres attributs ainsi) ... tu vas être obligé de récrire Geoportal.Popup.Anchored.createPopUpForKMLFeature() ...
C'est pas le plus compliqué car il suffit de modifier la méthode qui fait le travail :
On voit que la variable skip permet de filtrer ...
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 /** * Method: _creat4KML * Create function for KML based features. * the calling context is the feature. * * Returns: * {<Geoportal.Popup.Anchored>} - the popup. */ Geoportal.Popup.Anchored._creat4KML= function() { var popup; var opts= OpenLayers.Util.extend({},this.layer.formatOptions); OpenLayers.Util.applyDefaults( opts,{ size:null, closeBox:true, onPopupClose:Geoportal.Popup.onPopupClose, backgroundColor:'#ffffff', opacity:0.75 }); var tempText; if(this.style) { // add style pop-up define in kml's file // user can use in kml's file variable like '$[name]' // which correspond to balise inside placemark like <name>,<description>,<adresses> tempText= this.style.balloonStyle; if(tempText != null) { var rx= /\$\{([a-zA-Z0-9_\-\.]*)\}/; while(tempText.match(rx)) { var test= RegExp.$1; test= (this.attributes[test]? (this.attributes[test].value? this.attributes[test].value : this.attributes[test]) : ""); tempText= tempText.replace(rx,test); } } else { tempText= (this.attributes.name? this.attributes.name+"<br/>":"")+ (this.attributes.description? this.attributes.description:""); tempText= Geoportal.Util.cleanContent(tempText); } popup= new Geoportal.Popup.Anchored( "chicken", this.geometry.getBounds().getCenterLonLat(), opts.size, this.style.textColor? "<div class='gpPopupBody gpKML' style='"+this.style.textColor+";'>"+tempText+"</div>" : "<div class='gpPopupBody gpKML'>"+tempText+"</div>", null, opts.closeBox, this.style.bgColor, this.style.bgColorOpacity, opts.onPopupClose, this ); } else { //if there are no style defines in kml's file var skip= []; var name= ''; if (typeof(this.attributes.name)=='object') { name= this.attributes.name.value || ''; } else { name= this.attributes.name || ''; } if (name) { skip.push('name'); } if (typeof(this.attributes.description)=='object') { tempText= this.attributes.description.value || ''; } else { tempText= this.attributes.description || ''; } tempText= Geoportal.Util.cleanContent(tempText); if (tempText) { skip.push('description'); } var T= Geoportal.Control.renderFeatureAttributes(this,skip); name= name || T[0]; if (tempText!='' && T[1]!='') { tempText+='<br/>'; } tempText+= T[1]; popup= new Geoportal.Popup.Anchored( "chicken", this.geometry.getBounds().getCenterLonLat(), opts.size, "<div class='gpPopupHead gpKML'>" + name + "</div>" + "<div class='gpPopupBody gpKML'>" + tempText + "</div>", null, opts.closeBox, opts.backgroundColor, opts.opacity, opts.onPopupClose, this ); } popup= Geoportal.Popup.completePopup(popup,this.layer.formatOptions); this.popup= popup; return this.popup; };
devrait faire l'affaire
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 var skip= ['Type'];
L'ensemble de code est à mettre dans la page avant la création des popups.
PS: je rappelle que le code source est téléchargeable ...
Il me semble avoir soulevé un bon lièvre car, même avec ce fabuleux code, le « Type » est toujours indéracinable
Que nenni, il suffit de regarder le code source pour se rendre compte que les tests sont en minuscules :
devrait le faire ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 var skip= ['type'];
Je vais quand même regarder pour améliorer cela :
1.- en mettant supposant que skipAttributes est un attribut du layer;
2.- en testant en case insensible.
Excellent, c'est le résultat tant attendu.
Merci pour ton aide efficace dgrichard
Par contre, pour ce qui concerne la casse, le fichier KML comportait bien une majuscule à "Type".
Je crois qu'il y a lieu de classer cette discussion [Résolu]
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 <Placemark> <name>Ahuy</name> <Catégorie>27 voies du 2+ à 7b</Catégorie> <Coordonnées_GPS><![CDATA[ WGS84 (fuseau UTM31)<br/> <b>5.01181 - 47.37080</b> ]]></Coordonnées_GPS> <Info><![CDATA[<a href="http://www.valroc.net/index.php?option=com_content&view=article&id=6:ahuy&catid=34:sites-escalade" target="_blank"> En savoir plus]]></Info> <Type>1</Type> <Point> <coordinates>5.01181,47.37080,0</coordinates> </Point> </Placemark>
Une règle : Surtout, ne jamais s’enthousiasmer à chaud.
Après quelques contrôles de routine, les (sales) « Type » sont toujours là sur :
- Chrome (7.0.517.41)
- Explorer (8.0.6)
Donc la soluce "standard" ne fonctionne bien qu’avec Firefox (3.6.12).
Non, il faut juste faire les choses (maintenant) dans le bon ordre
Met la surcharge de la méthode Geoportal.Popup.Anchored._creat4KML() dans le corps de la fonction initGeoportalMap().
Chrome charge plus vite que FF, la surcharge est donc lue avant que les APIs ne soient chargées et donc est écrasée ...
IE reste un mystère (mais, si le chargement des APIs est plus lent que celui de la page avec la surcharge, alors Cf. Chrome)
En mettant la surcharge dans le code de initGeoportalMap() on assure qu'elle est interprété après les autres javascripts (la méthode étant supposée être appelée en dernier) ...
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager