IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

IGN API Géoportail Discussion :

kml et traitement des folders


Sujet :

IGN API Géoportail

  1. #1
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 2 130
    Points : 1 765
    Points
    1 765
    Par défaut kml et traitement des folders
    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

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur cartographe
    Inscrit en
    Avril 2009
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur cartographe
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 173
    Points : 4 224
    Points
    4 224
    Par défaut
    Citation Envoyé par mga_geo Voir le message
    Je viens d'essayer un extractFolders:true et j'ai une erreur!
    Ok, je regarde

  3. #3
    Expert confirmé
    Homme Profil pro
    Ingénieur cartographe
    Inscrit en
    Avril 2009
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur cartographe
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 173
    Points : 4 224
    Points
    4 224
    Par défaut
    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 ...

    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&amp;key=CLEF&amp;instance=VISU&amp;>
        <!--
          -->
        </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>
    il est basé sur l'exemple de mga_geo (à adapter donc)
    Attention: le proxy est important si le KML n'est pas sur le même site.

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 2 130
    Points : 1 765
    Points
    1 765
    Par défaut
    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.

  5. #5
    Expert confirmé
    Homme Profil pro
    Ingénieur cartographe
    Inscrit en
    Avril 2009
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur cartographe
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 173
    Points : 4 224
    Points
    4 224
    Par défaut
    Citation Envoyé par mga_geo Voir le message
    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 :

    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});
            ...
    Cela ne résout le cas général sous FF, mais permet de jouer

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 2 130
    Points : 1 765
    Points
    1 765
    Par défaut Je joue
    Je viens de mettre à jour ma page http://atlasnw.free.fr/geoportail/ex...l_folders.html mais je dois avoir quelques loupés ...

  7. #7
    Expert confirmé
    Homme Profil pro
    Ingénieur cartographe
    Inscrit en
    Avril 2009
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur cartographe
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 173
    Points : 4 224
    Points
    4 224
    Par défaut
    Citation Envoyé par mga_geo Voir le message
    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).

  8. #8
    Membre éprouvé Avatar de cmail
    Homme Profil pro
    Inscrit en
    Mai 2009
    Messages
    1 730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Loire (Auvergne)

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 730
    Points : 966
    Points
    966
    Par défaut
    Histoire de terminer la conversation. J'ai repris le code donné par dgrichard dans cette page

    1/ Je déplore aussi son constat :
    1/ la non prise en compte du hoverCntrl par la carte
    Malgré de vains bidouillages. Des retours me seraient encore nécessaires.

    2/ Par contre, il me semble que l'activation des couches est ok. Mais je ne comprends peut-être pas sa remarque.

Discussions similaires

  1. [VB.Net] Traitement des résultats d'une requète
    Par Catalan dans le forum ASP.NET
    Réponses: 23
    Dernier message: 05/10/2005, 18h29
  2. Traitement des dates différent suivant le serveur
    Par le lynx dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 30/09/2005, 12h14
  3. Réponses: 1
    Dernier message: 24/07/2005, 23h25
  4. Traitement des champs memo par DBGrid
    Par Sydaze dans le forum Bases de données
    Réponses: 4
    Dernier message: 18/04/2005, 10h24
  5. traitement des caractères spéciaux avec XSLT
    Par Mirgue dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 19/07/2004, 17h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo