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 :

Geoportail en tant que fournisseur de couches de bases


Sujet :

IGN API Géoportail

  1. #1
    Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 94
    Points : 55
    Points
    55
    Par défaut Geoportail en tant que fournisseur de couches de bases
    Encore moi (toutes mes excuses).

    Je me heurte à un pb très simple question formulation mais assez épineux dans la vrai vie :
    Je souhaite que mon application supporte plusieurs fournisseurs de fond de carte (IGN, Google Maps, Yahoo, OpenStreetMap, etc...) et je n'ai absolument aucun besoin de superposition (en gros soit la carte contiens les calques IGN, soit ceux de Google Maps, etc).
    Sur le papier ça paraît simple car OL s'est afficher les différentes couches citées ci-dessus et l'api Geoportail n'est qu'une surcharge... Donc avec un petit gestionnaire de fournisseur il semble assez facile de décharger et recharger les différents calques à la volée.

    Dans la vraie vie c'est pas si simple :
    Hypothèse 1 :
    - Utilisation de Geoportail (donc OL surchargé) avec un Geoportal.Map
    => les couches comme Google ne sont pas directement intégrable et même en positionnant la projection + displayProjection ça ne fonctionne pas (bon je ne suis pas aller complètement au bout de tous les changements nécessaires pour y parvenir)

    Hypothèse 2 :
    - Utilisation de Geoportail (donc OL surchargé) avec un OpenLayers.Map (en pensant à faire 2 objets "map" et d'en masquer un pendant que j'affiche l'autre). Il ne me reste plus qu'à faire suivre et reprojeter mes calques GPX
    => quasi impossible vu les overload de l'API réalisés au niveaux des objets de base d'openlayers et qui ne détectent pas si on a affaire à une carte Geoportal pour changer le traitement.

    Hypothèse 3:
    Utilisation d'OL (v2.8) et accéder aux calques IGN via WMS-C.
    Ben c'est pas direct non plus (gestion proj4j, GeoRM, etc.) mais c'est ce qui semble être le plus simple (et en plus une seule carte)

    Bref quelle est donc la meilleure méthode pour pouvoir réaliser ce besoin ?

  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 shama Voir le message
    Je me heurte à un pb très simple question formulation mais assez épineux dans la vrai vie :
    Je souhaite que mon application supporte plusieurs fournisseurs de fond de carte (IGN, Google Maps, Yahoo, OpenStreetMap, etc...) et je n'ai absolument aucun besoin de superposition (en gros soit la carte contiens les calques IGN, soit ceux de Google Maps, etc).
    Sur le papier ça paraît simple car OL s'est afficher les différentes couches citées ci-dessus et l'api Geoportail n'est qu'une surcharge... Donc avec un petit gestionnaire de fournisseur il semble assez facile de décharger et recharger les différents calques à la volée.

    Dans la vraie vie c'est pas si simple :
    L'API du Géoportail a été construite pour permettre d'utiliser les flux en provenance de l'infrastructure Géoportail, pas les autres fournisseurs flux...

    Citation Envoyé par shama Voir le message
    Hypothèse 1 :
    - Utilisation de Geoportail (donc OL surchargé) avec un Geoportal.Map
    => les couches comme Google ne sont pas directement intégrable et même en positionnant la projection + displayProjection ça ne fonctionne pas (bon je ne suis pas aller complètement au bout de tous les changements nécessaires pour y parvenir)
    Comme il n'y pas pas de superposition entre les flux Géoportail et les autres fournisseurs de flux, il « suffirait » d'avoir des baseLayers pour chaque fournisseur de flux et de surcharger le moteur de l'API Géoportail (ce dernier gère déjà les reprojections lors de l'évènement "changebaselayer" pour les données vectorielles).

    Rien ne l'empêche, mais c'est plutôt lourd ...

    Citation Envoyé par shama Voir le message
    Hypothèse 2 :
    - Utilisation de Geoportail (donc OL surchargé) avec un OpenLayers.Map (en pensant à faire 2 objets "map" et d'en masquer un pendant que j'affiche l'autre). Il ne me reste plus qu'à faire suivre et reprojeter mes calques GPX
    => quasi impossible vu les overload de l'API réalisés au niveaux des objets de base d'openlayers et qui ne détectent pas si on a affaire à une carte Geoportal pour changer le traitement.
    Je suis presque complètement d'accord avec cette analyse :
    les surcharges gèrent les projections uniquement pas le flux lui-même;
    Geoportal.Map surcharge OpenLayers.Map sur les points suivants :

    • enregistre les évènements "changebaselayer" et "changedisplayprojection", il gère aussi un catalogue (s'il existe) pour la GeoDRM ;
    • ajoute des méthodes pour la gestion des couches au travers de leur projection (important pour les changements de baseLayer);
    • gère le changement de langues (évènement "changelang");
    • simplifie le addLayer() par des options par défaut (mais, le addLayer d'Openlayers fonctionne toujours);
    • gère les min/max de la carte lors de l'insertion des couches;



    Citation Envoyé par shama Voir le message
    Hypothèse 3:
    Utilisation d'OL (v2.8) et accéder aux calques IGN via WMS-C.
    Ben c'est pas direct non plus (gestion proj4j, GeoRM, etc.) mais c'est ce qui semble être le plus simple (et en plus une seule carte)
    Ca, c'est l'objet de l'API minimum : elle fournit les connecteurs GeoDRM et laisse le développeur avec ses surcharges OpenLayers (certaines surcharges ont été mises dans cette API minimum, mais elles ne sont pas directement liées aux flux Géoportail, mais aux projections et autres gourmandises)...

    Citation Envoyé par shama Voir le message
    Bref quelle est donc la meilleure méthode pour pouvoir réaliser ce besoin ?
    Mon choix : 3 (qui laisse en plus l'IHM complètement ouverte à la volonté du développeur). C'est pour cela que l'on a rajouté dans la 1.0beta5 (que je n'ai pas encore diffusée pour tests) deux exemples : l'un avec Yahoo! Maps et l'autres avec MapFish. Néanmoins, ces deux exemples montrent comment insérer un flux Géoportail, pas les autres fournisseurs de flux...

  3. #3
    Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 94
    Points : 55
    Points
    55
    Par défaut
    Citation Envoyé par dgrichard Voir le message
    (...)

    Comme il n'y pas pas de superposition entre les flux Géoportail et les autres fournisseurs de flux, il « suffirait » d'avoir des baseLayers pour chaque fournisseur de flux et de surcharger le moteur de l'API Géoportail (ce dernier gère déjà les reprojections lors de l'évènement "changebaselayer" pour les données vectorielles).

    Rien ne l'empêche, mais c'est plutôt lourd ...
    Effectivement...


    Citation Envoyé par dgrichard
    Je suis presque complètement d'accord avec cette analyse :
    les surcharges gèrent les projections uniquement pas le flux lui-même;
    Geoportal.Map surcharge OpenLayers.Map sur les points suivants :

    (...)
    Oui mais non car, SI JE N'AI PAS FAIT d'ERREURS, un bête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var map = new OpenLayers.Map('map');
    var gphy = new OpenLayers.Layer.Google("Google Physical", {type: G_PHYSICAL_MAP});
    map.addLayer(gphy);
    qui fonction avec OL, ne fonctionne pas si on utilise le js Geoportail... !
    => Donc la surcharge est intrusive et ... c'est pas bon ça mon bon monsieur .
    (J'ai même passer un peu de temps pour mettre la bonne projection / projectionDisplay etc. pour google sans succès. Mais bon j'ai pas pousser au bout le debug).

    Citation Envoyé par dgrichard
    Ca, c'est l'objet de l'API minimum : elle fournit les connecteurs GeoDRM et laisse le développeur avec ses surcharges OpenLayers (certaines surcharges ont été mises dans cette API minimum, mais elles ne sont pas directement liées aux flux Géoportail, mais aux projections et autres gourmandises)...
    Ah j'avais loupé cette info. A explorer pour moi si je ne trouve pas mon bonheur dans ce qui est ci-dessous.

    Citation Envoyé par dgrichard
    Mon choix : 3 (qui laisse en plus l'IHM complètement ouverte à la volonté du développeur). C'est pour cela que l'on a rajouté dans la 1.0beta5 (que je n'ai pas encore diffusée pour tests) deux exemples : l'un avec Yahoo! Maps et l'autres avec MapFish. Néanmoins, ces deux exemples montrent comment insérer un flux Géoportail, pas les autres fournisseurs de flux...
    Alors là je suis preneur au plus vite de ces exemples...
    Pas moyen d'accéder au serveur de source juste en consultation/update ?

    Encore une fois merci pour la réactivité dgrichard... c'est vraiment apréciable.

  4. #4
    Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 94
    Points : 55
    Points
    55
    Par défaut
    Pour info j'ai fait un test hier avec accès par WMS :

    1. chargement de proj4js (avec support INGF:GEOPORTAILFXX)
    2. chargement OpenLayers 2.8
    3. chargement de ehttp://api.ign.fr/geoportail/api?v=1.0beta4-e&key=XXXXXXXXXXX&includeEngine=false&"
    3. chargement GeoRMHandler.js (uniquement ce fichier js)

    Avec :
    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
    var ignLayer = new OpenLayers.Layer.WMS(
              "IGN France", 
              "http://wxs.ign.fr/geoportail/wmsc", 
              {
                layers: 'GEOGRAPHICALGRIDSYSTEMS.MAPS',
                exceptions: 'text/xml',
                tiled: true
              },
              {
                isBaseLayer: true,
                projection: new OpenLayers.Projection('IGNF:GEOPORTALFXX'),
                resolutions: [2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048],
                maxExtent: new OpenLayers.Bounds(-1181626.0, 3815715.0, 2340591.0, 7071932.0),
                GeoRM: Geoportal.GeoRMHandler.addKey(
                  gGEOPORTALRIGHTSMANAGEMENT.apiKey,
                  gGEOPORTALRIGHTSMANAGEMENT[gGEOPORTALRIGHTSMANAGEMENT.apiKey].tokenServer.url,
                  gGEOPORTALRIGHTSMANAGEMENT[gGEOPORTALRIGHTSMANAGEMENT.apiKey].tokenServer.ttl,
                  map),
                getURL: function(bounds) {
                  //bounds = this.adjustBounds(bounds);
                  var imageSize = this.getImageSize();
                  var newParams = {
                    'BBOX': this.encodeBBOX ?  bounds.toBBOX() : bounds.toArray(),
                    'WIDTH': imageSize.w,
                    'HEIGHT': imageSize.h
                  };
                  newParams = OpenLayers.Util.extend(newParams, this.GeoRM.getToken());
                  var requestString = this.getFullRequestString(newParams);
                  //console.log("Request: " + requestString);
                  return requestString;
                }
           });
    J'afficher bien et du GoogleMap, du Yahoo, etc + du Geoportail. Mais la gestion des projections d'OL 2.8 ne fonctionne pas bien pour l'IGN (vu que les lonlat sont en pixel IGNF:GEOPRTAILFXX)... Bref un peu (pas mal ?) de boulot pour s'en sortir correctement.
    Si j'ai tout bien compris à votre précédente réponse l'API minimal devrait me permettre de bénéficier de la bonne gestion des projection fait par l'IGN ?

    NB, là y'a pas la gestion des logos officiel mais bon c'était juste un test

  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 shama Voir le message
    Oui mais non car, SI JE N'AI PAS FAIT d'ERREURS, un bête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var map = new OpenLayers.Map('map');
    var gphy = new OpenLayers.Layer.Google("Google Physical", {type: G_PHYSICAL_MAP});
    map.addLayer(gphy);
    qui fonction avec OL, ne fonctionne pas si on utilise le js Geoportail... !
    => Donc la surcharge est intrusive et ... c'est pas bon ça mon bon monsieur .
    (J'ai même passer un peu de temps pour mettre la bonne projection / projectionDisplay etc. pour google sans succès. Mais bon j'ai pas pousser au bout le debug).
    Certes, mais c'est bien parce que l'API ne gère pas la pile de résolutions de Google ... Il faut ajouter le support de cette projection dans l'API Géoportail avec sa table de résolutions : l'API gère les baseLayers en leur affectant une projection ET ses résolutions (ce qui n'est effectivement pas fait pour Google).
    C'est pour cela que j'étais presque complètement d'accord ... il faut combler le trou

    Donc: oui c'est intrusif car la gestion est faite par baseLayers, non car le système se veut générique (cela reste à prouver c'est vrai) ...

    Pour info, j'avais fait une POC, il y a quelques mois, qui impliquait une reprojection des couches Geoportail dans une carte OL avec Google --un peu l'inverse de ton objectif car je visais la superposition-- (bien sûr avec une reprojection à la volée du cache Géoportail via un proxy Perl pour la GeoDRM et en utilisant Mapserver/GDAL et l'API minimum, scénario 3 de notre discussion) :

    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
        <script type="text/javascript">
        <!--
        var map;
    
        function loadMap() {
            // avoid pink tiles
            OpenLayers.IMAGE_RELOAD_ATTEMPTS = 1;
            OpenLayers.Util.onImageLoadErrorColor = "transparent";
    
            var epsg4326= new OpenLayers.Projection("EPSG:4326");
            var epsg3785= new OpenLayers.Projection("EPSG:3785");
            map= new OpenLayers.Map('viewerDiv',
                {
                    projection: epsg3785,
                    displayProjection: epsg4326,
                    units: epsg3785.getUnits(),
                    maxExtent: (new OpenLayers.Bounds(-180, -85.051128514, 180, 85.051128778))
                                .transform(epsg4326, epsg3785, true),
                    controls:[
                        new OpenLayers.Control.PanZoomBar(),
                        new OpenLayers.Control.NavToolbar(),
                        new OpenLayers.Control.LayerSwitcher({'ascending':false}),
                        new OpenLayers.Control.Scale(),
                        new OpenLayers.Control.MousePosition(),
                        new OpenLayers.Control.KeyboardDefaults(),
                        new Geoportal.Control.PermanentLogo() //Cf. CGU
                    ]
                });
    
            var gmap = new OpenLayers.Layer.Google(
                "Google Streets",
                {
                    'sphericalMercator': true
                }
            );
    
            var l0= new OpenLayers.Layer.WMS(
                "Images ortho-rectifiées",
                "http://localhost/cgi-bin/mapserver/mapserv",//FIXME: localhost only !
                {
                    map: 'maps/geoportalfxx.map',
                    layers: 'ORTHOIMAGERY.ORTHOPHOTOS',
                    format:'image/jpeg',
                    exceptions:"text/xml"
                },
                {
                    singleTile: true,
                    isBaseLayer: false,
                    resolutions: [
                       32768.0000000,
                       16384.0000000,
                        8192.0000000,
                        4096.0000000,
                        2048.0000000,
                        1024.0000000,
                         512.0000000,
                         256.0000000,
                         128.0000000,
                          64.0000000,
                          32.0000000,
                          16.0000000,
                           8.0000000,
                           4.0000000,
                           2.0000000,
                           1.0000000,
                           0.5000000
                    ],
                    projection: epsg3785,
                    units: epsg3785.getUnits(),
                    maxExtent: (new OpenLayers.Bounds(-180, -57, 180, 72))
                                .transform(epsg4326, epsg3785, true),
                    opacity:0.75
                }
            );
    
            map.addLayers([gmap, l0]);
            if (!map.getCenter()) {map.zoomToMaxExtent()}
        }
        -->
        </script>

  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 shama Voir le message
    J'afficher bien et du GoogleMap, du Yahoo, etc + du Geoportail. Mais la gestion des projections d'OL 2.8 ne fonctionne pas bien pour l'IGN (vu que les lonlat sont en pixel IGNF:GEOPRTAILFXX)... Bref un peu (pas mal ?) de boulot pour s'en sortir correctement.
    Si j'ai tout bien compris à votre précédente réponse l'API minimal devrait me permettre de bénéficier de la bonne gestion des projection fait par l'IGN ?

    NB, là y'a pas la gestion des logos officiel mais bon c'était juste un test
    Oui, normalement, les surcharges de l'API minimale sont là pour cela. Entre autres, les surcharges des modules getURL() et getFullRequestString() devraient t'aider ... A vérifier néanmoins

    Sur la philosophie générale, on a considéré que :


    • une carte OL est composée de baseLayers gérant chacune une projection sur une emprise : OpenLayers.Map.getProjection() doit donc retourner cette projection -- cette méthode surcharge getProjectionObject() d'OL ;
    • une couche OL est dans une projection native (celle du service qui la pousse) : getNativeProjection() retourne cette projection et est utilisé lors des getURL/getFullRequestString(). Cela permet de d'avoir une projection native en équidistant cylindrique (un cache Géoportail au hasard), mais d'afficher dans la carte en projection plate-carré (géographique, via une astuce des butineurs).

    Il va de soi que pour les données vectorielles, on reprojette entre layer.getNativeProjection() et map.getProjection() ...

    Quoiqu'il en soit, j'attend avec impatience tes retours pour améliorer notre API

  7. #7
    Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 94
    Points : 55
    Points
    55
    Par défaut
    Petit test avec l'API "mini" ..... => "It works like a charme"

    Enfin presque y'a juste le bounds qui ne suis pas lorsque qu'on change de baseLayer et que la projection n'est plus la même... Mais bon pour le coup ça devrait pas être trop balèze.
    Je vais continuer mes test en fin de semaine pour voir le suivit des vector mais bon... Grâce à votre aide j'ai pu récupérer une parties de mes neurones ;-) Merci

  8. #8
    Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 94
    Points : 55
    Points
    55
    Par défaut
    Du coup 2/3 nouvelles questions :

    1. Pour le coup de la zone affichée qui ne suit pas lorsqu'on change de fond de carte (avec changement du système de projection) je compte intervenir au niveau du changement du base layer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    1. Si pOri != pDest
    1. Sauvegarde de la zone affichée actuellement et de la projection actuelle
    2. changement de la base layer
    3. demande d'affichage "au mieu" de la zone (en ayant effectuer la conversion pORI -> pDest)
    Ce serait peut-être bon que ce soit en natif de l'API non ?

    2. la gestion des logos "Geoportail" "IGN" & partenaire ne semble pas être automatique. Il serait bon que ça le soit par défaut non ?

    3. on est toujours limité à 800x600 avec ce type d'accès ?

    Encore merci

  9. #9
    Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 94
    Points : 55
    Points
    55
    Par défaut
    Au cas ou voici le p'tit bout de code que j'utilise pour bien gérer la transition entre 2 baseLayer n'ayant pas la même projection :
    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
    setBaseLayer: function(newBaseLayer) {
      (...)
      if (newBaseLayer != this.baseLayer) {
        if (OpenLayers.Util.indexOf(this.layers, newBaseLayer) != -1) {
          (...)
          if (oldProjection && oldProjection.getCode() != this.getProjection().getCode()) {
            oldExtent.transform(oldProjection, this.baseLayer.projection);
            this.zoomToExtent(oldExtent);
          }
          else {
            var center = this.getCenter();
            (...)
          }
        (...)
      }
      (...)
    }
    Intuitivement plutôt que la comparaison des code de projection je pensais utiliser le "isCompatibleWith" mais bon p(ESPG:4326).isCompatibleWith(IGNF:GEOPORTALFXX) => true
    J'ai encore du louper un métro

    Mais bon ça fonctionne
    Au détail près du pb de logo => sujet clôt pour moi.

  10. #10
    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 shama Voir le message
    1. Pour le coup de la zone affichée qui ne suit pas lorsqu'on change de fond de carte (avec changement du système de projection) je compte intervenir au niveau du changement du base layer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    1. Si pOri != pDest
    1. Sauvegarde de la zone affichée actuellement et de la projection actuelle
    2. changement de la base layer
    3. demande d'affichage "au mieu" de la zone (en ayant effectuer la conversion pORI -> pDest)
    Ce serait peut-être bon que ce soit en natif de l'API non ?
    1. Ok, mais attention aux projections « compatibles » ... Mais, cela ne devrait pas être ton cas !
    1. Pas vraiment nécessaire ... Cf. 2.
    2. Si besoin, as-tu regardé le code de changeBaseLayer() de l'API (Geoportal.Map) et de la surcharge de moveTo() (OpenLayersOverloadStandard.js) : le postulat OL est que :

    • chaque couche à une emprise (si c'est pas le cas, c'est celle de la carte --copie effectuée lors de l'ajout de la couche dans la carte)--. De plus, cette emprise est exprimée dans la projection de la carte (baseLayer courante). Changement de baseLayer => reprojection de l'emprise de la couche SSI cette couche est compatible avec la baseLayer

    3. setBaseLayer() fait la reprojection du centre de l'ancienne baseLayer dans la nouvelle (autant en profiter) -- mais, c'est vrai que la procédure peut être surchargée (on l'a fait d'ailleurs);

    De mon point de vue, c'est natif dans l'API

    Citation Envoyé par shama Voir le message
    2. la gestion des logos "Geoportail" "IGN" & partenaire ne semble pas être automatique. Il serait bon que ça le soit par défaut non ?
    Logo Géoportail = Geoportal.Control.PermanentLogo, à ajouter à sa carte (CGU de l'API);
    Logo IGN = Geoportal.Control.Copyright, les CGU n'impose qu'une chose : écrire les propriétaires des couches ...
    Logo Partenaires = Geoportal.Control.Logo, OpenLayers.Control.Attribution pourrait être utilisé ou tout autre mention légale !

    Tout cela pour expliquer que l'utilisation de ces contrôles n'est pas obligatoire, ce sont les CGUs qui imposent et l'API propose

    Citation Envoyé par shama Voir le message
    3. on est toujours limité à 800x600 avec ce type d'accès ?
    Plus depuis longtemps : la taille de la carte n'est plus (comme au tout début du lancement) une contrainte (cf. CGU).

  11. #11
    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 shama Voir le message
    Au cas ou voici le p'tit bout de code que j'utilise pour bien gérer la transition entre 2 baseLayer n'ayant pas la même projection :
    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
    setBaseLayer: function(newBaseLayer) {
      (...)
      if (newBaseLayer != this.baseLayer) {
        if (OpenLayers.Util.indexOf(this.layers, newBaseLayer) != -1) {
          (...)
          if (oldProjection && oldProjection.getCode() != this.getProjection().getCode()) {
            oldExtent.transform(oldProjection, this.baseLayer.projection);
            this.zoomToExtent(oldExtent);
          }
          else {
            var center = this.getCenter();
            (...)
          }
        (...)
      }
      (...)
    }
    Intuitivement plutôt que la comparaison des code de projection je pensais utiliser le "isCompatibleWith" mais bon p(ESPG:4326).isCompatibleWith(IGNF:GEOPORTALFXX) => true
    En fait, j'utiliserai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    (...)
    if (oldProjection && !this.getProjection().equals(oldProjection)) {
      (...)
    }
    (...)
    equals() est surchargée par l'API pour tester :
    - l'égalité des codes;
    - l'égalité via des alias (e.g. EPSG:2154==IGNF:LAMB93);

    Nous avons uniquement aliasé les codes qui nous intéressaient ...

    isCompatibleWith() est vrai si equals() est vrai ou les projections sont «compatibles» (eqc et longlat pour l'instant) ET que les paramètres de changement de géoïdes sont égaux (ellipsoïde et paramètres de bursa-wolf) La compatibilité des projections étant définie par le fait que le rapport des coordonnées de l'une sont une constante.

    Rappel: on peut afficher une couche du Géoportail en 'EPSG:4326' (ou équivalent), il faut pour cela indiquer :
    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
    nativeProjection: 'IGNF:GEOPORTALFXX',
    nativeResolutions : [0.026726773770953713,
                               0.013363386885476856,
                               0.006681693442738428,
                               0.003340846721369214,
                               0.001670423360684607,
                               0.0008352116803423035,
                               0.00041760584017115176,
                               0.00020880292008557588,
                               0.00010440146004278794,
                               0.00005220073002139397,
                               0.000026100365010696985,
                               0.000013050182505348493,
                               0.000006525091252674246,
                               0.000003262545626337123,
                               0.0000016312728131685616,
                               0.0000008156364065842808]
    L'API fait tout cela nativement ...

    Il est donc tout à fait possible d'avoir une Geoportal.Map en géographique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    geoportalLoadviewer("viewerDiv","normal","FXX","IGNF:RGF93G");
    viewer.addGeoportalLayers();
    sur laquelle n'importe quelle couche 'EPSG:4326' (compatible avec 'IGNF:RGF93G') se superpose

  12. #12
    Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 94
    Points : 55
    Points
    55
    Par défaut
    Citation Envoyé par dgrichard Voir le message
    En fait, j'utiliserai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    (...)
    if (oldProjection && !this.getProjection().equals(oldProjection)) {
      (...)
    }
    (...)
    equals() est surchargée par l'API pour tester :
    - l'égalité des codes;
    - l'égalité via des alias (e.g. EPSG:2154==IGNF:LAMB93);
    (...)
    Merci pour les explications. (A noter qu'il faut aussi detecter la présence de "oldExtent" dans cette condition)

    Citation Envoyé par dgrichard
    Rappel: on peut afficher une couche du Géoportail en 'EPSG:4326' (ou équivalent), il faut pour cela indiquer :
    N'étant pas initialement porté sur la carto, je pensais qu'un changement de projection déplacerai ou modifierai les tiles originaux avec un effet de bords perceptible sur l'image... Bon en même temps j'ai pas besoin de superposition.

    En revanche, une explication pour afficher les "originators" liés au couches IGN ne serait pas superflue (ici même mais aussi sur la doc).
    Pas de réponse non plus sur la taille maximale de la carte en accès WMSC ? (je vois déjà les doléance utilisateur... m'ouais quand je suis sur GMaps ou OSM c'est nikel je vois tout mon tracé d'un coup mais sur l'IGN... )

    Toujours sur les accès WMSC en mini si on pouvait avoir une classe "Layer" dédié au géoportail avec récupération d'une (ou plusieurs) couche en indiquant uniquement le territoire + le type se serait cool. (on ne veux pas nécessairement les ajouter directement dans la carte, un accès type google, yahoo serait un plus)

  13. #13
    Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 94
    Points : 55
    Points
    55
    Par défaut
    LE boulet avec l'accès directe sur le dernier post, j'avais loupé celui-là
    Toutes mes excuses...

    Citation Envoyé par dgrichard Voir le message
    1. Ok, mais attention aux projections « compatibles » ... Mais, cela ne devrait pas être ton cas !
    De mon point de vue, c'est natif dans l'API
    (...) oui mais la on retombe sur l'api standard avec l'objet Geoportal.Map qui pose les pb initiaux (de la discussion). En revanche j'avais bien noter le code setBaseLayer.

    Si l'api mini permet de mieux gérer les projection sur les calques ça a quand même qq incidence sur l'objet Map, et donc c'est juste bizarre que l'overload de certaine fonction Map ne soit présent que pour l'api standard alors que les layers en bénéficies (surtout en utilisant le Geoportal.Layer.WMSC)

    Citation Envoyé par dgrichard
    Logo Géoportail = Geoportal.Control.PermanentLogo, à ajouter à sa carte (CGU de l'API);
    Logo IGN = Geoportal.Control.Copyright, les CGU n'impose qu'une chose : écrire les propriétaires des couches ...
    Logo Partenaires = Geoportal.Control.Logo, OpenLayers.Control.Attribution pourrait être utilisé ou tout autre mention légale !
    merci

    Plus depuis longtemps : la taille de la carte n'est plus (comme au tout début du lancement) une contrainte (cf. CGU).
    SUPER

  14. #14
    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 shama Voir le message
    N'étant pas initialement porté sur la carto, je pensais qu'un changement de projection déplacerai ou modifierai les tiles originaux avec un effet de bords perceptible sur l'image... Bon en même temps j'ai pas besoin de superposition.
    En fait, on utilise un artifice des butineurs, une image W*H peut s'afficher en W'*H', W' et H' étant calculés par un coefficient constant. Dans notre cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    W'= Kw*W, Kw= cos(latitude_origine)
    H'= H
    Localement, cela suffit pour superposer

    Citation Envoyé par shama Voir le message
    En revanche, une explication pour afficher les "originators" liés au couches IGN ne serait pas superflue (ici même mais aussi sur la doc).
    Je vais rajouter cela à la documentation ...

    originators est un tableau d'objets qui contient trois éléments logo, pictureUrl et url. Chaque objet représente le détenteur des droits sur la couche qui porte la propriété originators (il peut donc avoir plusieurs détenteurs):

    • logo est un identifiant qui nous permet d'aller chercher le fichier sur le Géoportail via la construction suivante : 'http://www.geoportail.fr/legendes/logo_<logo>.gif' si pictureUrl n'est pas fourni;
    • pictureUrl est l'url du fichier à aller chercher. Il est prioritaire sur logo;
    • url est l'url de la page web lorsque l'on clique sur le logo affiché. Si url commence par javascript:, alors l'url final est '#' et un attribut onclick contenant url est ajouté.


    Citation Envoyé par shama Voir le message
    Toujours sur les accès WMSC en mini si on pouvait avoir une classe "Layer" dédié au géoportail avec récupération d'une (ou plusieurs) couche en indiquant uniquement le territoire + le type se serait cool. (on ne veux pas nécessairement les ajouter directement dans la carte, un accès type google, yahoo serait un plus)
    Me trompe-je en interprêtant cette demande comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var ortho= new OpenLayers.Layer.GeoportailFr('ORTHOIMAGERY.ORTHOPHOTOS',{territory:'FXX',(...)});
    Grosso modo, c'est ce que fait le couple Geoportal.Viewer et Geoportal.Catalogue en plus «complexe» :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var catalogue= new Geoportal.Catalogue(map,{apiKey:(...)});
    var params= catalogue.getLayerParameters('FXX', 'ORTHOIMAGERY.ORTHOPHOTOS');
    var layer= new params.className(params.options.name, params.url,params.params, params.options);
    map.addLayer(layer);

  15. #15
    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 shama Voir le message
    (...) oui mais la on retombe sur l'api standard avec l'objet Geoportal.Map qui pose les pb initiaux (de la discussion). En revanche j'avais bien noter le code setBaseLayer.
    C'est vrai, mais (de nouveau), je suis ouvert à toute proposition (contribution)

    Citation Envoyé par shama Voir le message
    Si l'api mini permet de mieux gérer les projection sur les calques ça a quand même qq incidence sur l'objet Map, et donc c'est juste bizarre que l'overload de certaine fonction Map ne soit présent que pour l'api standard alors que les layers en bénéficies (surtout en utilisant le Geoportal.Layer.WMSC)
    Peux-tu préciser quelles surcharges de l'API standard pourraient être dans l'API minimum?

    Ma ventilation s'est faîte sur le niveau d'intrusion de surcharge OpenLayers: normalement, l'API minimale ne "change" pas les comportements OpenLayers, quant l'API standard/étendu surcharge certains d'entre eux (OpenLayers.Map.moveTo() pour gérer les changements de baseLayers sur des critères d'emprises/projections, OpenLayers.Layers.calculateInRange() qui gère l'emprise des couches dans le viewport pour décider si elle est activable ou pas, etc ...).

  16. #16
    Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 94
    Points : 55
    Points
    55
    Par défaut
    (...)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var catalogue= new Geoportal.Catalogue(map,{apiKey:(...)});
    var params= catalogue.getLayerParameters('FXX', 'ORTHOIMAGERY.ORTHOPHOTOS');
    var layer= new params.className(params.options.name, params.url,params.params, params.options);
    map.addLayer(layer);
    Exactement ça !!! En fait pour la personne qui vient d'OpenLayer il a une méthode assez proche des autres pour intégrer les couches Geoportail

  17. #17
    Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 94
    Points : 55
    Points
    55
    Par défaut
    Citation Envoyé par dgrichard Voir le message
    Peux-tu préciser quelles surcharges de l'API standard pourraient être dans l'API minimum?
    Globalement j'ai cru comprendre qu'OL savait utiliser les projections par proj4js mais (et la encore je peux être passé à côté d'un truc énorme que je n'ai pas vu) ne les gères pas convenablement si on en utilises plusieurs en même temps (pb de setBaseLayer, moveTo, setCenterAtLonLat, etc).
    Bref pour moi (et encore une fois avec toutes les réserves du au fait que je sois ni cartographe ni rentrer profondément dans OL) tout le boulot fait par l'IGN pour gérer les projections devrait être natif à OL.
    Pour répondre plus directement à la question, je vous fait un retour une fois que j'ai eu le temps de m'occuper des couches vectorielles (car je suppute que ce n'est pas auto non plus (chez OL j'entends). Bref pas avant un petit moment mais je tâcherai de ne pas oublier.

    réflexion perso
    Honnêtement pour une personne très externe à tout ça je suis assez étonné que tous les points de bases, les bounds, les distances, etc ne soit pas directement liés à une projection. C'est un pb connu et bateau de l'architecture objet pour ne perdre ni la nature de la saisie, ni la précision.. Mais bon j'imagine qu'il y a des raisons historiques

    Ma ventilation s'est faîte sur le niveau d'intrusion de surcharge OpenLayers: normalement, l'API minimale ne "change" pas les comportements OpenLayers, quant l'API standard/étendu surcharge certains d'entre eux (OpenLayers.Map.moveTo() pour gérer les changements de baseLayers sur des critères d'emprises/projections, OpenLayers.Layers.calculateInRange() qui gère l'emprise des couches dans le viewport pour décider si elle est activable ou pas, etc ...).
    L' "incohérence" que je souhaitai vous signalé c'est que les couches basées sur Geoportail.Layer.WMSC utilise les projections et son dispo dans l'api mini mais que l'objet Map ne sait pas les traiter correctement. Donc certaine surcharge de l'API sandard/étendue serait bienvenues pour avoir un comportement "normal" (mais bon cf plus haut). Ce que j'ai un peu de mal à comprendre c'est pourquoi ce genre de chose sont côté IGN et pas côté OL...

  18. #18
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 35
    Points : 29
    Points
    29
    Par défaut
    Bonjour,

    Je suis plus ou moins dans la même situation que Shama actuellement, j'essaye d'afficher les couches fournies par l'API directement via OpenLayers (pour une petite démo utilisant GeoExt).

    Je charge sur ma page :

    J'ai essayé deux des méthodes vues dans ce topic, sans succès :
    1.
    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
    var ignLayer = new OpenLayers.Layer.WMS(
              "IGN France", 
              "http://wxs.ign.fr/geoportail/wmsc", 
              {
                layers: 'GEOGRAPHICALGRIDSYSTEMS.MAPS',
                exceptions: 'text/xml',
                tiled: true
              },
              {
                isBaseLayer: true,
                projection: new OpenLayers.Projection('IGNF:GEOPORTALFXX'),
                resolutions: [2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048],
                maxExtent: new OpenLayers.Bounds(-1181626.0, 3815715.0, 2340591.0, 7071932.0),
                GeoRM: Geoportal.GeoRMHandler.addKey(
                  gGEOPORTALRIGHTSMANAGEMENT.apiKey,
                  gGEOPORTALRIGHTSMANAGEMENT[gGEOPORTALRIGHTSMANAGEMENT.apiKey].tokenServer.url,
                  gGEOPORTALRIGHTSMANAGEMENT[gGEOPORTALRIGHTSMANAGEMENT.apiKey].tokenServer.ttl,
                  map)
           });
    map.addLayer(ignLayer);
    Ce qui me donne : this.center is null dans OpenLayers.js Line 831 (dans un appel à "OpenLayers.Map.setCenter()")

    2.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var catalogue= new Geoportal.Catalogue(map,{apiKey:(...)});
    var params= catalogue.getLayerParameters('FXX', 'ORTHOIMAGERY.ORTHOPHOTOS');
    var layer= new params.className(params.options.name, params.url,params.params, params.options);
    map.addLayer(layer);
    Et dans ce cas ça plante rapidement car params est null. J'ai testé avec "GEOGRAPHICALGRIDSYSTEMS.MAPS" en paramètre et en rajoutant ":WMSC" à la fin du nom du layer mais ça ne change rien.

    Des idées ?

    Citation Envoyé par dgrichard Voir le message
    Me trompe-je en interprêtant cette demande comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var ortho= new OpenLayers.Layer.GeoportailFr('ORTHOIMAGERY.ORTHOPHOTOS',{territory:'FXX',(...)});
    C'est vrai que ce serait pas mal ça.

  19. #19
    Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 94
    Points : 55
    Points
    55
    Par défaut
    Le test rapide effectué en début de semaine est par là si ça peut aider... :
    http://shamavideals.l-wa.org/oltest/...oviderMap.html

    Mais bon j'ai déjà un peu plus avancé depuis Mais y reste du taf pour les Vector.

  20. #20
    Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 94
    Points : 55
    Points
    55
    Par défaut
    Citation Envoyé par gfilliere
    Ce qui me donne : this.center is null dans OpenLayers.js Line 831 (dans un appel à "OpenLayers.Map.setCenter()")
    Pour ne pas avoir le pb de this.center tu es obliger d'initialiser ta carte avec le maxExtent, les résolution et la projection de ta layer IGN (bref a passer directement dans les options de la carte, mais bon pas cool car si changement de layer avec autre projection ...)
    L'utilisation de Geoportal.Layer.WMSC est aussi a prendre en compte..
    Par défaut, je charge un carte du qui contient le pt (0, 0) et ensuite je mise sur l'utilisation des réso/proj/extend des basesLayers. L'IGN a semble-t'il fait le choix de reconfigurer la carte sur le changement de baseLayer (et avec un baseLayer masqué), perso je compte tenter ma chance en laissant la carte retourné les paramètre du baseLayer courant.

    (...)
    Et dans ce cas ça plante rapidement car params est null. J'ai testé avec "GEOGRAPHICALGRIDSYSTEMS.MAPS" en paramètre et en rajoutant ":WMSC" à la fin du nom du layer mais ça ne change rien.
    Pas encore pu tester ça.

Discussions similaires

  1. [VB6] Exécuter un programme en tant que...
    Par Le_Tolier dans le forum VB 6 et antérieur
    Réponses: 36
    Dernier message: 28/05/2004, 15h53
  2. Postmaster en tant que service NT
    Par krimson dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 16/04/2004, 10h08
  3. Licence MySql en tant que BD dans une application web
    Par Volta dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 26/02/2004, 15h38
  4. [] [Winsock] Pb si je me déconnecte en tant que client
    Par vbcasimir dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 29/04/2003, 19h42
  5. [DROIT] Droits d'auteurs moraux en tant que salariés ?
    Par malotte dans le forum Juridique
    Réponses: 14
    Dernier message: 13/02/2003, 16h56

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