2015-07-08 16 views
7

Stavo cercando una soluzione a questo problema su StackOverflow ma poiché non sono riuscito a trovare la soluzione accurata ho finito per risolverlo da solo e postarlo qui, spero che sia Aiuto.Come disegnare una freccia su ogni segmento di polilinea su Google Maps V3

Google Maps fornisce la funzione Polilinea, che in base a un elenco di coordinate può tracciare una serie di linee che le uniscono tutte.

È possibile disegnare una polilinea con una singola freccia con il seguente codice:

 var allCoordinates = [ 
     new google.maps.LatLng(26.291, 148.027), 
     new google.maps.LatLng(26.291, 150.027), 
     new google.maps.LatLng(22.291, 153.027), 
     new google.maps.LatLng(18.291, 153.027) 
    ]; 

    var polyline = new google.maps.Polyline({ 
      path: allCoordinates, 
      strokeColor: color, 
      strokeOpacity: 1.0, 
      strokeWeight: 2, 
      geodesic: true, 
      icons: [{ 
       icon: {path: google.maps.SymbolPath.FORWARD_CLOSED_ARROW}, 
       offset: '100%' 
      }] 
     }); 

Il problema qui è che la freccia sarà utilizzata solo in ultimo segmento come mostrato nella immagine successiva, ma a volte il percorso potrebbe non essere così semplice e abbiamo bisogno di aggiungere una freccia su ogni segmento.

L'attributo 'repeat' all'interno della definizione dell'icona potrebbe essere un'altra opzione ma consente solo di definire una misura in pixel e tale definizione non corrisponderà ad ogni cambio di direzione sulla polilinea.

PICTURE1

Così, in un modo che ho trovato per raggiungere questo obiettivo è stato quello di fare diverse polilinee, uno per ogni segmento permettendo in tal caso la freccia per essere disegnato su ciascuno di essi. Questo è il codice:

 var allCoordinates = [ 
     new google.maps.LatLng(26.291, 148.027), 
     new google.maps.LatLng(26.291, 150.027), 
     new google.maps.LatLng(22.291, 153.027), 
     new google.maps.LatLng(18.291, 153.027) 
    ]; 

    for (var i = 0, n = allCoordinates.length; i < n; i++) { 

     var coordinates = new Array(); 
     for (var j = i; j < i+2 && j < n; j++) { 
      coordinates[j-i] = allCoordinates[j]; 
     } 

     var polyline = new google.maps.Polyline({ 
      path: coordinates, 
      strokeColor: color, 
      strokeOpacity: 1.0, 
      strokeWeight: 2, 
      geodesic: true, 
      icons: [{ 
       icon: {path: google.maps.SymbolPath.FORWARD_CLOSED_ARROW}, 
       offset: '100%' 
      }] 
     }); 
     polyline.setMap(map); 
     polylines.push(polyline); 

    } 

E questo è il quadro:

PICTURE2

Spero che questo funziona per chi è alla ricerca di qualcosa di simile!

+0

Ho cercato un modo per posizionare le frecce lungo un percorso. Questo percorso sarebbe il percorso di una polilinea tracciata tramite Google Maps DirectionService (che ti dà il percorso che passa attraverso le coordinate di certe che hai). La soluzione che offrite qui va bene per una polilinea auto-disegnata, che ha i vertici ben separati. Ma la polilinea disegnata da DirectionService potrebbe avere dei vertici troppo vicini (ad esempio i vertici utilizzati per disegnare una rotonda). In tal caso la tua meravigliosa soluzione non è valida. Se qualcuno ha una soluzione per il problema di cui parlo, mi piacerebbe davvero sentirne parlare. –

+0

La soluzione che spiego è per disegnare frecce lungo tutto il percorso. La soluzione che stai cercando è quella di fare ciò con l'eccezione di evitare che la freccia venga aggiunta per segmenti con larghezza molto breve (i vertici sono troppo vicini). L'adattamento dell'algoritmo di cui sopra non è così difficile, dovresti controllare la distanza tra ogni due coordinate (all'interno del "per") per ogni coordinata e se sono al di sotto della soglia desiderata, creare una polilinea senza icona in quel caso, altrimenti aggiungere la polilinea con l'icona della freccia corrente. Spero possa essere d'aiuto! –

risposta

4

C'è una proprietà di ripetizione per l'oggetto opzioni icona. Il example of dashed lines from the Google Maps JS API mostra un modo per farlo con simboli ripetuti sulla linea invece di creare nuove polilinee. Nel contesto del tuo esempio, sarebbe simile a questa:

var allCoordinates = [ 
    new google.maps.LatLng(26.291, 148.027), 
    new google.maps.LatLng(26.291, 150.027), 
    new google.maps.LatLng(22.291, 153.027), 
    new google.maps.LatLng(18.291, 153.027) 
]; 

var polyline = new google.maps.Polyline({ 
    path: allCoordinates, 
    strokeColor: color, 
    strokeOpacity: 1.0, 
    strokeWeight: 2, 
    geodesic: true, 
    icons: [{ 
     icon: {path: google.maps.SymbolPath.FORWARD_CLOSED_ARROW}, 
     offset: '100%', 
     repeat: '20px' 
    }] 
}); 
polyline.setMap(map); 
polylines.push(polyline); 
+0

@ martín-c - hai avuto la possibilità di testare questa soluzione? – coderroggie

Problemi correlati