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 :

Charger un polygone sur une carte sans KML


Sujet :

IGN API Géoportail

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 78
    Points : 25
    Points
    25
    Par défaut Charger un polygone sur une carte sans KML
    Bonjour à tous

    Je cherche à charger un polygone sur une carte sans passer par un fichier KML, sachant que j'ai déjà récupéré ses coordonnées lors de l'utilisation des outils de dessin (l'attribut d de la balise <path> du codé généré ci dessous) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <div id="OpenLayers.Layer.Vector_321" style="position: absolute; width: 100%; height: 100%; z-index: 360; left: 0px; top: 0px;" dir="ltr" class="olLayerDiv">
      <svg id="OpenLayers.Layer.Vector_321_svgRoot" width="794" height="544" viewBox="0 0 794 544">
        <g id="OpenLayers.Layer.Vector_321_root" style="visibility: visible;" transform="">
          <g id="OpenLayers.Layer.Vector_321_vroot">
            <path id="OpenLayers.Geometry.Polygon_338" d=" M 204,158 280,260 351,118 351,118 204,158 z" fill-rule="evenodd" fill="#ff00FF" fill-opacity="0.4" stroke="#ff00ff" stroke-opacity="1" stroke-width="1" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="none" pointer-events="visiblePainted" cursor="inherit"/>
          </g>
          <g id="OpenLayers.Layer.Vector_321_troot"/>
        </g>
        <defs id="OpenLayers.Layer.Vector_321_defs">
          <symbol id="OpenLayers.Layer.Vector_321-cross" viewBox="-10 -10 30 30"><polygon points="4,0 6,0 6,4 10,4 10,6 6,6 6,10 4,10 4,6 0,6 0,4 4,4 4,0"/></symbol>
        </defs>
      </svg>
    </div>
    Je ne trouve pas la fonction de l'API qui génère ce code
    J'ai essayé de placer simplement le contenu de la balise <path> dans le container mais il ne l'affiche pas.

    Des idées ? Merciiiiiii

  2. #2
    Nouveau membre du Club
    Inscrit en
    Avril 2010
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 42
    Points : 30
    Points
    30
    Par défaut
    Personnellement, tous les polygones présents sur mon API Geoportail sont définis via des fichiers KML que j'ajoute ensuite en tant que couche...

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 78
    Points : 25
    Points
    25
    Par défaut
    Il y a cette possibilité, mais ca me gène de laisser un fichier trainer sur le serveur avec toutes les coordonnées et les infos, sans compter tous les problèmes d'écriture / lecture en temps réel de ce fichier dès qu'on passe par un proxy ou autre système trop sécuritaire ...

    Donc je préférerais utiliser les infos dans le code

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 78
    Points : 25
    Points
    25
    Par défaut
    J'ai bien trouvé la fonction createGeometry mais je comprends pas trop comment l'implémenter

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    2 128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 2 128
    Points : 1 764
    Points
    1 764
    Par défaut http://atlasnw.free.fr/geoportail/exemples/cercle.html
    En adaptant ce code, tu dois obtenir le résultat escompté:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
      cercleLayer = new OpenLayers.Layer.Vector('cercle');
      viewer.getMap().addLayer(cercleLayer);
      var cercleOrigine = new OpenLayers.Geometry.Point(-1.50, 48.15 );
      cercleOrigine.transform(OpenLayers.Projection.CRS84, map.getProjection());
    	var styleCercle = OpenLayers.Util.extend({}, OpenLayers.Feature.Vector.style['default']);
    	styleCercle.strokeColor = "blue";
    	styleCercle.fillColor = "transparent"; 
      var cercleFeature = new OpenLayers.Feature.Vector(
        OpenLayers.Geometry.Polygon.createRegularPolygon( cercleOrigine, 250, 20, 0 ),
    		null,
    		styleCercle
      );
      cercleLayer.addFeatures( [cercleFeature] );

  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
    mga_geo a raison : il faut passer par la classe OpenLayers.Layer.Vector qui comprend toutes les fonctions (automatiques) pour dessiner...

    D'ailleurs, charger un KML/GPX/OSM/GML/WKT utilise ces fonction - pas besoin de réinventer le fil à couper le beurre

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 78
    Points : 25
    Points
    25
    Par défaut
    Ok merci pour vos conseils, je vais peut-être finalement opter dans un premier temps pour du KML, on verra après

    Par contre, j'ai un souci car je récupère les valeurs des points sous le format :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     M 236,129 352,243 388,103 388,103 236,129 z
    alors que je voudrais plutôt le format :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    2.2775303868150343,48.39443206175887 5.057114858994221,46.97782479131375 6.393453547541906,48.8911644812656
    Pour récupérer les coordonnées (au 2e format), j'utilise le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    OpenLayers.Control.Click= OpenLayers.Class( OpenLayers.Control, {
                    defaultHandlerOptions:{
                        'single': true,
                        'double': false,
                        'pixelTolerance': 0,
                        'stopSingle': false,
                        'stopDouble': false
                    },
              
                    /**
                     * Constructor
                     */
                    initialize: function(options) {
                        OpenLayers.Control.prototype.initialize.apply(this,arguments);
                        this.handlerOptions= OpenLayers.Util.extend({},this.defaultHandlerOptions);
                        this.handler= new OpenLayers.Handler.Click(
                            this, {'click': this.trigger}, this.handlerOptions);
                    },
              
                    /**
                     * APIMethod: trigger
                     */
                    trigger: function(e) {
                        var lonlat= this.map.getLonLatFromViewPortPx(e.xy).transform(
                            this.map.getProjection(), OpenLayers.Projection.CRS84
                        );
                        
                    }
                });
    
                var monClic= new OpenLayers.Control.Click();
                viewer.getMap().addControl(monClic);
                monClic.activate();
    où mes valeurs sont lonlat.lon + ',' + lonlat.lat + ' '

    Mais lorsque j'utilise l'outil de dessin, ce script n'est pas lu
    Il y a une astuce ou alors il fait que je convertisse les valeurs en coordonnées GPS ?

  8. #8
    Expert confirmé
    Homme Profil pro
    Ingénieur cartographe
    Inscrit en
    Avril 2009
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur cartographe
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 173
    Points : 4 224
    Points
    4 224
    Par défaut
    Citation Envoyé par kiouz Voir le message
    Mais lorsque j'utilise l'outil de dessin, ce script n'est pas lu
    Il y a une astuce ou alors il fait que je convertisse les valeurs en coordonnées GPS ?
    Pour pouvoir dessiner (et que quelque chose s'affiche), il faut que les coordonnées soient exprimées dans le système de la carte soit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    viewer.getMap().getProjection()
    Ensuite, la question à se poser est « dans quel système mes coordonnées sont exprimées à la lecture ? »

    Dans ton cas, tu récupère des coordonnées dans le système de la carte que tu transformes en GPS ... ta transformation est donc en trop

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 78
    Points : 25
    Points
    25
    Par défaut
    Merci pour ta réponse mais j'ai pas tout compris

    Je récapitule pour être sûr qu'on s'est bien compris.
    Pour générer mon KML, il faut que je place dans la balise <coordinates> des valeurs de type 2.2775303868150343,48.39443206175887.
    Quand j'utilise le script précédent pour récupérer les coordonnées au clic sur la carte, il me les retourne bien sous cette forme.

    Mon outil de dessin fonctionne, il génère le polygone sur la carte.

    Par contre, le script récupérant les coordonnées ne fonctionne pas quand j'utilise ces outils de dessin qui créent le polygone sur la carte. Quand je clique, il n'entre pas dans la fonction trigger

    C'est juste ce chainon manquant qui ne marche pas en fait.

  10. #10
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    2 128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 2 128
    Points : 1 764
    Points
    1 764
    Par défaut Un exemple
    Peux-tu mettre en ligne un exemple de ton code ?
    Cela facilite notablement le dialogue.

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 78
    Points : 25
    Points
    25
    Par défaut
    Ok, j'ai pas pu vous donner un lien vers le site où je travaille car ca se situe dans un back

    J'ai recopié tout ce qui nous intéresser dans une nouvelle page ici :
    http://www.kiouz.fr/test_api/test.html

    Donc j'ai un champ texte (normalement il communique avec une base mais là j'ai mis une valeur par défaut) qui contient les coordonnées.
    Quand je clique sur la carte en "mode normal", ces nouvelles coordonnées s'ajoutent automatiquement dans le champ texte (on peut vider le champ texte pour mieux s'en rendre compte).

    Par contre, dès que j'utilise l'outil de dessin, le script remplissant ce champ n'est pas exécuté et c'est là que je vois pas comment faire

    De plus, je voudrais que les valeurs contenues dans ce champ texte soient utilisées pour dessiner le polygone. A voir si elles ne sont pas sous le bon format

    PS : j'ai utilisé ces coordonnées pour créer un fichier KML qui fonctionne. Je peux toujours afficher ce KML au chargement et effacer cette couche au premier clic de dessin mais cette solution ne me convient pas trop. De plus, ca ne règle pas le premier souci

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 78
    Points : 25
    Points
    25
    Par défaut
    Ou alors, il faudrait que je stocke les valeurs "origin, radius, sides et rotation" du polygone créé pour exécuter ensuite la fonction qui le dessinera.

    Mais je vois pas encore comment récupérer ces informations une fois le polygone créé

  13. #13
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    2 128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 2 128
    Points : 1 764
    Points
    1 764
    Par défaut
    Tu dessines dans une couche vecteur "vector_layer", si tu explores la partie "features", tu trouveras l'objet qui va bien.
    Typiquement il faut regarder dans le code d'un export KML, GPX, ...

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 78
    Points : 25
    Points
    25
    Par défaut
    Citation Envoyé par mga_geo Voir le message
    Tu dessines dans une couche vecteur "vector_layer", si tu explores la partie "features", tu trouveras l'objet qui va bien.
    Typiquement il faut regarder dans le code d'un export KML, GPX, ...
    Ben ce que je comprends pas c'est que quand je masque la couche de dessin dans le gestionnaire de couches, le polygone que je viens de dessiner ne se masque pas.

    C'est donc qu'il ne se crée pas dans la couche vecteur "vector_layer" non ?

  15. #15
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    2 128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 2 128
    Points : 1 764
    Points
    1 764
    Par défaut
    Ben chez moi, je l'ai bien les objets dans la couche où je dessine.

  16. #16
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 78
    Points : 25
    Points
    25
    Par défaut
    Oui mais dans mon code, j'utilise les outils de mesures comme dessin car je ne voulais pas qu'il puisse y avoir plusieurs polygones.

    Mais je ne trouve pas comment afficher cette couche de mesure (et donc du coup mon dessin) dans mon gestionnaire de couche.

  17. #17
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    2 128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 2 128
    Points : 1 764
    Points
    1 764
    Par défaut Firebug
    J'ai dessiné une ligne, puis j'ai regardé avec Firebug.
    Dans l'onglet DOM, je trouve un objet viewer.map.layers[7].features[0].geometry
    qui contient
    LINESTRING(297400.96059818397 5262315.534344669,401848.96059818397 5202923.534344669,266680.96059818397 5104619.534344669,352696.96059818397 5022699.534344669,352696.96059818397 5024747.534344669,549304.960598184 5358571.534344669) { id="OpenLayers.Geometry.LineString_314", more...}

    Le layer 7 est le dernier layer de la map.

  18. #18
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 78
    Points : 25
    Points
    25
    Par défaut
    Et comment on convertit en coordonnées GPS ? Avec viewer.getMap().getProjection() ?

  19. #19
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 78
    Points : 25
    Points
    25
    Par défaut
    Bon, ben dernière piste en date, j'essaie de récupérer la valeur kmlLayer.features[0].geometry qui contient la liste des coordonnées lorsqu'on double clic à la fin de la création du polygone (car je veux le mettre dans un input caché pour après l'envoyer en base), mais je n'y arrive pas

    Il doit bien y avoir un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    OpenLayers.Handler.Polygon = OpenLayers.Class(OpenLayers.Handler.Path, {
        dblclick: function(e) {
          ...
          alert(kmlLayer.features[0].geometry);
          ...
        }
      });
    ... mais je n'arrive pas du tout à voir comment

  20. #20
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    2 128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 2 128
    Points : 1 764
    Points
    1 764
    Par défaut
    Vu que tu utilises les outils de mesure, il faut aller voir dans la classe Geoportal.Control.MeasureToolbar comment c'est fait et surcharger au bon endroit.
    J'ai une page de ce type: http://atlasnw.free.fr/geoportail/ex...precision.html

Discussions similaires

  1. [Google Maps] Affichage d'un certain nombre de calques KML sur une carte
    Par VisualCassis dans le forum APIs Google
    Réponses: 3
    Dernier message: 03/07/2014, 19h09
  2. Generer des objets aleatoirement sur une carte
    Par K20 dans le forum Langage
    Réponses: 13
    Dernier message: 24/12/2005, 16h19
  3. MapX, Ajouter des bmp et jpeg sur une carte ...
    Par rorodopuis dans le forum C++Builder
    Réponses: 2
    Dernier message: 25/07/2005, 09h07
  4. Mot de passe sur une carte à puce!?
    Par Le_Che dans le forum C++Builder
    Réponses: 13
    Dernier message: 20/05/2005, 10h37
  5. Calque -> Un point sur une carte de france
    Par TATAYET dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 02/04/2005, 14h48

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