2011-09-28 11 views
6

Ho impostato alcuni poligoni, li ho disegnati sulla mappa bene. Sono anche riuscito a sparare a console.log quando sono stati cliccati. Tuttavia, come potrei continuare a capire quale poligono è stato effettivamente cliccato?Come posso ottenere un riferimento al poligono cliccato? (google maps api v3)

Come si può vedere nel mio codice di esempio qui memorizzo ogni oggetto all'interno della raccolta "lotti", tuttavia, facendo clic su di essi, mi viene dato solo il tempo latente del clic. Ho pensato che potrei aver bisogno di scorrere i miei poligoni e controllare se il punto è stato cliccato li sta intersecando e quindi capire quale poligono è ... c'è una soluzione più semplice?

var lot = new google.maps.Polygon({ 
    paths: me.area, 
    strokeColor: 'black', 
    strokeOpacity: 0.35, 
    strokeWeight: 1, 
    fillColor: fillcol, 
    fillOpacity: 0.35 
}); 

lot.setMap(map); 
var obj = { 
    'id':me.id, 
    'rented':me.rented, 
    'area':lot 
}; 

google.maps.event.addListener(lot, 'click', function(event) { 
    console.log(event); 
}); 

lots.push(lot); 
+0

Si rivelò getPath() funziona come un fascino. Non mi ero accorto di aver effettivamente ricevuto il riferimento poligonale sull'evento click, per abbinarlo ai miei "lotti" memorizzati, faccio semplicemente un loop tra i miei lotti memorizzati e paragona questo.getPath ad altro.getPath, se corrispondono io so quale lotto è stato cliccato e ora può mostrare informazioni relative a questo particolare oggetto. – Bisa

+0

Potrebbe essere necessario attendere alcune ore prima che il sito ti consenta di farlo, ma se possibile puoi pubblicare questa risposta come risposta. – Trott

risposta

13

Perché non assegnare ad ogni poligono alcune proprietà id quando crearli e più tardi usare semplicemente this.myID? A dire il vero, puoi appendere tutte le informazioni necessarie su quell'oggetto poligonale.

var lot = new google.maps.Polygon({ 
     paths: me.area, 
     strokeColor: 'black', 
     strokeOpacity: 0.35, 
     strokeWeight: 1, 
     fillColor: fillcol, 
     fillOpacity: 0.35 
    }); 

    lot.setMap(map); 

    var obj = { 
     'id':me.id, 
     'rented':me.rented, 
     'area':lot 
    }; 
    lot.objInfo = obj; 

    google.maps.event.addListener(lot, 'click', function(event) { 
     console.log(this.objInfo); 
    }); 

    lots.push(lot); 

Sarebbe più efficace di confronto percorso in un ciclo, o mi sto perdendo qualcosa? :)

+0

hmm, non sono sicuro, cosa sono io mai veramente pensato di aggiungere le mie proprietà all'oggetto poligono ma immagino che sia più agevole confrontando il percorso yes =) – Bisa

+1

@Bisa E a partire da javascript memorizza riferimenti a oggetti e matrici, non copie, il consumo di memoria in questo caso rimane lo stesso. – dmitry

+0

destra, questo è un argomento valido, nella mia soluzione originale avrei copiato i valori e li avrei confrontati piuttosto che confrontare i riferimenti - riscriverò il mio codice un po '^^ thnx – Bisa

0

Risolto getPath() funziona come un fascino. Non mi ero accorto di aver effettivamente ricevuto il riferimento poligonale sull'evento click, per abbinarlo ai miei "lotti" memorizzati, faccio semplicemente un loop dei miei lotti memorizzati e confronti questo.getPath ad altro.getPath, se corrispondono corrispondono a sapere quale lotto era cliccato e ora può mostrare informazioni relative a questo particolare oggetto.

Ecco un esempio di codice: (dove il parcheggio è un array dei miei oggetti area di parcheggio che a loro volta hanno array contenente oggetti parcheggio)

google.maps.event.addListener(lot, 'click', function(event) { 

    var myPath = this.getPath(); 

      for(var i = 0; i < parking.length; i++){ 
      for(var j = 0; j < parking[i].lots.length; j++){ 
       var lot = parking[i].lots[j]; 

       var otherPath = lot.poly.getPath(); 

       if(otherPath == myPath){ 
        console.log(lot); 
        break; 
       } 
      } 
      } 

     }); 
+0

come suggerito da Trotts Ho postato il mio commento sopra come risposta oltre a fornire qualche esempio di codice - non mi permetterà di contrassegnarlo come risposta a domani tho;) – Bisa

8

Se riesco a intervenire con una soluzione diversa in ritardo, ho riscontrato lo stesso problema e ho scoperto che è possibile definire proprietà personalizzate su un poligono.

Il mio esempio (che crea uno stato su una mappa del Stati Uniti)

poly = new google.maps.Polygon({ 
    map_state_id: map_state_id, 
    paths: pts, 
    fillColor: colour, 
    fillOpacity: 0.66, 
    strokeWeight: 1, 
    clickable:true 
    }); 

In questo caso "map_state_id" è la proprietà personalizzata. L'ho definito come ID dello stato (1 per Alabama, 2 per Alaska, ecc.)

Quindi, quando si fa clic sul successivo stato particolare, questo "map_state_id" può essere passato alla funzione evento.

google.maps.event.addListener(poly, 'click', function() 
    { 
    var map_state_id = this.map_state_id; //retrieve correct state_id 

    $.ajax(
     { 
     type: "POST", 
     url: "http://www...get_state_info.php", 
     data: {state_id : map_state_id}, 
     dataType: "html", 
     success: function(data) 
      { 
      $("#state_info").html(data); //display some info 
      }      
     }); 
    }); 

ho trovato questo concetto particolare a http://dominoc925.blogspot.com/2011/12/add-your-own-property-field-to-google.html

+0

Grazie per aver sottolineato usando il 'questo'. - Era necessario per disambiguare i poligoni. – sdailey

Problemi correlati