Je viens d'essayer un extractFolders:true et j'ai une erreur!
La page en cause est à l'adresse http://atlasnw.free.fr/geoportail/ex...l_folders.html
Je viens d'essayer un extractFolders:true et j'ai une erreur!
La page en cause est à l'adresse http://atlasnw.free.fr/geoportail/ex...l_folders.html
Bon, l'utilisation de extractFolders:true provoque un comportement inadapté lors de l'insertion des objets et un plantage lors du calcul de l'emprise du KML lu. Ceci est principalement du au fait qu'avec ce mode le format OpenLayers.Format.KML retourne un tableau de folders contenant des objets et non des objets directement; il faut donc changer la façon de lire le KML, chaque folder pouvant devenir une couche séparée (mais, on en charge le KML qu'une fois).
J'ai donc ajouter en développement des tests pour blinder les méthodes OpenLayers.Layer.Vector.addFeatures() et OpenLayers.Layer.Vector.getDataExtent() pour éviter le problème : maintenant aucun objet n'est chargé ...
Voici comment exploiter proprement extractFolders:true, ce code pourrait être incorporé directement à l'API si les utilisateurs le souhaitent ...
il est basé sur l'exemple de mga_geo (à adapter donc)
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 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"><!-- coding: utf-8 --> <head> <title>Kml et folders</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> <script type="text/javascript" src="http://api.ign.fr/geoportail/api?v=1.0&key=CLEF&instance=VISU&> <!-- --> </script> <script type="text/javascript"> <!-- // the viewer variable is declared by the API through the instance parameter viewer= null; map= null; kmlUrl= null; function loadKMLSuccess(xhr) { var doc= xhr.responseXML; if (!doc) { doc= xhr.responseText; } if (!doc) { OpenLayers.Console.error(kmlUrl+' : KML vide ?'); return; } var folders= new OpenLayers.Format.KML({ internalProjection: map.getProjection(), extractStyles: true, extractFolders: true }).read(doc); if (!folders || folders.length==0) { OpenLayers.Console.error(kmlUrl+' : pas de folder ?'); return; } for (var i= 0, l= folders.length; i<l; i++) { var features= folders[i].features; var kml= new OpenLayers.Layer.Vector(folders[i].name,{ // originators, onFeatureInsert, ... visibility: true, minZoomLevel: 8, maxZoomLevel: 14}); kml.addFeatures(features); map.addLayer(kml); } map.setCenterAtLonLat(-1.500,48.1335,14); OpenLayers.Console.debug('initGeoportalMap() fin'); } function loadKMLFailure(xhr) { OpenLayers.Console.error('fichier KML '+kmlUrl+' non trouvé ?'); } function initGeoportalMap() { OpenLayers.Console.debug('initGeoportalMap() debut'); geoportalLoadviewer("viewerDiv", "normal"); if (!viewer) { OpenLayers.Console.error('new.instance.failed'); return; } viewer.addGeoportalLayers(['ORTHOIMAGERY.ORTHOPHOTOS:WMSC', 'GEOGRAPHICALGRIDSYSTEMS.MAPS:WMSC']); map= viewer.getMap(); kmlUrl= "http://atlasnw.free.fr/geoportail/exemples/folders.kml"; var xhr= OpenLayers.Request.GET({ url:kmlUrl, params:null,//proxy, params, etc ... Cf. OpenLayers.Request.config() scope:null, success:loadKMLSuccess, failure:loadKMLFailure }); } --> </script> </head> <body> <div id="viewerDiv" style="width:98%;height:95%;"></div> <div id="example_explain"> <pre> Utilisation des folders d'un fichier kml Ajout du ticket 2195 http://trac.openlayers.org/ticket/2195 http://www.developpez.net/forums/d847878/applications/sig-systeme-dinformation-geographique/ign-api-geoportail/erreur-chargement-kml/ </pre> </div> </body> </html>
Attention: le proxy est important si le KML n'est pas sur le même site.
Effectivement cela permet de charger le kml en affectant une couche à chaque folder. Mais le problème de sélection multi-couches reste entier dans ce cas.
Ben si, il suffit d'utiliser maintenant le select multi-couches :
Cela ne résout le cas général sous FF, mais permet de jouer
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 ... var kmls=[]; for (var i= 0, l= folders.length; i<l; i++) { var features= folders[i].features; var kml= new OpenLayers.Layer.Vector(folders[i].name,{ // originators, onFeatureInsert, ... visibility: true, minZoomLevel: 8, maxZoomLevel: 14, preFeatureInsert: Geoportal.Popup.setPointerCursorForFeature, onFeatureInsert: Geoportal.Popup.Anchored.createPopUpForKMLFeature}); viewer.getMap().addLayer(kml); kml.addFeatures(features); kmls.push(kml); } //au survol => highlight sur le style "temporary" : var hoverCtrlOpts= OpenLayers.Util.extend(viewer.getMap().getPopupDefaults('KML'), { hover:true, highlightOnly: true, renderIntent: "temporary" }); var hoverCtrl= new OpenLayers.Control.SelectFeature(kmls, hoverCtrlOpts); viewer.getMap().addControl(hoverCtrl); viewer.getMap().events.on({ "changelayer":Geoportal.Map.onVisibilityChange, scope:hoverCtrl}); //au clic => zoom sur l'emprise de l'objet var clickCtrlOpts= OpenLayers.Util.extend(viewer.getMap().getPopupDefaults('KML'), {}); var clickCtrl= new OpenLayers.Control.SelectFeature(kmls, clickCtrlOpts); viewer.getMap().addControl(clickCtrl); viewer.getMap().events.on({ "changelayer":Geoportal.Map.onVisibilityChange, scope:clickCtrl}); ...
Je viens de mettre à jour ma page http://atlasnw.free.fr/geoportail/ex...l_folders.html mais je dois avoir quelques loupés ...
Deux à mon avis :
1/ la non prise en compte du hoverCntrl par la carte, mais les évènements sont quant même cablés ... Activation/Désactivation des couches Est/Ouest provoque une erreur (this.map is null);
2/ surtout, l'appel à setCenterAtLonLat() qui s'effectue AVANT la création des contrôles qui les rendent donc insensibles à la désactivation/activation des couches (cf. erreur supra).
Histoire de terminer la conversation. J'ai repris le code donné par dgrichard dans cette page
1/ Je déplore aussi son constat :Malgré de vains bidouillages. Des retours me seraient encore nécessaires.1/ la non prise en compte du hoverCntrl par la carte
2/ Par contre, il me semble que l'activation des couches est ok. Mais je ne comprends peut-être pas sa remarque.
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