Événement après modification du polygone dans google maps api v3

J'ai fait une application de cartographie qui utilise le gestionnaire de dessin (et met en œuvre des formes sélectionnables); Le programme fonctionne comme suit: lorsque vous finissez de dessiner le polygone après avoir cliqué sur un bouton sur un chemin, il est mappé sur le polygone.

Lorsque le polygone est édité après ce processus, je souhaite que la fonction de mappage soit à nouveau appelée. Cependant, je ne peux pas faire fonctionner cette partie;

J'ai essayé d'utiliser le code suivant, mais je reçois toujours une erreur car aucune forme n'est sélectionnée quand cet auditeur est ajouté. Que puis-je faire?

google.maps.event.addListener(selectedShape, 'set_at', function() { console.log("test"); }); google.maps.event.addListener(selectedShape, 'insert_at', function() { console.log("test"); }); 

Importants morceaux de code:

 function showDrawingManager(){ var managerOptions = { drawingControl: true, drawingControlOptions: { position: google.maps.ControlPosition.TOP_CENTER, drawingModes: [google.maps.drawing.OverlayType.MARKER,google.maps.drawing.OverlayType.POLYLINE,google.maps.drawing.OverlayType.POLYGON] }, markerOptions: { editable: true, icon : '/largeTDGreenIcons/blank.png' }, polygonOptions: { fillColor:"#1E90FF", strokeColor:"#1E90FF", }, polylineOptions: { strokeColor:"#FF273A" } } var drawingManager = new google.maps.drawing.DrawingManager(managerOptions); drawingManager.setMap(map); return drawingManager; } function clearSelection() { if (selectedShape) { console.log("clearSelection"); selectedShape.setEditable(false); selectedShape = null; numberOfShapes--; } } function setSelection(shape) { console.log("setSelection"); clearSelection(); selectedShape = shape; shape.setEditable(true); numberOfShapes++; //getInformation(shape); } function initialize(){ //.... var drawingManager = showDrawingManager(); google.maps.event.addListener(drawingManager, 'overlaycomplete', function(e) { if (e.type != google.maps.drawing.OverlayType.MARKER) { // Switch back to non-drawing mode after drawing a shape. drawingManager.setDrawingMode(null); // Add an event listener that selects the newly-drawn shape when the user // mouses down on it. var newShape = e.overlay; newShape.type = e.type; google.maps.event.addListener(newShape, 'click', function() { setSelection(newShape); }); setSelection(newShape); } }); 

Je l'ai résolu en appelant .getPath () et en mettant l'auditeur dans l'auditeur qui est appelé chaque fois qu'une forme est cliquée. Je pense que la documentation google api n'est pas très claire sur la façon d'utiliser le set_at, donc cela peut-être utile pour d'autres personnes aussi.

 // Add an event listener that selects the newly-drawn shape when the user // mouses down on it. var newShape = e.overlay; newShape.type = e.type; google.maps.event.addListener(newShape, 'click', function() { google.maps.event.addListener(newShape.getPath(), 'set_at', function() { console.log("test"); }); google.maps.event.addListener(newShape.getPath(), 'insert_at', function() { console.log("test"); }); setSelection(newShape); }); 
  google.maps.event.addListener(yourPolygon.getPath(), 'insert_at', function(index, obj) { //polygon object: yourPolygon }); google.maps.event.addListener(yourPolygon.getPath(), 'set_at', function(index, obj) { //polygon object: yourPolygon }); 

Le code ci-dessus fonctionne pour moi. Lorsque set_at est déclenché lorsque nous modifions la zone du polygone à partir d'un point en surbrillance (arêtes) et que insert_at est déclenché lorsque nous insert_at un point entre les bords en surbrillance. Je les ai utilisés dans polygoncomplete événement polygoncomplete et après avoir chargé un polygone de la base de données. Travaillant bien pour eux

Pour éviter les problèmes mentionnés avec set_at et en faisant glisser, j'ai ajouté ce qui désactive la diffusion d'événements pour set_at lorsque le dessin est traîné. J'ai créé une classe qui étend la classe polygone et a ajouté cette méthode:

  ExtDrawingPolygon.prototype.enableCoordinatesChangedEvent = function(){ var me = this, superClass = me.superClass, isBeingDragged = false, triggerCoordinatesChanged = function(){ //broadcast normalized event google.maps.event.trigger(superClass,'coordinates_changed'); }; //if the overlay is being dragged, set_at gets called repeatedly, so either we can debounce that or igore while dragging, ignoring is more efficient google.maps.event.addListener(superClass,'dragstart',function(){ isBeingDragged = true; }); //if the overlay is dragged google.maps.event.addListener(superClass,'dragend',function(){ triggerCoordinatesChanged(); isBeingDragged = false; }); //or vertices are added to any of the possible paths, or deleted var paths = superClass.getPaths(); paths.forEach(function(path,i){ google.maps.event.addListener(path,"insert_at",function(){ triggerCoordinatesChanged(); }); google.maps.event.addListener(path,"set_at",function(){ if(!isBeingDragged){ triggerCoordinatesChanged(); } }); google.maps.event.addListener(path,"remove_at",function(){ triggerCoordinatesChanged(); }); }); }; 

Il a ajouté un événement «coordination_changed» au polygone lui-même, de sorte que l'autre code peut simplement écouter un événement simple, simple et simplifié,

Chrismarx selon votre publication ci-dessous est un exemple d'utilisation d'un nouvel événement sur le typecript. J'ai fait un petit changement de suppression de la superclasse et de changer de référence à "moi" parce qu'il y avait un problème avec une référence indéfinie.

Dans le haut de votre fichier ou fichier de configuration global, utilisez l'utilisation:

 declare global { module google.maps { interface Polygon { enableCoordinatesChangedEvent(); } } } 

Ensuite, définissez l'extension:

  google.maps.Polygon.prototype.enableCoordinatesChangedEvent = function () { var me = this, isBeingDragged = false, triggerCoordinatesChanged = function () { //broadcast normalized event google.maps.event.trigger(me, 'coordinates_changed'); }; //if the overlay is being dragged, set_at gets called repeatedly, so either we can debounce that or igore while dragging, ignoring is more efficient google.maps.event.addListener(me, 'dragstart', function () { isBeingDragged = true; }); //if the overlay is dragged google.maps.event.addListener(me, 'dragend', function () { triggerCoordinatesChanged(); isBeingDragged = false; }); //or vertices are added to any of the possible paths, or deleted var paths = me.getPaths(); paths.forEach(function (path, i) { google.maps.event.addListener(path, "insert_at", function () { triggerCoordinatesChanged(); }); google.maps.event.addListener(path, "set_at", function () { if (!isBeingDragged) { triggerCoordinatesChanged(); } }); google.maps.event.addListener(path, "remove_at", function () { triggerCoordinatesChanged(); }); }); }; 

Enfin, appelez l'extension et ajoutez l'auditeur:

  google.maps.event.addListener(drawingManager, 'overlaycomplete', function (event) { event.overlay.enableCoordinatesChangedEvent(); google.maps.event.addListener(event.overlay, 'coordinates_changed', function (index, obj) { //polygon object: yourPolygon console.log('coordinates_changed'); }); });