在某个行驶距离的谷歌地图api中的路线上添加标记

时间:2014-11-05 21:13:02

标签: javascript google-maps google-maps-api-3

我正在尝试向桌面应用程序显示一个地图,该应用程序将在地图外部具有控件,这些控件将填充html和js的某些部分。

我无法弄清楚的是,一旦我设置了路线,就会在距离起点500英里的路线上找到标记。

基本上,如果你想开500英里的地方,你会得到。我不想从一开始就是半径,而是在所选路线上500英里。我基本上尝试拼凑了我在网上找到的不同解决方案,但无法让它发挥作用。

我知道1000不会= 500英里,我只是想让任何事情发挥作用。

这就是我所拥有的:

var side_bar_html = "";

var gmarkers = [];
var map = null;
var startLocation = null;
var endLocation = null;
var length;

function initialize() {
  var center = new google.maps.LatLng(24.7756, 121.0062);

  map = new google.maps.Map(document.getElementById('map_canvas'), {
    center: center,
    zoom: 13,
    mapTypeId: google.maps.MapTypeId.ROADMAP
  });

  google.maps.event.addListener(map, 'click', function() {
    infowindow.close();
  });

  var directionsService = new google.maps.DirectionsService();

  var request = {
    origin: "%start%",
    destination: "%end%",
    travelMode: google.maps.DirectionsTravelMode.DRIVING
  };

  var polyline = new google.maps.Polyline({
    path: [],
    strokeColor: 'green',
    strokeWeight: 3
  });

  directionsService.route(request, function(response, status) {
    if (status == google.maps.DirectionsStatus.OK) {
      var bounds = new google.maps.LatLngBounds();
      var route = response.routes[0];
      var summaryPanel = document.getElementById("directions_panel");
      var detailsPanel = document.getElementById("direction_details");
      startLocation = new Object();
      endLocation = new Object();

      summaryPanel.innerHTML = "";
      detailsPanel.innerHTML = '<ul>';

      // For each route, display summary information.
      for (var i = 0; i < route.legs.length; i++) {
        var routeSegment = i + 1;
        summaryPanel.innerHTML += "<b>Route Segment: " + routeSegment + "</b><br />";
        summaryPanel.innerHTML += route.legs[i].start_address + " to ";
        summaryPanel.innerHTML += route.legs[i].end_address + "<br />";
        summaryPanel.innerHTML += route.legs[i].distance.text + "<br /><br />";
      }

      var path = response.routes[0].overview_path;
      var legs = response.routes[0].legs;

      for (i = 0; i < legs.length; i++) {
        if (i == 0) {
          startLocation.latlng = legs[i].start_location;
          startLocation.address = legs[i].start_address;
          createMarker(legs[i].start_location,"start",legs[i].start_address,"green");
        }

        endLocation.latlng = legs[i].end_location;
        endLocation.address = legs[i].end_address;

        var steps = legs[i].steps;
        for (j = 0; j < steps.length; j++) {
          var nextSegment = steps[j].path;
          detailsPanel.innerHTML += "<li>"+steps[j].instructions;
          var dist_dur = "";

          if (steps[j].distance && steps[j].distance.text) dist_dur += "&nbsp;"+steps[j].distance.text;

          if (steps[j].duration && steps[j].duration.text) dist_dur += "&nbsp;"+steps[j].duration.text;

          if (dist_dur != "") {
            detailsPanel.innerHTML += "("+dist_dur+")<br /></li>";
          } else {
            detailsPanel.innerHTML += "</li>";
          }

          for (k = 0; k < nextSegment.length; k++) {
            polyline.getPath().push(nextSegment[k]);
            bounds.extend(nextSegment[k]);
          }

          length = google.maps.geometry.spherical.computeLength(polyline.getPath());
          detailsPanel.innerHTML += "</ul>";

          polyline.setMap(map);
          map.fitBounds(bounds);
          createMarker(endLocation.latlng, "end", endLocation.address, "red");

          // == create the initial sidebar ==
          makeSidebar();
        }
      }
    }
  });

  var i = 1;
  var remainingDist = length;

  while (remainingDist > 0) {
    createMarker( polyline.GetPointAtDistance(1000 * i), i + " km", "stuff", "green" );
    remainingDist -= 1000;
    i++;
  }
}

var icons = new Array();
icons["red"] = new google.maps.MarkerImage(
  "",
  // This marker is 20 pixels wide by 34 pixels tall.
  new google.maps.Size(20, 20),
  // 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(iconColor) {
  if ((typeof(iconColor) == "undefined") || (iconColor == null)) {
    iconColor = "red";
  }

  if (!icons[iconColor]) {
    icons[iconColor] = new google.maps.MarkerImage(
      "",
      // This marker is 20 pixels wide by 34 pixels tall.
      new google.maps.Size(20, 20),
      // 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[iconColor];

}

var iconImage = new google.maps.MarkerImage(
  '',
  // This marker is 20 pixels wide by 34 pixels tall.
  new google.maps.Size(20, 20),
  // 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'
};

var infowindow = new google.maps.InfoWindow({
  size: new google.maps.Size(150, 50)
});

function createMarker(map, latlng, title) {
  var marker = new google.maps.Marker({
    position: latlng,
    map: map,
    title: title
  });
}

function 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;
  gmarkers.push(marker);

  google.maps.event.addListener(marker, 'click', function() {
    infowindow.setContent(contentString);
    infowindow.open(map, marker);
  });
}

function myclick(i) {
  google.maps.event.trigger(gmarkers[i], "click");
}

// == rebuilds the sidebar to match the markers currently displayed ==
function makeSidebar() {
  var html = "";
  for (var i = 0; i < gmarkers.length; i++) {
    html += '<a href="javascript:myclick(' + i + ')">' + gmarkers[i].myname + '<\/a><br>';
  }
  document.getElementById("side_bar").innerHTML = html;
}

0 个答案:

没有答案