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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2009
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 94
    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
    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 confirmé
    Inscrit en
    Septembre 2009
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 94
    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 confirmé
    Inscrit en
    Septembre 2009
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 94
    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
    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

  6. #6
    Membre confirmé
    Inscrit en
    Septembre 2009
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 94
    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

  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
    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>

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, 14h53
  2. Postmaster en tant que service NT
    Par krimson dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 16/04/2004, 09h08
  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, 14h38
  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, 18h42
  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, 15h56

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