2012-10-26 12 views
6

この例では、8つ以上のマーカーでルートを設定しています。GoogleマップV3 - waypoints + infowindowとランダムなテキスト

<!DOCTYPE html> 
<html> 
    <head> 
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no"> 
    <meta charset="utf-8"> 
    <title>Google Maps JavaScript API v3 Example: Directions Waypoints</title> 
<style> 
    #map{ 
    width: 100%; 
    height: 450px; 
} 
</style> 
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script> 
    <script src="https://maps.googleapis.com/maps/api/js?sensor=false"></script> 
    <script> 
     jQuery(function() { 
    var stops = [ 
         {"Geometry":{"Latitude":52.1615470947258,"Longitude":20.80514430999756}}, 
         {"Geometry":{"Latitude":52.15991486090931,"Longitude":20.804049968719482}}, 
         {"Geometry":{"Latitude":52.15772967999426,"Longitude":20.805788040161133}}, 
         {"Geometry":{"Latitude":52.15586034371232,"Longitude":20.80460786819458}}, 
         {"Geometry":{"Latitude":52.15923693975469,"Longitude":20.80113172531128}}, 
         {"Geometry":{"Latitude":52.159849043774074, "Longitude":20.791990756988525}}, 
         {"Geometry":{"Latitude":52.15986220720892,"Longitude":20.790467262268066}}, 
         {"Geometry":{"Latitude":52.16202095784738,"Longitude":20.7806396484375}}, 
         {"Geometry":{"Latitude":52.16088894313116,"Longitude":20.77737808227539}}, 
         {"Geometry":{"Latitude":52.15255590234335,"Longitude":20.784244537353516}}, 
         {"Geometry":{"Latitude":52.14747369312591,"Longitude":20.791218280792236}}, 
         {"Geometry":{"Latitude":52.14963304460396,"Longitude":20.79387903213501}} 



        ] ; 

    var map = new window.google.maps.Map(document.getElementById("map")); 

    // new up complex objects before passing them around 
    var directionsDisplay = new window.google.maps.DirectionsRenderer(); 
    var directionsService = new window.google.maps.DirectionsService(); 

    Tour_startUp(stops); 

    window.tour.loadMap(map, directionsDisplay); 
    window.tour.fitBounds(map); 

    if (stops.length > 1) 
     window.tour.calcRoute(directionsService, directionsDisplay); 
}); 

