2012-01-12 6 views
22

Google Maps ha la libreria Disegno per disegnare polilinee e poligoni e altre cose.Google Maps v3 - Elimina vertice su poligono

esempio di questa funzionalità qui: http://gmaps-samples-v3.googlecode.com/svn-history/r282/trunk/drawing/drawing-tools.html

che voglio, quando il disegno e la modifica del poligono, per essere in grado di eliminare un punto/vertice sul percorso. I documenti API non sembrano suggerire nulla.

+0

Il collegamento non funziona più. – Saurabh

risposta

23

Questa è attualmente una richiesta di funzionalità eccezionale (riconosciuta da Google), issue 3760.

Ecco la mia soluzione: http://jsbin.com/ajimur/10. Usa una funzione che aggiunge un pulsante di cancellazione al poligono passato (sotto il pulsante Annulla).


In alternativa, qualcuno ha suggerito questo approccio: right-click to delete closest vertex, che funziona bene, ma è un po 'carente in UI finezza. Ho creato il codice dal link per verificare se il clic era all'interno (o entro 1 pixel di) del nodo - in un JSBin qui: http://jsbin.com/ajimur/.

EDIT: come Amr Bekhit sottolineato: questo approccio è attualmente interrotto, poiché gli eventi devono essere collegati al poligono.

+0

La tua pagina demo funziona per me in FF, IE e Chrome ma non in Opera, che sembra ignorare l'evento rightclick. Ma Thx. – mtom

+0

Right - Opera può essere un po 'approssimativo in ciò che consente agli script di fare di default. Ti aiuta: http://groups.google.com/a/googleproductforums.com/forum/#!category-topic/maps/navigation-and-directions/4dy2iYzRKgk –

+2

Non suona come expertexchange o altro, ma +1 me se è stato utile! :) –

34

Google Maps ora fornisce un oggetto di richiamata "PolyMouseEvent" su eventi attivati ​​da un poligono o polilinea.

Per costruire sulle altre risposte che hanno suggerito una soluzione che comprenda un click destro, tutto quello che avrebbe bisogno di fare è il seguente nelle ultime versioni delle API V3:

// this assumes `my_poly` is an normal google.maps.Polygon or Polyline 
var deleteNode = function(mev) { 
    if (mev.vertex != null) { 
    my_poly.getPath().removeAt(mev.vertex); 
    } 
} 
google.maps.event.addListener(my_poly, 'rightclick', deleteNode); 

Si noterà che qualsiasi calcoli complessi sul fatto che siamo vicini al punto non sono più necessari, poiché l'API di Google Maps ora ci dice quale vertice abbiamo fatto clic.

Nota: funziona solo quando Polilinea/Poligono è in modalità di modifica. (che è quando i vertici che potresti voler eliminare sono visibili.)

Come ultimo pensiero, potresti prendere in considerazione l'utilizzo di un clic o di un evento doppio clic. "Click" è abbastanza intelligente da non attivarsi durante il trascinamento, anche se l'utilizzo di un trigger con un solo clic potrebbe sorprendere alcuni dei tuoi utenti.

+1

Puoi cambiare 'my_poly' nella callback per' questo '. Sono andato con 'click' protetto da una finestra di dialogo' confirm' ... Non penso che gli utenti indovinino il tasto destro del mouse (menu contestuale) o doppio clic (zoom), ma fare clic su è naturale. Grazie! –

+0

Questo non funziona correttamente per i poligoni che hanno più di un percorso, come le ciambelle. Vedere la mia risposta per il codice che gestisce correttamente più percorsi. –

15

Ho trovato il codice di Sean molto semplice e utile. Ho appena aggiunto un limitatore per interrompere l'eliminazione quando l'utente ha solo 3 nodi rimasti. Senza di esso, l'utente può ottenere fino a solo un nodo, e non può modificare più:

my_poly.addListener('rightclick', function(mev){ 
    if (mev.vertex != null && this.getPath().getLength() > 3) { 
     this.getPath().removeAt(mev.vertex); 
    } 
}); 
+1

Avere 2 nodi a sinistra è ancora ok perché c'è un nodo sbiadito tra loro per crearne uno nuovo. Ma grazie per il suggerimento, l'ho usato. – Oliver

2

Ho pensato di contribuire perché ero alla ricerca di una soluzione anche per questo, ecco la mia realizzazione:

if (m_event.hasOwnProperty('edge') && m_event.edge >= 0 && 
GeofenceService.polygon.getPath().getLength() > 3) { 
    GeofenceService.polygon.getPath().removeAt(m_event.edge); 
    return; 
} 

if (m_event.hasOwnProperty('vertex') && m_event.vertex >= 0 && 
GeofenceService.polygon.getPath().getLength() > 3) { 
    GeofenceService.polygon.getPath().removeAt(m_event.vertex); 
    return; 
} 

Ciò consente la movimentazione cancellazione di nodi vertex e nodi periferici, e mantiene un minimo di un poligono formazione triangolare sempre controllando la lunghezza del percorso> 3.

+0

Questo è bello, quindi è possibile eliminare i punti medi. Grazie. – KeyOfJ

8

ho funzionato in situazioni dove ho bisogno di cancellare nodi da poligoni che contenevano percorsi multipli.Ecco una modifica del codice di Sean e di Evil:

shape.addListener('rightclick', function(event){ 
    if(event.path != null && event.vertex != null){ 
    var path = this.getPaths().getAt(event.path); 
    if(path.getLength() > 3){ 
     path.removeAt(event.vertex); 
    } 
    } 
}); 
+0

Ho bisogno di questo oggi! Assolutamente ben fatto! +1 – LokiSinclair

+0

Grazie! Questo è un salvagente (: –