【问题标题】:How to place markers on a preexisting polyline?如何在预先存在的折线上放置标记?
【发布时间】:2012-05-21 05:16:49
【问题描述】:

折线已经画好了地图,怎么在上面放标记呢?

当前代码:

map = new google.maps.Map(document.getElementById("map-canvas-tour"), mapOptions);

loadShowDates();

var polyFutureOptions = {
    path: pathFutureCoordinates,
    strokeColor: '#0000FF',
    strokeOpacity: 0.8,
    strokeWeight: 2.5
};

var polyPastOptions = {
    path: pathPastCoordinates,
    strokeColor: '#FF0000',
    strokeOpacity: 0.6,
    strokeWeight: 2.5
};

pathPast = new google.maps.Polyline(polyPastOptions);
pathFuture = new google.maps.Polyline(polyFutureOptions);
pathPast.setMap(map);
pathFuture.setMap(map);
infowindow = new google.maps.InfoWindow();
map.fitBounds(bounds);

有两组点:pathFutureCoordinates 和 pathPastCoordinates,它们指的是过去的演出和未来的演出,都在旅游路线(折线)上。每组标记可以是不同的颜色。

请问我会用什么来做到这一点?

还有其他建议吗?自定义标记将是理想的选择。

有问题的网站页面:http://goo.gl/H995E

【问题讨论】:

  • ... ,} ...};

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


【解决方案1】:

这是一个放置标记以扩展单条折线的页面(单击地图),或者当单击折线中的一个点时,会在折线上添加一个标记。您可以通过拖动新标记并查看线条调整线段来检查新标记是否放置正确。

https://files.nyu.edu/hc742/public/googlemaps/distance2.html

我不确定您是否打算通过单击在行上添加新标记。我将在上面的页面中描述如何通过点击添加标记。拥有一个预先构建的 LatLngs 列表会简单得多(您只需要下面的步骤 3 和 4)。

  1. 添加侦听器以检测在线上的点击(线条加粗以帮助点击)
  2. 找出线条的哪一段被点击了
  3. 将标记添加到标记数组中,将其放置在正确的位置(顺序,基于新标记围绕它的标记)
  4. 使用新的标记 LatLngs 数组重新绘制线条。

点击监听器被添加到该行。

  google.maps.event.addListener(line, 'click', function(event) {
      for (var i = 0 ; i < markers.length - 1; i++) {
        if(isPointOnSegment(markers[i].getPosition(),
           markers[i+1].getPosition(),event.latLng)) {
          addMarker(event.latLng, i+1);
          break;
        } 
      }
    });
  }

因为我们需要知道点击了哪个段,所以调用了一个辅助函数(isPointOnSegment)

  function isPointOnSegment(gpsPoint1, gpsPoint2, gpsPoint ){

    //Provided by Engineer
    // http://stackoverflow.com/questions/10018003/which-segment-of-a-polyline-was-clicked
    // 1st version, ignores perfectly horiz and vert. lines
    var p1 = map.getProjection().fromLatLngToPoint( gpsPoint1 );
    var p2 = map.getProjection().fromLatLngToPoint( gpsPoint2 );
    var p = map.getProjection().fromLatLngToPoint( gpsPoint );

    var t_x = (p.x - p1.x)/(p2.x-p1.x);
    var t_y = (p.y - p1.y)/(p2.y-p1.y);
    return ( eq(t_x,t_y) && t_x >= 0 && t_x <= 1 && t_y >= 0 && t_y <= 1);
  } 

添加标记和更新标记位置数组:

    function addMarker(pos, where) {

    var marker = new google.maps.Marker({
      map: map,
      position: pos,
      draggable: true
    });

    markers.splice(where,0,marker); 
    drawPath();
   }

最后,重新画线

  function drawPath() {
    countMarkers();
    var coords = [];
    for (var i = 0; i < markers.length; i++) {
      coords.push(markers[i].getPosition());
    }
    line.setPath(coords);
  }

用于在已有坐标的位置添加标记

http://jsfiddle.net/WZqgE/1/

  var pathFutureCoordinates = [
    new google.maps.LatLng(40, -80),
    new google.maps.LatLng(38, -85),
    new google.maps.LatLng(39, -92),
    new google.maps.LatLng(42, -98),
    new google.maps.LatLng(37, -102)      
  ];
  for (var i = 0; i < pathFutureCoordinates.length; i++) {
    new google.maps.Marker({
      map: map,
      position: pathFutureCoordinates[i],
      icon: "http://maps.google.com/mapfiles/kml/pal4/icon39.png"
    });
  }

【讨论】:

  • “有一个预先构建的 LatLngs 列表”有:pathFutureCoordinates, pathPastCoordinates
  • 我把这个问题误解为更复杂的问题。如果您想要在线的每个“弯曲”处放置一个标记,并且具有数组 pathFuture/PastCoordinates,您可以遍历每个列表并编写 pastMarker = new google.maps.Marker({ map: map, position: pathPastCoordinates[i] }),或者如果您有一个 MVCArray,pathPastCoordinates.getAt(i) .如果你需要保存标记的信息,你可以做一个标记数组。
  • 是的,每个弯头都有标记,无需保存。使用预先存在的数组:数组 pathFuture/PastCoordinates - 你能写出完整的代码以便剪切和粘贴(脸红).. 会非常有帮助。谢谢。
  • 坐标值我来补。
  • @Adrian33 好的,我假设 pathCoordinates 具有相同的结构,即一组 LatLngs。我用其中一条路径和 JS Fiddle 的示例更新了上面的答案。您可以在 for 循环内设置一个图标。我只是复制其他路径的代码。
猜你喜欢
  • 2016-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-02
  • 2014-05-12
  • 2019-03-07
  • 2014-03-13
  • 2016-02-04
相关资源
最近更新 更多