function Tour_startUp(stops) { 
    if (!window.tour) window.tour = { 
     updateStops: function (newStops) { 
      stops = newStops; 
     }, 
     // map: google map object 
     // directionsDisplay: google directionsDisplay object (comes in empty) 
     loadMap: function (map, directionsDisplay) { 
      var myOptions = { 
       zoom: 13, 
       center: new window.google.maps.LatLng(51.507937, -0.076188), // default to London 
       mapTypeId: window.google.maps.MapTypeId.ROADMAP 
      }; 
      map.setOptions(myOptions); 
      directionsDisplay.setMap(map); 
     }, 
     fitBounds: function (map) { 
      var bounds = new window.google.maps.LatLngBounds(); 

      // extend bounds for each record 
      jQuery.each(stops, function (key, val) { 
       var myLatlng = new window.google.maps.LatLng(val.Geometry.Latitude, val.Geometry.Longitude); 
       bounds.extend(myLatlng); 
      }); 
      map.fitBounds(bounds); 
     }, 
     calcRoute: function (directionsService, directionsDisplay) { 
      var batches = []; 
      var itemsPerBatch = 10; // google API max = 10 - 1 start, 1 stop, and 8 waypoints 
      var itemsCounter = 0; 
      var wayptsExist = stops.length > 0; 

      while (wayptsExist) { 
       var subBatch = []; 
       var subitemsCounter = 0; 

       for (var j = itemsCounter; j < stops.length; j++) { 
        subitemsCounter++; 
        subBatch.push({ 
         location: new window.google.maps.LatLng(stops[j].Geometry.Latitude, stops[j].Geometry.Longitude), 
         stopover: true 
        }); 
        if (subitemsCounter == itemsPerBatch) 
         break; 
       } 

       itemsCounter += subitemsCounter; 
       batches.push(subBatch); 
       wayptsExist = itemsCounter < stops.length; 
       // If it runs again there are still points. Minus 1 before continuing to 
       // start up with end of previous tour leg 
       itemsCounter--; 
      } 

      // now we should have a 2 dimensional array with a list of a list of waypoints 
      var combinedResults; 
      var unsortedResults = [{}]; // to hold the counter and the results themselves as they come back, to later sort 
      var directionsResultsReturned = 0; 

      for (var k = 0; k < batches.length; k++) { 
       var lastIndex = batches[k].length - 1; 
       var start = batches[k][0].location; 
       var end = batches[k][lastIndex].location; 

       // trim first and last entry from array 
       var waypts = []; 
       waypts = batches[k]; 
       waypts.splice(0, 1); 
       waypts.splice(waypts.length - 1, 1); 

       var request = { 
        origin: start, 
        destination: end, 
        waypoints: waypts, 
        travelMode: window.google.maps.TravelMode.WALKING 
       }; 
       (function (kk) { 
        directionsService.route(request, function (result, status) { 
         if (status == window.google.maps.DirectionsStatus.OK) { 

          var unsortedResult = { order: kk, result: result }; 
          unsortedResults.push(unsortedResult); 

          directionsResultsReturned++; 

          if (directionsResultsReturned == batches.length) // we've received all the results. put to map 
          { 
           // sort the returned values into their correct order 
           unsortedResults.sort(function (a, b) { return parseFloat(a.order) - parseFloat(b.order); }); 
           var count = 0; 
           for (var key in unsortedResults) { 
            if (unsortedResults[key].result != null) { 
             if (unsortedResults.hasOwnProperty(key)) { 
              if (count == 0) // first results. new up the combinedResults object 
               combinedResults = unsortedResults[key].result; 
              else { 
               // only building up legs, overview_path, and bounds in my consolidated object. This is not a complete 
               // directionResults object, but enough to draw a path on the map, which is all I need 
               combinedResults.routes[0].legs = combinedResults.routes[0].legs.concat(unsortedResults[key].result.routes[0].legs); 
               combinedResults.routes[0].overview_path = combinedResults.routes[0].overview_path.concat(unsortedResults[key].result.routes[0].overview_path); 

               combinedResults.routes[0].bounds = combinedResults.routes[0].bounds.extend(unsortedResults[key].result.routes[0].bounds.getNorthEast()); 
               combinedResults.routes[0].bounds = combinedResults.routes[0].bounds.extend(unsortedResults[key].result.routes[0].bounds.getSouthWest()); 
              } 
              count++; 
             } 
            } 
           } 
           directionsDisplay.setDirections(combinedResults); 
          } 
         } 
        }); 
       })(k); 
      } 
     } 
    }; 
} 
    </script> 
    </head> 
    <body> 
    <div id="map"></div> 
</body> 
</html> 

それは魅力的なように機能しますが、私は各ウェイポイントに対して情報ウィンドウをセットアップするのに問題があります。私はA、B、Cのようなマーカー名を残すか、それ以外の方法でそれを生成したいが、A、B、Cまたは1,2,3のパターンを保つために+私はタイトルテキストとリンクを含む各マーカーにinfowindowを追加したい。

私は情報や例を見つけようとしていましたが、仕事に気づいていました。たぶん誰かがこのコードに情報ウィンドウを簡単に追加する方法を知っています。

はここで、

チャールズ

+0

私はくぼみが適切にあなたを得ることができ、あなたは、マーカー名が表示され、各マーカーの情報ウィンドウを作成したいですか? – Cdeez

+0

"タイトルテキストとリンク"を定義します。しかし、あなたの試みがTOSに違反しているかどうかはわかりません。 –

+0

私はインフォウインドウにマーカーのカスタムhtmlコンテンツを追加したいのですが、ここでポイント名、ポイント情報、ポイントリンクを入れます。これまでのところ、私はこれがTOSでOKであることを知っています – Charles

答えて

11

をありがとうございましたカスタムマーカーと情報ウィンドウでゼロからの指示を描く例である:あなたがDirectionsRendererにsuppressInfoWindowsオプションを使用する場合

Example

マーカとそれに関連する情報ウィンドウを作成する部分だけを使用することができます。

Working example based on your code

コード:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<!DOCTYPE html> 
 
