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 :

Projection par defaut d'un Geometry.Point ?


Sujet :

IGN API Géoportail

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 22
    Points : 11
    Points
    11
    Par défaut Projection par defaut d'un Geometry.Point ?
    Bonjour,

    J'essaye de migrer une appli google maps vers l'api geoportail et je dois dire que je ne m'attendais pas a cette montagne de difficultés....
    J'essaye betement d'afficher un marqueur avec des coordonnees wgs84, rien de plus simple me direz vous. Voila mon code:
    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
        function initGeoportalMap() {
          // crs par defaut : IGNF:GEOPORTALFXX
          geoportalLoadVISU("GeoportalVisuDiv", "normal", 'FXX', null,['IGNF:LAMB93', 'IGNF:RGF93G', 'EPSG:4978'],'/nmp/bn/php/ign_proxy.php?url=');
    
          if (VISU) {
            VISU.addGeoportalLayer("ORTHOIMAGERY.ORTHOPHOTOS", {visibility:false});
            VISU.addGeoportalLayer("GEOGRAPHICALGRIDSYSTEMS.MAPS", {opacity:1.0});
            Geoportal.Lang['fr']['ORTHOIMAGERY.ORTHOPHOTOS'] = 'Satellite';
            Geoportal.Lang['fr']['GEOGRAPHICALGRIDSYSTEMS.MAPS'] = 'IGN';
    
            VISU.getMap().events.register("click",VISU.getMap(),
                                function(e)
                               {
                                 var pos = VISU.getMap().getLonLatFromViewPortPx(e.xy); alert(pos);
                              }
            );
            var toolbox = VISU.getMap().getControlsByClass('Geoportal.Control.ToolBox')[0];
            var searchbar = new Geoportal.Control.SearchToolbar({
              div: OpenLayers.Util.getElement(toolbox.id + '_search'),
              geonamesOptions: {
                setZoom: Geoportal.Control.LocationUtilityService.GeoNames.setZoomForBDNyme,
                layerOptions: {
                  name: 'TOPONYMS.ALL:OPENLS',
                  formatOptions: {
                    version: '1.0'
                  }
                }
              },
              geocodeOptions: {
                  layerOptions: {
                      name: 'ADDRESSES.CROSSINGS:OPENLS',
                      formatOptions: {
                          version:'1.0'
                      }
                  },
                  matchTypes: [
                      {re:/city/i,    src:Geoportal.Util.getImagesLocation()+'OLScity.gif'},
                      {re:/street$/i, src:Geoportal.Util.getImagesLocation()+'OLSstreet.gif'},
                      {re:/number/i,  src:Geoportal.Util.getImagesLocation()+'OLSstreetnumber.gif'},
                      {re:/enhanced/i,src:Geoportal.Util.getImagesLocation()+'OLSstreetenhanced.gif'},
                      {re:null,       src:Geoportal.Util.getImagesLocation()+'OLSstreet.gif'}
                  ]
          		}
            });
            VISU.openLayersPanel(false); // collapse contenu layer
            VISU.openToolsPanel(false); // collapse contenu outils
            VISU.getMap().addControl(searchbar);
            VISU.getMap().setCenterAtLonLat(1.55, 43.84,9);
    
                var mon_point = new OpenLayers.Geometry.Point(1.55, 43.84);
                mon_point.transform(OpenLayers.Projection.CRS84, VISU.getMap().projection);
                var stylepoi = { externalGraphic: 'img/mark_bn.png', graphicWidth: 20, graphicHeight: 34 };
                var mon_poi = new OpenLayers.Feature.Vector(mon_point, null, stylepoi);
                var vector_layer = new OpenLayers.Layer.Vector('Mes POIs');
                vector_layer.addFeatures([mon_poi]);
                VISU.getMap().addLayer(vector_layer);
          }
        }
    Le marqueur s'affiche dans le golf de guinee alors que, bizarrement, je le verrais bien au nord de Toulouse... Je comprends bien qu'il y a une histoire de projection quelque part mais je n'arrive pas a trouver mon erreur (un geoportalLoadVISU avec un crs type EPSG:4978 par exemple, m'affiche un bon positionnement mais avec une carte toute distordue et je ne comprends pas le rapport avec le transform sur le point...).

    J'avais cru comprendre, a force de ramer sur le net, que les geometry.point etaient par defaut en wgs84... Ce n'est pas le cas ?!

    Autre question: y a-t'il moyen d'eviter les transform assez couteux quand on travaille en coordonnees wgs84 ?

    Merci de votre aide, je commence a desesperer...

  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 yafoto Voir le message
    J'essaye de migrer une appli google maps vers l'api geoportail et je dois dire que je ne m'attendais pas a cette montagne de difficultés....
    Mais le support/service/(tout quoi) GM est vachement mieux, pourquoi continuer

    Citation Envoyé par yafoto Voir le message
    J'essaye betement d'afficher un marqueur avec des coordonnees wgs84, rien de plus simple me direz vous.
    Rien n'est simple quant on parle des coordonnées ...
    GM utilise un mercator sphérique avec des points en longitude/latitude (les transformations==reprojections) sont effectuées en interne dans le Javascript ... en opensource, d'ailleurs

    Citation Envoyé par yafoto Voir le message
    Voila mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
                ...
                mon_point.transform(OpenLayers.Projection.CRS84, VISU.getMap().projection);
                ....
                var mon_poi = new OpenLayers.Feature.Vector(mon_point, null, stylepoi);
                var vector_layer = new OpenLayers.Layer.Vector('Mes POIs');
                vector_layer.addFeatures([mon_poi]);
                VISU.getMap().addLayer(vector_layer);
          }
        }
    Le marqueur s'affiche dans le golf de guinee alors que, bizarrement, je le verrais bien au nord de Toulouse... Je comprends bien qu'il y a une histoire de projection quelque part mais je n'arrive pas a trouver mon erreur (un geoportalLoadVISU avec un crs type EPSG:4978 par exemple, m'affiche un bon positionnement mais avec une carte toute distordue et je ne comprends pas le rapport avec le transform sur le point...).
    Les coordonnées ne sont pas reprojetées, peux-tu essayer ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        mon_point.transform(OpenLayers.Projection.CRS84, VISU.getMap().getProjection());
    et regarde qu'elle est la valeur en sortie par rapport à ta ligne de code ...

    De plus, il faudrait créer la couche dans la carte, puis créer les objets et les insérer (plus logique et facilite la lecture) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        var vector_layer = new OpenLayers.Layer.Vector('Mes POIs');
        VISU.getMap().addLayer(vector_layer);
        var mon_poi = new OpenLayers.Feature.Vector(mon_point, null, stylepoi);
        vector_layer.addFeatures([mon_poi]);
    Citation Envoyé par yafoto Voir le message
    J'avais cru comprendre, a force de ramer sur le net, que les geometry.point etaient par defaut en wgs84... Ce n'est pas le cas ?!
    Oui et Non

    * Non : les géométries OpenLayers ne sont pas « intelligentes ». C'est d'ailleurs un des objectifs de la version 3 que de rendre les géométries consciente des projections.

    * Oui : Les géométries n'ayant pas cette connaissance, les développeurs récupèrent la projection sur les couches et si, à la création, la couche n'indique pas la projection, alors on va chercher sur la carte (OpenLayers.Map) et là, en l'absence de projection sur la baseLayer active, c'est la propriété 'projection' d'OpenLayers.Map qui donne la réponse : 'EPSG:4326'

    Citation Envoyé par yafoto Voir le message
    Autre question: y a-t'il moyen d'eviter les transform assez couteux quand on travaille en coordonnees wgs84 ?

    Merci de votre aide, je commence a desesperer...
    Oui et Non:

    * Non... C'est la différence avec GM : tu dois faire les transformations explicitement (alors qu'elles y sont tout autant dans GM ... mais c'est underground).

    * Oui, en mettant ta carte en projection géographique, mais le mode pan est clignotant (il faudrait améliorer Geoportal.Layer.Grid), voici un exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
            ...
            geoportalLoadVISU(
                "viewerDiv",
                "normal",
                "FXX",
                "IGNF:RGF93G",
                "IGNF:RGF93G"
            );
            VISU.addGeoportalLayers({global:{transitionEffect:'resize'}});
    de cette façon, la carte est en géographique ... plus besoin de transformation

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 22
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par dgrichard Voir le message
    Mais le support/service/(tout quoi) GM est vachement mieux, pourquoi continuer
    pfff, que des moqueries, c'est malin ça

    Bon, nickel ta solution, you're the boss graaaand merci !! parce que je commençais a devenir chevre. Ceci dit, petites interrogations quand meme:

    Citation Envoyé par dgrichard Voir le message
    Les coordonnées ne sont pas reprojetées
    oui, oui, je vois ça maintenant. Mais heu apres essai, projection et getProjection retournent la meme chaine: 'EPSG:4326' et il n'y a que getProjection qui marche. Ca s'explique ca ???

    Citation Envoyé par dgrichard Voir le message
    les géométries OpenLayers ne sont pas « intelligentes »
    Si je comprends bien, les geometry.point mettons, ne sont qu'un paquet de float qui ne prennent un sens que lorsqu'ils sont ajouter dans un layer. Il faut alors les transformer dans le systeme du layer, voire de la carte, j'ai bon ?

    Citation Envoyé par dgrichard Voir le message
    Oui, en mettant ta carte en projection géographique, mais le mode pan est clignotant
    Ca, pour clignoter, ben ca clignote, houla, bonjour les yeux. Meme avec le transitionEffect, ca le fait pas, bien dommage parce que ca m'economiserais bien du calcul. C'est normal qu'en RGF93G ou EPSG:4326 ca soit tout distordu ?

    Merci encore !

  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
    Citation Envoyé par yafoto Voir le message
    pfff, que des moqueries, c'est malin ça
    non pas vraiment, mais toute référence/comparaison à GM est hors propos ... désolé, c'est nerveux


    Citation Envoyé par yafoto Voir le message
    oui, oui, je vois ça maintenant. Mais heu apres essai, projection et getProjection retournent la meme chaine: 'EPSG:4326' et il n'y a que getProjection qui marche. Ca s'explique ca ???
    Disons, que 'projection' est la propriété de l'objet OpenLayers.MapgetProjection() est la méthode qui retourne la projection de la baseLayer courante (et si aucune la valeur de 'projection' ...)

    Citation Envoyé par yafoto Voir le message
    Si je comprends bien, les geometry.point mettons, ne sont qu'un paquet de float qui ne prennent un sens que lorsqu'ils sont ajouter dans un layer. Il faut alors les transformer dans le systeme du layer, voire de la carte, j'ai bon ?
    Presque :

    * les geometry sont bien un paquet de float non conscient de leur projection ;
    * elles n'ont pas plus de conscience une fois ajoutées car seul la couche a cette conscience ... (et encore)


    Citation Envoyé par yafoto Voir le message
    Ca, pour clignoter, ben ca clignote, houla, bonjour les yeux. Meme avec le transitionEffect, ca le fait pas, bien dommage parce que ca m'economiserais bien du calcul. C'est normal qu'en RGF93G ou EPSG:4326 ca soit tout distordu ?
    Oui, le cache est en projection équidistante cylindrique et non en plat-carrée (grosso modo, un facteur multiplicatif en latitude) ... d'où la légère déformation ...

    Le clignotement vient de ce fait là : les tuiles ne sont plus carré, mais rectangulaire (et encore pas toujours de la même taille à cause du fameux facteur multiplicatif).
    On essayera de trouver une soluce à cela

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 22
    Points : 11
    Points
    11
    Par défaut
    Merci pour les explications, c'est clair. Sauf sur un point:

    Citation Envoyé par dgrichard Voir le message
    Disons, que 'projection' est la propriété de l'objet OpenLayers.MapgetProjection() est la méthode qui retourne la projection de la baseLayer courante (et si aucune la valeur de 'projection' ...)
    Ok compris. Mais dans mon test les deux ont la meme valeur. Comment se fait-il que le transform ne se comporte pas de la meme facon quand cette valeur vient de projection et quand elle vient de getProjection() ? Bon, c'est pas bien grave, ca marche maintenant, c'est juste que je trouve ca bizarre

  6. #6
    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 yafoto Voir le message
    Mais dans mon test les deux ont la meme valeur. Comment se fait-il que le transform ne se comporte pas de la meme facon quand cette valeur vient de projection et quand elle vient de getProjection() ? Bon, c'est pas bien grave, ca marche maintenant, c'est juste que je trouve ca bizarre
    N'ayant pas ta page de test, je ne peux que donner des explications logiques comme :
    [code]
    toString(objetProjection)==code de la projection
    [/ocde]

    Donc entre un objet et une chaîne de caractères, pas de différence... Mais transform() attend des objets ... il ne fait donc rien
    Dans ton cas, les coordonnées restaient donc en géographiques ([-pi, +pi] en X alors que l'espace des coordonnées est [-30 000 000, 30 000 000] => tu te retrouvais presque à l'intersection de l'équateur et du méridien de Greenwich

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 22
    Points : 11
    Points
    11
    Par défaut
    Le code ? Tout bete:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    alert(VISU.getMap().projection + " "+VISU.getMap().getProjection());
    D'apres la doc 2.8 d'OpenLayers.Map, getProjection() retourne bien une string, pas un objet
    getProjection: function()

    This method returns a string representing the projection. In the case of projection support, this will be the srsCode which is loaded -- otherwise it will simply be the string value that was passed to the projection at startup.

    FIXME: In 3.0, we will remove getProjectionObject, and instead return a Projection object from this function.
    Returns

    {String} The Projection string from the base layer or null.
    et donc le transform devrait se comporter de la meme facon avec projection ou getProjection() et ne rien faire comme tu le soulignes...

    Du coup, ce serait plutot getProjectionObject() qu'il faudrait utilisé dans le transform, non ?...

  8. #8
    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 yafoto Voir le message
    Du coup, ce serait plutot getProjectionObject() qu'il faudrait utilisé dans le transform, non ?...
    Avec OpenLayers 2.8/2.9.1, oui ...
    Avec l'API Géoportail, tu peux, mais getProjection() est un alias sur getProjectionObject() qui disparaîtra en OpenLayers 3.x (Cf. FIXME)

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 22
    Points : 11
    Points
    11
    Par défaut
    ah oui, j'etais passer a cote de l'alias. merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Pb : champ Text = pas de valeur par defaut ?]
    Par mat_dum dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 18/08/2003, 12h57
  2. sorte de valeur par defaut
    Par sampq dans le forum Langage SQL
    Réponses: 2
    Dernier message: 25/07/2003, 11h59
  3. [CR 8.5] plages par defaut
    Par .:Tieri:. dans le forum SAP Crystal Reports
    Réponses: 6
    Dernier message: 23/07/2003, 10h52
  4. [BP]Détermination de l'imprimante par défaut
    Par Alcatîz dans le forum Turbo Pascal
    Réponses: 9
    Dernier message: 01/06/2003, 09h52
  5. Valeur par defaut 'True' dans un champ de type bit
    Par Mouse dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 24/03/2003, 15h26

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