2015-07-08 14 views
7

Szukałem rozwiązania tego problemu na stackoverflow, ale ponieważ nie mogłem znaleźć dokładnego rozwiązania, sam go rozwiązałem i zamieszczam tutaj, mam nadzieję, że Wsparcie.Jak narysować strzałkę na każdym segmencie polilinii w Mapach Google V3

Google Maps udostępnia funkcję Polilinii, która na podstawie listy współrzędnych może narysować serię linii łączących je wszystkie.

można narysować polilinię z pojedynczą strzałką z następującego kodu:

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

Problem polega na tym, że strzałka zostanie opracowany dopiero w ostatnim segmencie, jak pokazano na kolejnym rysunku, ale czasami trasa może nie być tak prosta i musimy dodać strzałkę w każdym segmencie.

Atrybut "powtórz" w definicji ikony może być inną opcją, ale pozwala tylko zdefiniować miarę w pikselach, a ostateczność nie będzie pasować do każdej zmiany kierunku na polilinie.

PICTURE1

Więc jeden sposób znalazłem się achive to było zrobić kilka polilinie, po jednym w każdym segmencie pozwalając w tym przypadku strzałkę być sporządzony na każdym z nich. Jest to kod:

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

    } 

A oto zdjęcia:

PICTURE2

Mam nadzieję, że to działa dla każdego, kto szuka czegoś takiego!

+0

Szukałem sposobu na umieszczenie strzałek wzdłuż trasy. Ta trasa byłaby ścieżką polilinii narysowanej za pomocą Google Maps DirectionService (która podaje trasę, która przechodzi przez współrzędne certyfikatów, które posiadasz). Oferowane tutaj rozwiązanie jest dobre dla samopowtarzalnej polilinii, która ma dobrze oddzielone wierzchołki. Ale polilinia narysowana przez DirectionService może mieć zbyt blisko wierzchołki (na przykład wierzchołki użyte do narysowania ronda). W takim przypadku twoje cudowne rozwiązanie jest nieważne. Jeśli ktoś ma rozwiązanie tego problemu, o którym mówię, naprawdę chciałbym o tym usłyszeć. –

+0

Rozwiązanie, które wyjaśniam, służy do rysowania strzałek na całej trasie. Rozwiązanie, którego szukasz, polega na tym, aby nie dodawać strzałek dla segmentów o bardzo krótkiej szerokości (wierzchołki zbyt blisko). Dostosowanie powyższego algorytmu nie jest tak trudne, należy sprawdzić odległość między każdą z dwóch współrzędnych (wewnątrz "dla") dla każdej współrzędnej i jeśli są one poniżej wymaganego progu, należy utworzyć polilinię bez ikony w tym przypadku, w przeciwnym razie dodać polilinię z bieżącą ikoną strzałki. Mam nadzieję, że to pomoże! –

Odpowiedz

4

Istnieje właściwość repeat dla obiektu opcji ikony. example of dashed lines from the Google Maps JS API pokazuje sposób, aby to zrobić z powtarzaniem symboli na linii, zamiast tworzyć nowe polilinie. W kontekście Twojego przykładu będzie wyglądać mniej więcej tak:

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 - czy miałeś okazję przetestować to rozwiązanie? – coderroggie

Powiązane problemy