<html> 
 
    <head> 
 
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no"> 
 
    <meta charset="utf-8"> 
 
    <title>Google Maps JavaScript API v3 Example: Directions Waypoints</title> 
 
<style> 
 
    #map{ 
 
    width: 100%; 
 
    height: 450px; 
 
} 
 
</style> 
 
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script> 
 
    <script src="https://maps.googleapis.com/maps/api/js"></script> 
 
    <script> 
 
     jQuery(function() { 
 
    var stops = [ 
 
         {"Geometry":{"Latitude":52.1615470947258,"Longitude":20.80514430999756}}, 
 
         {"Geometry":{"Latitude":52.15991486090931,"Longitude":20.804049968719482}}, 
 
         {"Geometry":{"Latitude":52.15772967999426,"Longitude":20.805788040161133}}, 
 
         {"Geometry":{"Latitude":52.15586034371232,"Longitude":20.80460786819458}}, 
 
         {"Geometry":{"Latitude":52.15923693975469,"Longitude":20.80113172531128}}, 
 
         {"Geometry":{"Latitude":52.159849043774074, "Longitude":20.791990756988525}}, 
 
         {"Geometry":{"Latitude":52.15986220720892,"Longitude":20.790467262268066}}, 
 
         {"Geometry":{"Latitude":52.16202095784738,"Longitude":20.7806396484375}}, 
 
         {"Geometry":{"Latitude":52.16088894313116,"Longitude":20.77737808227539}}, 
 
         {"Geometry":{"Latitude":52.15255590234335,"Longitude":20.784244537353516}}, 
 
         {"Geometry":{"Latitude":52.14747369312591,"Longitude":20.791218280792236}}, 
 
         {"Geometry":{"Latitude":52.14963304460396,"Longitude":20.79387903213501}} 
 

 

 

 
        ] ; 
 

 
    var map = new window.google.maps.Map(document.getElementById("map")); 
 

 
    // new up complex objects before passing them around 
 
    var directionsDisplay = new window.google.maps.DirectionsRenderer({suppressMarkers: true}); 
 
    var directionsService = new window.google.maps.DirectionsService(); 
 

 
    Tour_startUp(stops); 
 

 
    window.tour.loadMap(map, directionsDisplay); 
 
    window.tour.fitBounds(map); 
 

 
    if (stops.length > 1) 
 
     window.tour.calcRoute(directionsService, directionsDisplay); 
 
}); 
 

 
function Tour_startUp(stops) { 
 
    if (!window.tour) window.tour = { 
 
     updateStops: function (newStops) { 
 
      stops = newStops; 
 
     }, 
 
     // map: google map object 
 
     // directionsDisplay: google directionsDisplay object (comes in empty) 
 
     loadMap: function (map, directionsDisplay) { 
 
      var myOptions = { 
 
       zoom: 13, 
 
       center: new window.google.maps.LatLng(51.507937, -0.076188), // default to London 
 
       mapTypeId: window.google.maps.MapTypeId.ROADMAP 
 
      }; 
 
      map.setOptions(myOptions); 
 
      directionsDisplay.setMap(map); 
 
     }, 
 
     fitBounds: function (map) { 
 
      var bounds = new window.google.maps.LatLngBounds(); 
 

 
      // extend bounds for each record 
 
      jQuery.each(stops, function (key, val) { 
 
       var myLatlng = new window.google.maps.LatLng(val.Geometry.Latitude, val.Geometry.Longitude); 
 
       bounds.extend(myLatlng); 
 
      }); 
 
      map.fitBounds(bounds); 
 
     }, 
 
     calcRoute: function (directionsService, directionsDisplay) { 
 
      var batches = []; 
 
      var itemsPerBatch = 10; // google API max = 10 - 1 start, 1 stop, and 8 waypoints 
 
      var itemsCounter = 0; 
 
      var wayptsExist = stops.length > 0; 
 

 
      while (wayptsExist) { 
 
       var subBatch = []; 
 
       var subitemsCounter = 0; 
 

 
       for (var j = itemsCounter; j < stops.length; j++) { 
 
        subitemsCounter++; 
 
        subBatch.push({ 
 
         location: new window.google.maps.LatLng(stops[j].Geometry.Latitude, stops[j].Geometry.Longitude), 
 
         stopover: true 
 
        }); 
 
        if (subitemsCounter == itemsPerBatch) 
 
         break; 
 
       } 
 

 
       itemsCounter += subitemsCounter; 
 
       batches.push(subBatch); 
 
       wayptsExist = itemsCounter < stops.length; 
 
       // If it runs again there are still points. Minus 1 before continuing to 
 
       // start up with end of previous tour leg 
 
       itemsCounter--; 
 
      } 
 

 
      // now we should have a 2 dimensional array with a list of a list of waypoints 
 
      var combinedResults; 
 
      var unsortedResults = [{}]; // to hold the counter and the results themselves as they come back, to later sort 
 
      var directionsResultsReturned = 0; 
 

 
      for (var k = 0; k < batches.length; k++) { 
 
       var lastIndex = batches[k].length - 1; 
 
       var start = batches[k][0].location; 
 
       var end = batches[k][lastIndex].location; 
 

 
       // trim first and last entry from array 
 
       var waypts = []; 
 
       waypts = batches[k]; 
 
       waypts.splice(0, 1); 
 
       waypts.splice(waypts.length - 1, 1); 
 

 
       var request = { 
 
        origin: start, 
 
        destination: end, 
 
        waypoints: waypts, 
 
        travelMode: window.google.maps.TravelMode.WALKING 
 
       }; 
 
       (function (kk) { 
 
        directionsService.route(request, function (result, status) { 
 
         if (status == window.google.maps.DirectionsStatus.OK) { 
 

 
          var unsortedResult = { order: kk, result: result }; 
 
          unsortedResults.push(unsortedResult); 
 

 
          directionsResultsReturned++; 
 

 
          if (directionsResultsReturned == batches.length) // we've received all the results. put to map 
 
          { 
 
           // sort the returned values into their correct order 
 
           unsortedResults.sort(function (a, b) { return parseFloat(a.order) - parseFloat(b.order); }); 
 
           var count = 0; 
 
           for (var key in unsortedResults) { 
 
            if (unsortedResults[key].result != null) { 
 
             if (unsortedResults.hasOwnProperty(key)) { 
 
              if (count == 0) // first results. new up the combinedResults object 
 
               combinedResults = unsortedResults[key].result; 
 
              else { 
 
               // only building up legs, overview_path, and bounds in my consolidated object. This is not a complete 
 
               // directionResults object, but enough to draw a path on the map, which is all I need 
 
               combinedResults.routes[0].legs = combinedResults.routes[0].legs.concat(unsortedResults[key].result.routes[0].legs); 
 
               combinedResults.routes[0].overview_path = combinedResults.routes[0].overview_path.concat(unsortedResults[key].result.routes[0].overview_path); 
 

 
               combinedResults.routes[0].bounds = combinedResults.routes[0].bounds.extend(unsortedResults[key].result.routes[0].bounds.getNorthEast()); 
 
               combinedResults.routes[0].bounds = combinedResults.routes[0].bounds.extend(unsortedResults[key].result.routes[0].bounds.getSouthWest()); 
 
              } 
 
              count++; 
 
             } 
 
            } 
 
           } 
 
           directionsDisplay.setDirections(combinedResults); 
 
           var legs = combinedResults.routes[0].legs; 
 
           // alert(legs.length); 
 
           for (var i=0; i < legs.length;i++){ 
 
\t \t \t \t var markerletter = "A".charCodeAt(0); 
 
\t \t \t \t markerletter += i; 
 
            markerletter = String.fromCharCode(markerletter); 
 
            createMarker(directionsDisplay.getMap(),legs[i].start_location,"marker"+i,"some text for marker "+i+"<br>"+legs[i].start_address,markerletter); 
 
           } 
 
           var i=legs.length; 
 
           var markerletter = "A".charCodeAt(0); 
 
\t \t \t   markerletter += i; 
 
           markerletter = String.fromCharCode(markerletter); 
 
           createMarker(directionsDisplay.getMap(),legs[legs.length-1].end_location,"marker"+i,"some text for the "+i+"marker<br>"+legs[legs.length-1].end_address,markerletter); 
 
          } 
 
         } 
 
        }); 
 
       })(k); 
 
      } 
 
     } 
 
    }; 
 
} 
 
