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 :

Changer le nombre de décimale en kml


Sujet :

IGN API Géoportail

  1. #1
    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 Changer le nombre de décimale en kml
    C'est un vieux débat qui animait certains...

    Dans cet exemple IGN, l'enregistrement des couches en kml se fait avec 15 (!!!) décimales.
    J'aimerais diminuer ce nombre, mais je patine (c'est vrai que c'est l'époque!) comme dab...
    Sans remonter à OpenLayers.Format.KML.js, il me semblerait que je devrais triturer la méthode onClick de Geoportal.Control.SaveLayer??? Si oui, comment???
    Car pas vu d'option simple (à ma portée, quoi!) du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     kml: {
                            formatClass: OpenLayers.Format.KML,
                            options:{NbDecimale: 7, 
                                mime: 'application/vnd.google-earth.kml'
                            }
                        },

  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
    En fait, tout est dans cette instruction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var str= fw.write(this.layer.features, prt);
    C'est donc la classe OpenLayers.Format.* qui boucle sur les objets ...
    Si tu veux du kml, il te faut remplacer la méthode onClick :

    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
    Geoportal.Control.SaveLayer.prototype.onClick(element,evt) {
       // sauvegarder les objets :
       var fscopie= [];
       for (var i= 0, l= this.layer.features.length; i<l; i++) {
           fscopie.push(this.layer.features[i].clone());
       }
       // changer les coordonnées (on garde deux chiffres après la virgule) :
       for (var i= 0, l= this.layer.features.length; i<l; i++) {
          
    this.layer.features[i].geometry.x= this.layer.features[i].geometry.x).toFixed(2);
          
    this.layer.features[i].geometry.y= this.layer.features[i].geometry.y).toFixed(2);
    
       }
       // recopier le code de onClick
       ...
       // remettre les objets originaux
       this.layer.features= dscopie;
    }
    Sinon, ne pas oublier que KML est en longitude, latitude (donc en degré), pas en kilométres ...

  3. #3
    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
    Sans explication supplémentaire, je crois que je vais laisser tomber cette question qui me bouffe du temps et de l'énergie. D'autant plus, que je supprime assez facilement ces décimales supplémentaires en reprenant mon fichier kml avec notepad++ et une fonction spécifique. Mais comme ce n'est pas très satisfaisant d'un point de vue logique de travail, j'avais à coeur de faire cela correctement...

    Si tu veux du kml, il te faut remplacer la méthode onClick :
    Celle qui se trouve bien à la ligne 1833... Que je devrais donc réécrire de la manière suivante (avec un problème de syntaxe que je n'arrive pas à corriger!):
    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
     onClick: function(element,evt) {
    	 Geoportal.Control.SaveLayer.prototype.onClick(element,evt) {
       // sauvegarder les objets :
       var fscopie= [];
       for (var i= 0, l= this.layer.features.length; i<l; i++) {
           fscopie.push(this.layer.features[i].clone());
       }
       // changer les coordonnées (on garde deux chiffres après la virgule) :
       for (var i= 0, l= this.layer.features.length; i<l; i++) {
          
    this.layer.features[i].geometry.x= this.layer.features[i].geometry.x).toFixed(2);
          
    this.layer.features[i].geometry.y= this.layer.features[i].geometry.y).toFixed(2);
    
       }
       // recopier le code de onClick
    OpenLayers.Event.stop(evt? evt : window.event);
                    if (element.id.match(/^(format|proj|pretty)/) && OpenLayers.String.contains(element.id,this.id)) {
                        if (!element.hasFocus) {
                            var e= OpenLayers.Util.getElement('format' + this.id);
                            if (e && element.id!=e.id && e.hasFocus) {
                                Geoportal.Control.Form.focusOff(e);
                            }
                            e= OpenLayers.Util.getElement('proj' + this.id);
                            if (e && element.id!=e.id && e.hasFocus) {
                                Geoportal.Control.Form.focusOff(e);
                            }
                            e= OpenLayers.Util.getElement('pretty' + this.id);
                            if (e && element.id!=e.id && e.hasFocus) {
                                Geoportal.Control.Form.focusOff(e);
                            }
                            Geoportal.Control.Form.focusOn(element);
                        }
                        return false;
                    }
                    if (element.id.match(/^save/)) {
                        element= OpenLayers.Util.getElement('format' + this.id);
                        var fmt= OpenLayers.String.trim(element.options[element.selectedIndex].value);
                        element.options[0].selected= true;
                        if (fmt=='') { return false; }
                        element= OpenLayers.Util.getElement('proj' + this.id);
                        var prj= OpenLayers.String.trim(element.options[element.selectedIndex].value);
                        element.options[0].selected= true;
                        element= OpenLayers.Util.getElement('pretty' + this.id);
                        var prt= element.checked;
                        element.checked= false;
                        var opts= OpenLayers.Util.extend({},this.supportedFormats[fmt].options);
                        OpenLayers.Util.applyDefaults(opts,{
                            internalProjection: this.map.getProjection().clone(),
                            externalProjection: new OpenLayers.Projection(prj)
                        });
                        var fw= new this.supportedFormats[fmt].formatClass(opts);
                        var str= fw.write(this.layer.features, prt);
                        str= this.showPretty(str, fmt, prt);
                        if (fmt instanceof OpenLayers.Format.XML) {
                            str= '<?xml version="1.0" encoding="UTF-8"?>' + (prt?  '\n':'') + str;
                        }
                        element= OpenLayers.Util.getElement('CT' + this.id);
                        element.value= this.supportedFormats[fmt].mime;
                        element= OpenLayers.Util.getElement('FN' + this.id);
                        element.value= this.layer.name+'.'+fmt;
                        element= OpenLayers.Util.getElement('DT' + this.id);
                        element.value= str;
                        element= OpenLayers.Util.getElement('__savelayer__' + this.id);
                        element.submit();
                    }
                    this.closeForm();
                    return false;
    
       // remettre les objets originaux
       this.layer.features= dscopie;
    },
    Bref, (outre le problème de syntaxe) où je désespère un peu c'est dans ta dernière remarque
    Sinon, ne pas oublier que KML est en longitude, latitude (donc en degré), pas en kilométres ...
    qui me renvoie (me semble-t-il) à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    this.layer.features[i].geometry.x= this.layer.features[i].geometry.x).toFixed(2);
          
    this.layer.features[i].geometry.y= this.layer.features[i].geometry.y).toFixed(2);
    et qu'il faudrait (me semble-t-il) que je transforme en degré et là, je jette l'éponge définitivement ...
    Bonne Année, quand même

  4. #4
    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
    Et pourtant la réponse est dans cet exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     var opts= OpenLayers.Util.extend({},this.supportedFormats[fmt].options);
     OpenLayers.Util.applyDefaults(opts,{
        internalProjection: this.map.getProjection().clone(),
        externalProjection: new OpenLayers.Projection(prj)
     });
     var fw= new this.supportedFormats[fmt].formatClass(opts);
     var str= fw.write(this.layer.features, prt);
    La reprojection est assurée de l'internalProjection (le système de la carte) vers le système cible (par exemple: 'IGNF:WGS84G' pour les coordonnées géographiques en degrés).

    Dans le pire des cas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var source= this.map.getProjection().clone();
    var dest= new OpenLayers.Projection('IGNF:WGS84G');
    for (var i= 0, l= this.layer.features.length; i<l; i++) {
    this.layer.features[i].geometry.transform(source, dest);
    }
    le fera aussi

    Pour l'erreur, c'est de ma faute (de frappe) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    geometry.x).
    geometry.y).
    il faut enlever la ')'

  5. #5
    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
    Pour l'erreur, c'est de ma faute (de frappe) :
    C'est aussi de ma faute, car j'aurais du la voir!! Mais il y a aussi d'autres choses qui décon...
    Mes essais de bidouillage étant nombreux, je ne peux m'étendre dessus... Découragé, le boulet!
    Dommage qu'il n'existe pas un bouton équivalent à "résolu" mais du type "Abandon"

Discussions similaires

  1. [Nombre]formater le nombre de décimal après une virgule.
    Par PascalCmoa dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 09/03/2007, 10h40
  2. Définir un nombre de décimales
    Par IDE dans le forum API standards et tierces
    Réponses: 5
    Dernier message: 11/01/2006, 17h52
  3. Comment fixer le nombre de décimal !
    Par Paul1804 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 09/01/2006, 15h12
  4. définir nombre de décimale
    Par capone dans le forum C++Builder
    Réponses: 5
    Dernier message: 08/01/2006, 14h15
  5. round avec nombre de décimale spécifiée
    Par bilb0t dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 14/04/2005, 16h44

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