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 :

Isochrone OpenLayers Geoportail et IGN


Sujet :

IGN API Géoportail

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2020
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2020
    Messages : 16
    Points : 13
    Points
    13
    Par défaut Isochrone OpenLayers Geoportail et IGN
    Bonjour,

    Je travail sur OpenLayers avec les données de geoportail et font de carte IGN. Je voudrai utiliser la fonctionnalité isochrone d'OpenLayers masi j'arrive pas à comprendre comment ça fonctionne.

    J'ai une liste de coordonnées, par exemple* [C1, C2, C3....CN]. Je suppose C1 comme étant coordonnée principale, et donc calculer l'isochrone entre C1 et les autres coordonnées et renvoyer les coordonnées qui sont à 12km par exemple à pied ou voiture de C1.

    Quelqu'un aurait une piste à me proposer svp ?

    Vous remerciant d'avance pour votre aide

  2. #2
    Membre éclairé Avatar de elias couppe
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2014
    Messages
    407
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2014
    Messages : 407
    Points : 786
    Points
    786
    Par défaut
    Bonjour,

    pour rappel, notre service d'isochrone va calculer une géométrie qui correspondra à tous les points accessibles via les réseaux de déplacements à partir d'un point donné, pour un temps (isochrone) ou une distance (isodistance) donnée. La géométrie ne correspondra donc pas à un disque, car on ne prend pas les déplacements à "vol d'oiseau".

    Si j'ai bien compris, vous voulez, à partir d'une coordonnée connue [C1], déterminer tous les points de votre liste [C2, C3 ... CN] qui se trouve à l'intérieur de cette géométrie calculée. Pour votre exemple, tous les points qui se trouvent dans l'isodistance de 12km calculée à partir de C1.

    Deux solutions :

    1 - utiliser directement le widget geoportail d'isochrone pour openlayers. Dans ce cas, vous pouvez passer par le widget pour récupérer la géométrie calculée et faire vos calculs via une librairie géographique.

    --> page de présentation du wid : https://geoservices.ign.fr/documenta...--isodistances
    --> la documentation technique : http://ignf.github.io/geoportal-exte....Isocurve.html

    Vous remarquerez que la méthode getLayer du controle permet de récupérer la couche vectorielle contenant l'isochrone/distance.


    2 - utiliser notre bibliothèque d'accès, c'est à dire directement le service permettant de réaliser les calculs d'isochrone/distance, indépendemment du widget et d'OpenLayers.

    --> page de présentation du service : https://geoservices.ign.fr/documenta...tour-dun-point
    --> la documentation technique du service (paramètres en entrée) : http://ignf.github.io/geoportal-acce...html#~isoCurve

    La réponse du service ressemblera donc à un objet de ce type

    L'avantage de passer directement par le service est que les données en entrée et en sortie sont plus facilement manipulables. Vous pouvez très bien réaliser les calculs juste en passant par ce service, et afficher ce que vous voulez sur votre carte (les points dans l'isochrone, la géométrie de l'isochrone...) une fois ces calculs réalisés.

    Bonne fin de journée,

    Elias Couppé

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2020
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2020
    Messages : 16
    Points : 13
    Points
    13
    Par défaut
    Bonjour elias couppe,

    Tout d'abord je vous remercie pour votre aide.

    Si j'ai bien compris votre explication, pour la deuxième solution j'ai juste à passer les paramètres (point de référence = C1, limite de temps, ...) et le service se charge des calculs et me renvoyer toutes les coordonnées respectant la condition ? Après je fais une comparaison des coordonnées renvoyer par le service et celles se trouvant dans ma liste ?

    Je code sur angular 9, j'ai également un autre souci sur l'affichage de la carte. J'ai le zoom out et in en bas et hors de la carte. Je comprends pas pourquoi il m'affiche hors de la carte.
    Je vous met une capture d'écran de l'affichage.

    Bonne fin de journée

    Merci

    Nom : carte_ign.jpg