var infowindow = new google.maps.InfoWindow(
 
    { 
 
    size: new google.maps.Size(150,50) 
 
    }); 
 

 
var icons = new Array(); 
 
icons["red"] = new google.maps.MarkerImage("mapIcons/marker_red.png", 
 
     // This marker is 20 pixels wide by 34 pixels tall. 
 
     new google.maps.Size(20, 34), 
 
     // The origin for this image is 0,0. 
 
     new google.maps.Point(0,0), 
 
     // The anchor for this image is at 9,34. 
 
     new google.maps.Point(9, 34)); 
 

 

 

 
function getMarkerImage(iconStr) { 
 
    if ((typeof(iconStr)=="undefined") || (iconStr==null)) { 
 
     iconStr = "red"; 
 
    } 
 
    if (!icons[iconStr]) { 
 
     icons[iconStr] = new google.maps.MarkerImage("http://www.google.com/mapfiles/marker"+ iconStr +".png", 
 
     // This marker is 20 pixels wide by 34 pixels tall. 
 
     new google.maps.Size(20, 34), 
 
     // The origin for this image is 0,0. 
 
     new google.maps.Point(0,0), 
 
     // The anchor for this image is at 6,20. 
 
     new google.maps.Point(9, 34)); 
 
    } 
 
    return icons[iconStr]; 
 

 
} 
 
    // Marker sizes are expressed as a Size of X,Y 
 
    // where the origin of the image (0,0) is located 
 
    // in the top left of the image. 
 
    
 
    // Origins, anchor positions and coordinates of the marker 
 
    // increase in the X direction to the right and in 
 
    // the Y direction down. 
 

 
    var iconImage = new google.maps.MarkerImage('mapIcons/marker_red.png', 
 
     // This marker is 20 pixels wide by 34 pixels tall. 
 
     new google.maps.Size(20, 34), 
 
     // The origin for this image is 0,0. 
 
     new google.maps.Point(0,0), 
 
     // The anchor for this image is at 9,34. 
 
     new google.maps.Point(9, 34)); 
 
    var iconShadow = new google.maps.MarkerImage('http://www.google.com/mapfiles/shadow50.png', 
 
     // The shadow image is larger in the horizontal dimension 
 
     // while the position and offset are the same as for the main image. 
 
     new google.maps.Size(37, 34), 
 
     new google.maps.Point(0,0), 
 
     new google.maps.Point(9, 34)); 
 
     // Shapes define the clickable region of the icon. 
 
     // The type defines an HTML &lt;area&gt; element 'poly' which 
 
     // traces out a polygon as a series of X,Y points. The final 
 
     // coordinate closes the poly by connecting to the first 
 
     // coordinate. 
 
    var iconShape = { 
 
     coord: [9,0,6,1,4,2,2,4,0,8,0,12,1,14,2,16,5,19,7,23,8,26,9,30,9,34,11,34,11,30,12,26,13,24,14,21,16,18,18,16,20,12,20,8,18,4,16,2,15,1,13,0], 
 
     type: 'poly' 
 
    }; 
 

 

 
