2012-09-20 20 views
21

Hice una aplicación de asignación que utiliza el administrador de dibujos (e implementa formas seleccionables); El programa funciona de la siguiente manera: cuando se termina de dibujar el polígono después de hacer clic en un botón, se mapea una ruta en el polígono.evento después de modificar el polígono en google maps api v3

Cuando el polígono se edita después de este proceso, quiero que se vuelva a llamar a la función de mapeo. Sin embargo, no puedo hacer que esta pieza funcione;

Intenté utilizar el siguiente código pero siempre recibo un error porque aún no se ha seleccionado ninguna forma cuando se agrega esta escucha. ¿Que puedo hacer?

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

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

importantes piezas de código:

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); 
      } 
     }); 

Respuesta

25

me lo resolvieron llamando .getPath() y poner al oyente en el interior del oyente que se llama cada vez que se hace clic en una forma. Creo que la documentación de google api no es muy clara sobre cómo usar el set_at, por lo que puede ser útil para otras personas también.

// 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); 
    }); 
+2

Este puede funcionar con algunos mapas, pero tenga en cuenta que esto disparará una gran cantidad de eventos desencadenados a medida que el objeto se está arrastrando ed. Para mi código, ¡demasiados para manejar! Así que tuve que limitarme a los eventos de "clic" y "dragend". – jjwdesign

+1

Con respecto al comentario de jjwdesign: tuve el mismo problema y lo resolví quitando los controladores de eventos en dragstart y volviéndolos a agregar en dragend. Parece funcionar como un encanto a primera vista. – Jochem

+1

newShape.getPath no es una función. Estoy obteniendo este error ... –

14
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 
    }); 

El código anterior está trabajando para mí. Donde set_at se dispara cuando modificamos el área del polígono desde un punto resaltado (bordes) y insert_at se dispara cuando arrastramos el punto que está entre los bordes resaltados. Los usé en el evento polygoncomplete y después de cargar el polígono desde la base de datos. Funciona bien para ellos

+2

La clave aquí es que estas funciones tienen que ser llamadas dentro de 'polgoncomplete' –

7

Para evitar los problemas mencionados con set_at y arrastrando, agregué lo siguiente, que deshabilita la transmisión de eventos para set_at cuando se arrastra el dibujo. He creado una clase que amplíe la clase polígono, y añadió que este método:

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(); 
    }); 
    }); 

}; 

Se añadió un evento "coordinates_changed" al propio polígono, por lo que otro código sólo puede escuchar un agradable, sencillo, simplificado por eventos

+0

He intentado esto, pero sigo recibiendo un error, tiene algo que ver con el evento' mouseover 'para esa forma. – Ninjaneer

+0

Voy a necesitar más información para ser útil .... – chrismarx

+0

Me aparece 'Uncaught TypeError: no se puede leer la propiedad '__e3_' null' de error al pasar el ratón sobre una forma editable, este error viene en un momento. Veo que este error está presente en todas las implementaciones del administrador de dibujos. – Ninjaneer

1

chrismarx de acuerdo con su publicación a continuación es un ejemplo del uso de un nuevo evento en mecanografiado. He hecho pequeños cambios para eliminar la superclase y cambiar las referencias a "mí" porque había un problema con la referencia no definida.

En la parte superior de su archivo o archivo de configuración global, el uso etc:

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

a continuación, definir la extensión:

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(); 
      }); 
     }); 

    }; 

llaman Finalmente extensión y añadir oyente:

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'); 
     }); 

    }); 
+0

Bonito código, pero ¿cuál es la diferencia entre el personalizado "coordinates_changed" par y "dragend" ? ¿No los disparan ambos al final del arrastre? – TetraDev

Cuestiones relacionadas