Affichages : 365
Taille : 335,1 Ko

  4. #4
    Membre éclairé Avatar de elias couppe
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2014
    Messages
    407
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2014
    Messages : 407
    Points : 786
    Points
    786
    Par défaut
    Le service va se charger de vous renvoyer un objet geojson. A votre charge ensuite de comparer les coordonnées de votre liste à la géométrie du GeoJson renvoyée : il existe avec de nombreuses bibliothèques des fonctions de type "geometry.includes()" afin de savoir si un point est "à l'intérieur" d'une géométrie donnée.

    Ce ne sont que des pistes, mais par exemple avec openlayers :
    - la fonction "readGeometry" de la classe GeoJson permet de renvoyer la geometrie d'un GeoJson sous forme d'objet "geometry" : https://openlayers.org/en/latest/api...N-GeoJSON.html
    - la fonction intersectsCoordinate(coordinate) de la classe Geometry permet de savoir si un point est contenu dans une "geometry" donnée: https://openlayers.org/en/latest/api...-Geometry.html

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2020
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2020
    Messages : 16
    Points : 13
    Points
    13
    Par défaut
    Bonjour,

    J'ai un souci avec le service isocurve. J'aimerai retourner les résultats du service pour l'utiliser dans une autre fonction. J'obtiens undefined à l'appel de ma fonction isochrone. Une piste stp ? ci-dessous mon code

    Vous remerciant d'avance pour votre aide

    Code JavaScript : 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
    isochrone(method, limit, type_graph, map, long, lat) {
     
        let data ;
        Gp.Services.isoCurve({
          apiKey: "jhyvi0fgmnuxvfv0zjzorvdn", // clef d'accès à la plateforme
          position: { // point de référence
            x: long,
            y: lat
          },
          method: method,                   // méthode de calcul (isochrone)
          time: (method == "time" ? limit : null),  // limite de temps (isochrone)
          distance: (method == "distance" ? limit : null),
          graph: type_graph,
          onSuccess: function(result) {
     
              data = result.geometry.coordinates;
          },
          onFailure: function(error) {
            console.log(error);
          }
        });
     
        return data
    }

  6. #6
    Membre éclairé Avatar de elias couppe
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2014
    Messages
    407
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2014
    Messages : 407
    Points : 786
    Points
    786
    Par défaut
    Bonjour,

    vous êtes ici dans un fonctionnement asynchrone, c'est à dire que la réponse à votre fonction isochrone n'est pas immédiate (le temps de faire appel au service et de renvoyer la réponse...).

    Du coup, votre variable data n'est pas connue au moment où vous la loggez, car le code continue de s’exécuter de manière linéaire, sans que la réponse n'ait été encore reçue. SI vous mettez console.log(data) dans le onSuccess, vous constaterez que la réponse du service est bien récupérée. Le contenu de "onSuccess" est ce qui est exécuté une fois la réponse du service reçu.

    Pour "contourner" ce problème, vous pouvez par exemple :
    - réaliser la suite de votre code dans le onSuccess.

    - passer par une "Promise", qui est un fonctionnement de JavaScript pour réaliser des appels asynchrones (voir https://www.promisejs.org/api/ ou https://developer.mozilla.org/fr/doc...lobaux/Promise par exemple).

    Avec votre exemple (j'ai enlevé le paramètre map qui ne m'était pas utile pour tester) cela pourrait donner quelque chose comme :

    Code Javascript : 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
     // fonction a appeler en cas de retour de la promesse en succes 
            function successCallback(result) {
                    // log du resultat
                    console.log(result);
            };
     
            // fonction a appeler en cas de retour de la promesse en cas d'echec
            function failureCallback() {
                    // log d'un message d'erreur
                    console.error("L'opération a échoué");
            };
     
            // fonction isochrone qui va renvoyer une promesse
            function isochrone(method, limit, type_graph, long, lat) {
                    return new Promise((successCallback, failureCallback) => {
                            let data ;
                            Gp.Services.isoCurve({
                                    apiKey: "xxxxxxxxxxxxxxxx", // clef d'accès à la plateforme
                                    position: { // point de référence
                                            x: long,
                                            y: lat
                                    },
                                    method: method, // méthode de calcul (isochrone)
                                    time: (method == "time" ? limit : null), // limite de temps (isochrone)
                                    distance: (method == "distance" ? limit : null),
                                    graph: type_graph,
                                    onSuccess: function(result) {
                                            successCallback(result);
                                    },
                                    onFailure: function(error) {
                                            failureCallback();
                                    }
                            });
                    })
     
            };
     
            // On crée la promesse isochrone
            const promise = isochrone("time", 200, "voiture", 2.35, 48.87);
     
            // Quand la promesse est resolue, on appelle le callback adequat
            promise.then(successCallback, failureCallback);

    PS : attention, il est recommandé de commander votre propre clé d'accès geoservices (voir ce sujet)

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2020
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2020
    Messages : 16
    Points : 13
    Points
    13
    Par défaut
    Re-bonjour,

    J'ai testé la deuxième solution avec Promise, j'ai toujours pas de réponse et j'ai cet affichage sur la console :

    ZoneAwarePromise*{__zone_symbol__state: true, __zone_symbol__value: undefined}__zone_symbol__state: true__zone_symbol__value: undefinedSymbol(Symbol.species): (...)Symbol(Symbol.toStringTag): (...)__proto__: Object
    osm.component.ts:325.
    Pour la clé, j'ai effectué une demande depuis quelques jours mais toujours pas de réponse.

    Merci pour votre aide

    Cordialement,

  8. #8
    Membre éclairé Avatar de elias couppe
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2014
    Messages
    407
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2014
    Messages : 407
    Points : 786
    Points
    786
    Par défaut
    Oups, je suis allé un peu vite en besogne, et fait tout de travers, mea culpa...

    J'ai modifié le code du message #6 au dessus. Vous pouvez vous référer à cette page : https://developer.mozilla.org/fr/doc..._les_promesses

  9. #9
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2020
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2020
    Messages : 16
    Points : 13
    Points
    13
    Par défaut
    Bonjour elias couppe,

    Merci de votre aide. ça marche bien

    Bonne journée

Discussions similaires

  1. OpenLayers + Geoportail + GWT
    Par ctlnPegas dans le forum IGN API Géoportail
    Réponses: 17
    Dernier message: 14/05/2014, 14h10
  2. Openlayers, geoportail et projections
    Par llby_ dans le forum IGN API Géoportail
    Réponses: 2
    Dernier message: 06/09/2012, 14h06
  3. Compatibilite Geoportail - Openlayers
    Par ycc000 dans le forum IGN API Géoportail
    Réponses: 12
    Dernier message: 06/09/2011, 19h51
  4. Compatibilité Geoportail - Openlayers
    Par ycc000 dans le forum SIG : Système d'information Géographique
    Réponses: 0
    Dernier message: 15/08/2011, 10h35
  5. Openlayers.Layers.TileCache sous geoportail
    Par Florent13 dans le forum IGN API Géoportail
    Réponses: 2
    Dernier message: 07/06/2010, 11h03

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