Suite

Comment dessiner un cercle dans OpenLayers 2 et mesurer son rayon dynamiquement ?

Comment dessiner un cercle dans OpenLayers 2 et mesurer son rayon dynamiquement ?


Avec OpenLayers 2.13, je veux dessiner un cercle et obtenir son rayon à chaque mouvement de souris. Le rayon serait alors retourné en tant qu'arguments d'une fonction de rappel, par exemple. Mais bien sûr, ce n'est pas le problème ici.

J'ai essayé plusieurs façons mais aucune n'a fonctionné comme je le souhaite:

MÉTHODE A

J'ai essayé de changer la méthode "move" dans OpenLayers.Handler.RegularPolygon, en ajoutant un événement personnalisé dans le contrôle du gestionnaire. Cela a fonctionné mais, cela ne correspond pas à mes besoins, car :

  • Je ne peux calculer que la longueur "normale", et non la longueur "géodésique". Donc, je n'obtiens jamais un rayon correct.
  • D'ailleurs, changer le noyau d'OpenLayers ne me semble pas très propre, ni sûr !

MÉTHODE B

Utiliser OpenLayers.Control.Measure avec OpenLayers.Control.DrawFeatiure m'a semblé être la meilleure option. J'ai enregistré un événement pour "measurepartial", mais il n'a rien renvoyé. L'événement "measurepartial" n'est pas déclenché lors du dessin d'un cercle (RegularPolygon) car aucun point n'est ajouté (je suppose que c'est la raison).

SOURCES

  • Dans cette question, il est demandé quelque chose de très similaire à ce que je demande, mais il n'y avait pas de bonne réponse pour votre cas, alors j'ai essayé d'enquêter et de poster ma propre question.
  • Dans cette question, j'ai trouvé exactement le même problème que le mien, et c'est sur cette base que j'ai appliqué la METHODE A.

CONCLUSION

Je préférerais utiliser quelque chose comme la METHODE B, mais je ne sais pas comment. L'événement "measurepartial" n'est pas déclenché lors de l'utilisation de RegularPolygon.

Je n'ai pas posté de code, car c'est lié au travail. Et au fait, je pense avoir expliqué tout ce qui devait être dit.


Vous pouvez essayer d'utiliser le rappel de mouvement :

var my_polygonhandler = OpenLayers.Handler.RegularPolygon; var polygonControl = new OpenLayers.Control.DrawFeature(circles, my_polygonhandler, { handlerOptions : { côtés : 40 } }); polygonControl.handler.callbacks.move = function (e) { var linearRing = new OpenLayers.Geometry.LinearRing(e.components[0].components); var geometry = new OpenLayers.Geometry.Polygon([linearRing]); var polygonFeature = new OpenLayers.Feature.Vector(geometry, null); var polybounds = polygonFeature.geometry.getBounds(); var minX = polybounds.left; var minY = polybounds.bottom; var maxX = polybounds.right; var maxY = polybounds.top; //calculer les coordonnées du centre var startX = (minX + maxX) / 2; var débutY = (minY + maxY) / 2 ; //créer deux points au centre et au bord var startPoint = new OpenLayers.Geometry.Point(startX, startY); var endPoint = new OpenLayers.Geometry.Point(maxX, startY); var radius = new OpenLayers.Geometry.LineString([startPoint, endPoint]); var len = Math.round(radius.getLength()).toString(); document.getElementById("rayon").innerHTML = len; }

Je viens de configurer un jsfiddle pour montrer comment l'utiliser :

http://jsfiddle.net/expedio/L529bqb5/

Si vous souhaitez calculer la longueur géodésique, vous pouvez utiliser la méthode "getGeodesicLength" de votre linestring.


Voir la vidéo: Le cercle,rayon diamètre corde arc