function createMarker(map, latlng, label, html, color) { 
 
// alert("createMarker("+latlng+","+label+","+html+","+color+")"); 
 
    var contentString = '<b>'+label+'</b><br>'+html; 
 
    var marker = new google.maps.Marker({ 
 
     position: latlng, 
 
     map: map, 
 
     shadow: iconShadow, 
 
     icon: getMarkerImage(color), 
 
     shape: iconShape, 
 
     title: label, 
 
     zIndex: Math.round(latlng.lat()*-100000)<<5 
 
     }); 
 
     marker.myname = label; 
 

 
    google.maps.event.addListener(marker, 'click', function() { 
 
     infowindow.setContent(contentString); 
 
     infowindow.open(map,marker); 
 
     }); 
 
    return marker; 
 
} 
 
    </script> 
 
    </head> 
 
    <body> 
 
    <div id="map"></div> 
 
</body> 
 
</html>

+0

この例を見ましたが、ときどきそこに8ウェイポイントがあるため、既存の関数にinfowindowを追加する必要があります – Charles

+0

この例では8ウェイポイントは使用しませんが、なぜならあなたはそのコンセプトを使うことができないからです。あなたの例に基づいて[この例題](http://www.geocodezip.com/v3_directions_multipleWayPts_CustomMrkrsB.html)を見てください(答えに加えて)。 – geocodezip