Bonjour,
Si on ajoute une couche WFS sur l'exemple multi-fournisseurs l'affichage est correcte avec les layers Geoportail mais rien ne s'affiche avec la layer OSM.
Une idée ?
(NB pas de soucis en WMS)
Bonjour,
Si on ajoute une couche WFS sur l'exemple multi-fournisseurs l'affichage est correcte avec les layers Geoportail mais rien ne s'affiche avec la layer OSM.
Une idée ?
(NB pas de soucis en WMS)
Bon ben je m'auto-répond.
En fait la layer (disons "lWFS") est lié a un objet pour le rendu de type 'OpenLayers.Format'. Cet object utilise un paramètre 'internalProjection' pour pouvoir correctement reprojeter le tracé or il reste bloqué sur la projection initiale. Si après avoir changer le provider je fais un
(pour OSM) ça marche.
Code : Sélectionner tout - Visualiser dans une fenêtre à part lWFS.formatObject.internalProjection = new OpenLayers.Projection('EPSG:900913');
Bref plus qu'a automatiser
J'ai justement donné toutes les informations là (enfin, j'espère)
Je regarde ça plus sérieusement dans le WE mais ce qui me semble sur c'est que la reprojection seul des features d'une layer Vector ne suffie pas pour une couche WFS. Si vous avez un exemple WFS qui tourne et qui passe bien en passant de Geoportal => OSM je veux bien le voir.
J'ai automatiser le changement comme dit dans mon précédant message en ajoutant juste :
Et avec ça les couches WFS fonctionnent sans pb même quand on change de projection en baseLayer.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 function _switchBL(v) { /* (...) code ISO example multi_provider */ for (var i = 0, len = viewer.getMap().layers.length; i < len; i++) { var l = viewer.getMap().layers[i]; if (l instanceof OpenLayers.Layer.WFS) l.formatObject.internalProjection = viewer.getMap().baseLayer.projection.clone(); } }
Mais c'est pas beau car ça devrait directement être gérer soit au niveau de l'objet Map soit au niveau de l'objet Vector (à voir si il n'y a pas d'effet de bord avec les autres sous-classes de Vector).
Mais bon sans accès au code source de la beta5 difficile d'opérer au bon endroit
Dans cette discussion, tu as tout les éléments.
J'ai, peut être à tord, considéré qu'il fallait que le serveur WFS supporte la nouvelle projection de la baseLayer...
Mais, ta soluce est la même que la miennes pour les classes basées sur OpenLayers.Layer.Vector ...
Je regarderai si, dans le cas où la projection n'est pas supportée côté serveur, on peut rajouter le même comportement que pour les données vecteur (reprojetter dans le client).
Le mécanisme serait le suivant :
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 /** * APIMethod: changeBaseLayer * Listener of the map's event 'changebaselayer'. * Reproject its maxExtent according to the new * base layer if it is not a base layer itself. * * Parameters: * evt - {Event} the 'changebaselayer' event. * * Context: * layer - {<OpenLayers.Layer>} the new baseLayer * baseLayer - {<OpenLayers.Layer>} the old baseLayer * * Returns: * {Boolean} true to keep on, false to stop propagating the event. */ OpenLayers.Layer.WFS.prototype.changeBaseLayer= function(evt) { if (OpenLayers.Layer.prototype.changeBaseLayer.apply(this,arguments)===false) { return false; } if (!this.isBaseLayer) { var p= this.getCompatibleProjection(evt.layer); if (p!=null) { this.projection= p; } this.setVisibility(false);// insére ton code ici } return true; };
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