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 :

Strategy + protocol + Format


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 Strategy + protocol + Format
    Quelques conseils me seraient utiles pour débloquer la situation suivante :

    Je crée une couche vecteur qui intègre une "strategy" d'affichage, avec un "protocol" de service sur un format spécifique ce qui me donne la structure suivante de maCouche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    var maCouche = new OpenLayers.Layer.Vector("Essai", { 
                  strategies: [
                            new OpenLayers.Strategy.Fixed(),
                            new OpenLayers.Strategy.Cluster()
                        ],
                 protocol: new OpenLayers.Protocol.Script({
                            url: "https://xxxxxxx/services/rest",
                            params: {...
    per_page:100,
    page:3,
    ..},
                    format: new OpenLayers.Format.yyyy()
    });
    Mon problème c'est que le service en question est limité à l'envoi de 100 données par page. Et il y a N fois 100 données!
    Comment dois-je donc opérer pour boucler sur les N pages et pour intégrer toutes ces données dans maCouche afin de garder l'avantage de ma strategy ?

    J'espère que ma question est claire?

  2. #2
    Membre chevronné Avatar de gcebelieu
    Homme Profil pro
    Ingénieur Géographe et Cartographe
    Inscrit en
    Novembre 2010
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Géographe et Cartographe
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2010
    Messages : 1 106
    Points : 1 843
    Points
    1 843
    Par défaut
    Ta question est claire. Par contre, l'accès à ton service est mystérieux pour moi : normalement, il faudrait que tu gères la pagination des réponses de ton service au niveau des requêtes que ton application envoie. Mais, ne connaissant pas ce fameux service, je ne peux pas t'en dire plus.

  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
    Je ne suis pas entré dans les détails, car je pensais que ma question était général (que la limitation des données transmise était courante) et j'attendais donc plutôt une réponse sur les principes.

    Sinon, après avoir creusé la récupération de photos sur panoramio et leur positionnement sur une couche (déjà évoqué sur ce forum), j'essaye maintenant de réaliser une chose similaire avec flickr.
    Je suis parti de l'exemple http://openlayers.org/dev/examples/s...y-cluster.html
    Dans les détails, le protocol utilisé s'écrit maintenant de la sorte:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      protocol: new OpenLayers.Protocol.Script({                        url: "https://api.flickr.com/services/rest",
                            params: {
                            api_key: 'xxxx1c51b41f10ded499d38a',
                                format: 'json',
                                method: 'flickr.photos.search',
    page: N,
    per_page: 500,......
    etc.}
    Les détails des paramètres de l'api de recherche sont ici: https://www.flickr.com/services/api/...tos.search.htm

    J'arrive bien à récupérer et à traiter une page N de 500 photos, mais je n'arrive pas à récupérer et à intégrer (les deux actions à la fois) toutes les photos de la collection (soit X pages de 500) sur la même couche vecteur.

    Bien sûr, je peux les récuperer page après page, mais dans X couches vecteur ce qui complique un peu les traitements postérieurs...

  4. #4
    Membre régulier
    Homme Profil pro
    Webmaster
    Inscrit en
    Mai 2014
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mai 2014
    Messages : 133
    Points : 117
    Points
    117
    Par défaut
    Bonsoir,

    La limitation du nombre de résultats et la pagination des réponses sont courantes pour les APIS. Il faut donc chercher du coté de l'utilisation de ces APIS (Ebay developer, Amazon, Google ...) et des solutions trouvées par les développeurs pour reconstruire les données ou les utiliser sans outrepasser les règles d'utilisation.

    Il peut y avoir également une limitation du nombre de requêtes sur une durée.

    Cordialement,

    Eric

    PS : http://openlayers.org/dev/examples/s...y-cluster.html - Cet exemple ne fonctionne pas (erreur 403) - essayer avec ta clef API ?

  5. #5
    Membre chevronné Avatar de gcebelieu
    Homme Profil pro
    Ingénieur Géographe et Cartographe
    Inscrit en
    Novembre 2010
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Géographe et Cartographe
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2010
    Messages : 1 106
    Points : 1 843
    Points
    1 843
    Par défaut
    Bonjour Christian,

    Citation Envoyé par cmail Voir le message
    Je ne suis pas entré dans les détails, car je pensais que ma question était général (que la limitation des données transmise était courante) et j'attendais donc plutôt une réponse sur les principes.
    sur les principes, je maintiens ce que je t'ai dit :

    il faudrait que tu gères la pagination des réponses de ton service au niveau des requêtes que ton application envoie
    Dans le détail, lorsque tu crées ton objet OpenLayers.Protocol.Script, tu peux surcharger des méthodes en paramètres :

    * "createRequest(url, params, callback)" : pour générer la requête qui sera envoyée au service ;
    * "callback(resp)" : pour traiter les résultats du service.

    L'idée serait que tu écrives quelque chose du genre (sans garantie de fonctionnement du premier coup ) :

    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
    protocol: new OpenLayers.Protocol.Script({                        
                            url: "https://api.flickr.com/services/rest",
                            params: {
                                api_key: 'xxxx1c51b41f10ded499d38a',
                                format: 'json',
                                method: 'flickr.photos.search',
                                per_page: 500,
                                ... // NB : j'ai enleve le parametre "page" : on va le calculer dynamiquement
                            },
                     createRequest: function(url, params, callback) {
                        var id = OpenLayers.Protocol.Script.register(callback);
                        var name = "OpenLayers.Protocol.Script.registry.regId" + id;
                        params = OpenLayers.Util.extend({}, params);
                        params[this.callbackKey] = this.callbackPrefix + name;
                        var paramsArray= [];
                        for (var key in params) {
                            var value = params[key];
                            paramsArray.push(encodeURIComponent(key) + "=" + value);
                        }
                        // Ajout du paramètre de pagination
                        if (this.page) paramsArray.push("page="+this.page) ;
                        params= paramsArray.join('&');
                        url = OpenLayers.Util.urlAppend(
                            url, params
                        );
                        var script = document.createElement("script");
                        script.type = "text/javascript";
                        script.src = url;
                        script.id = "OpenLayers_Protocol_Script_" + id;
                        this.pendingRequests[script.id] = script;
                        var head = document.getElementsByTagName("head")[0];
                        head.appendChild(script);
                        return script;
                    },
                    callback:function(r)  {
                       if (r.code===OpenLayers.Protocol.Response.SUCCESS) {
                           // ici tu parses la réponse (à l'aide d'un OpenLayers.Format.Flickr), tu créées tes features que tu rajoutes à la couche 
                           // et tu récupères le nombre de résultats dans une variable nbResults
                           ...
                           var nbResults= ...
                           // y-a-t-il besoin de faire une nouvelle requete ?
                           if (!this.page) this.page=1 ;
                           if (this.page*500<nbResults) {
                              this.page++ ;
                              this.createRequest(this.url,this.params,this.callback) ; // on refait la requête après avoir augmenté le numéro de page
                           }
                       }
                    }

  6. #6
    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
    il faudrait que tu gères la pagination des réponses de ton service au niveau des requêtes que ton application envoie
    On est bien d'accord! Seulement, je manque d'expérience pour y arriver...
    Ceci dit tes nouvelles propositions m'ouvrent de nouvelles réflexions que je vais tester...

    Sinon, j'arrive à des résultats en supprimant OpenLayers.Protocol.Script() préconisé par l'exemple d'OL cité ci-dessus mais en attaquant flickR par une boucle de N $getJSON adéquat puis en "mergeant" (cela se dit???) les résultats. Après ce tritouillage je mets les différentes valeurs du tableau obtenu dans ma couche layer... Mais bon, ce n'est pas très esthétique en terme de codage et cela me sort de l'approche OpenLayers.Protocol.Script() que je n'arrive pas à maitriser....

  7. #7
    Membre régulier
    Homme Profil pro
    Webmaster
    Inscrit en
    Mai 2014
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mai 2014
    Messages : 133
    Points : 117
    Points
    117
    Par défaut
    Bonjour,

    le nombre de page sur une recherche sera de 8 maxi (avec 500 resultats par page):

    "Please note that Flickr will return at most the first 4,000 results for any given search query. If this is an issue, we recommend trying a more specific query."

    L'Api ne donne pas directement le nombre de page de résultats. Il faut donc tester pour l'obtenir : 8 requetes maxi, si une requete echoue (0 resultat), nombre de page = Nbre de requete - 1.

    Cordialement,

    Eric

  8. #8
    Membre chevronné Avatar de gcebelieu
    Homme Profil pro
    Ingénieur Géographe et Cartographe
    Inscrit en
    Novembre 2010
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Géographe et Cartographe
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2010
    Messages : 1 106
    Points : 1 843
    Points
    1 843
    Par défaut
    Citation Envoyé par cmail Voir le message
    Sinon, j'arrive à des résultats en supprimant OpenLayers.Protocol.Script() préconisé par l'exemple d'OL cité ci-dessus mais en attaquant flickR par une boucle de N $getJSON adéquat puis en "mergeant" (cela se dit???) les résultats. Après ce tritouillage je mets les différentes valeurs du tableau obtenu dans ma couche layer... Mais bon, ce n'est pas très esthétique en terme de codage et cela me sort de l'approche OpenLayers.Protocol.Script() que je n'arrive pas à maitriser....
    L'intérêt d'utiliser OpenLayers.Protocol.Script est de s'abstraire des problèmes de cross-domain. Si on ne passe par cette méthode, il y a de fortes chances qu'on doive utiliser par un proxy.
    Après, il faut savoir rester pragmatique...

  9. #9
    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
    Please note that Flickr will return at most the first 4,000 results for any given search query. If this is an issue, we recommend trying a more specific query."
    J'avais lu cela, mais j'ai aussi constaté que certaines spécifications (param) avaient changées et que leurs pages référence ou conseil n'en tenaient pas compte....
    Par exemple, si le param has_geo est retenu le per_page est de 250 et non plus 500... Et cela n'est pas référencé... A ma connaissance et sauf erreur de ma part...

    le nombre de page sur une recherche sera de 8 maxi
    Certes, mais comme actuellement j'attaque avec des requêtes JSON de ma composition, je ne suis pas limité en nombre de page...
    J'ai fait un essai pour voir et j'ai affiché 12000 photos géotaggé sans problème particulier...

    Par contre, si j'arrive à mettre en pratique les conseils de Gilles portant sur OpenLayers.Protocol.Script() et me rapprocher d'une utilisation normale de REST, je risque d'être limité... Mais pour l'instant je n'en suis pas là!

    Oups! ma réponse à Eric était en attente et envoyée alors que je n'avais pas pris connaissance de la dernière réponse de Gilles... Et je n'ai pas l'impression d'utiliser un proxy????? En tout cas c'est bien involontaire et surtout je ne le déclare pas dans mon viewer... A méditer....

  10. #10
    Membre chevronné Avatar de gcebelieu
    Homme Profil pro
    Ingénieur Géographe et Cartographe
    Inscrit en
    Novembre 2010
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Géographe et Cartographe
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2010
    Messages : 1 106
    Points : 1 843
    Points
    1 843
    Par défaut
    En fait, je ne sais pas ce qu'il y a derrière tes $getJSON ?

    L'utilisation du proxy est nécessaire lorsqu'on fait des requêtes Ajax vers une URL située sur un autre serveur que celui où se situe la page.

    Le protocole utilisé par OpenLayers.Protocol.Script permet d'émettre des requêtes sans utiliser Ajax.

    Si tu n'utilises pas non plus Ajax, le proxy n'a pas lieu d'être.

  11. #11
    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
    Je bidouille sans vraiment savoir ce que je fais au fond des choses !
    J'utilise http://api.jquery.com/jQuery.getJSON/ et donc en lisant cette page j'utiliserais donc des requêtes ajax...
    Avec des url de type https://api.flickr.com/services/rest?api_key=xxxx.... tirés des pages référence de flickr ...

    Bon, peut-être que ce n'est pas ajax? Ou peut-être que j'ai un proxy caché bienveillant ?
    Je ne sais pas?

  12. #12
    Membre chevronné Avatar de gcebelieu
    Homme Profil pro
    Ingénieur Géographe et Cartographe
    Inscrit en
    Novembre 2010
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Géographe et Cartographe
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2010
    Messages : 1 106
    Points : 1 843
    Points
    1 843
    Par défaut
    Christian,

    la page que tu cites aborde ces sujets :

    As of jQuery 1.5, the success callback function receives a "jqXHR" object (in jQuery 1.4, it received the XMLHttpRequest object). However, since JSONP and cross-domain GET requests do not use XHR, in those cases the jqXHR and textStatus parameters passed to the success callback are undefined.

    Important: As of jQuery 1.4, if the JSON file contains a syntax error, the request will usually fail silently. Avoid frequent hand-editing of JSON data for this reason. JSON is a data-interchange format with syntax rules that are stricter than those of JavaScript's object literal notation. For example, all strings represented in JSON, whether they are properties or values, must be enclosed in double-quotes. For details on the JSON format, see http://json.org/.

    JSONP

    If the URL includes the string "callback=?" (or similar, as defined by the server-side API), the request is treated as JSONP instead. See the discussion of the jsonp data type in $.ajax() for more details.
    et plus loin :

    Additional Notes:

    Due to browser security restrictions, most "Ajax" requests are subject to the same origin policy; the request can not successfully retrieve data from a different domain, subdomain, port, or protocol.
    Script and JSONP requests are not subject to the same origin policy restrictions.

    Sans doute, fais tu tes $getJSON en JSONP et du coup, tu n'as pas besoin de proxy... Quelle est la syntaxe de ta requête $getJSON ?

  13. #13
    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
    Je suis un peu trop débordé entre tes propositions de callback sur OpenLayers.Protocol.Script (que je n'arrive pas à rendre opérationnel mais je me documente et bidouille...), l’approfondissement de ce que je peux faire avec mes $getJSON et les dessous du protocol rest, et maintenant jsonP (que je n'ai pas l'impression d'utiliser )...

    Quelle est la syntaxe de ta requête $getJSON ?
    Un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $.getJSON("https://api.flickr.com/services/rest?api_key=xxxxx&format=json&method=flickr.photos.search&media=photos&extras=geo%2C%20&per_page=501&page=3", function (data) {....}
    NB Quelques instants plus tard après un détour sur flickR...
    FlickR autorise 4 formats (XML, JSONP, JSON et PHP) qui sont introduit dans la requête sous "format=xxx". Or je m'aperçois que soit pour JSONP soit pour JSON, l'intitulé du paramétrage est identique et s'écrit: "format=json"...
    Je fais peut-être du jsonP sans le savoir, comme l'autre de la prose....

  14. #14
    Membre chevronné Avatar de gcebelieu
    Homme Profil pro
    Ingénieur Géographe et Cartographe
    Inscrit en
    Novembre 2010
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Géographe et Cartographe
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2010
    Messages : 1 106
    Points : 1 843
    Points
    1 843
    Par défaut
    Citation Envoyé par cmail Voir le message
    Je fais peut-être du jsonP sans le savoir, comme l'autre de la prose....
    j'allais le dire

Discussions similaires

  1. Quelle est la fiabilité du protocole SSL ?
    Par Anonymous dans le forum Développement
    Réponses: 5
    Dernier message: 05/09/2002, 13h31
  2. Réponses: 2
    Dernier message: 31/08/2002, 21h37
  3. Format d'un exe pour DOS et pour Windows
    Par Alfhiger dans le forum Assembleur
    Réponses: 4
    Dernier message: 12/06/2002, 11h57
  4. lire une image au format RAW
    Par Anonymous dans le forum OpenGL
    Réponses: 5
    Dernier message: 20/05/2002, 00h11
  5. Réponses: 3
    Dernier message: 06/05/2002, 18h24

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