如何在预先存在的折线上放置标记?

时间:2012-05-19 19:54:16

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

折线已被绘制成地图,但如何在其上放置标记?

当前代码:

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

1 个答案:

答案 0 :(得分:2)

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

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

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

  1. 添加侦听器以检测线路上的点击次数(线条变粗以帮助点击)
  2. 找出点击该行的哪个部分
  3. 将标记添加到标记数组中,将其放置在正确的位置(顺序,根据新标记围绕它的标记)
  4. 使用新的标记LatLngs数组重新绘制线条。
  5. 点击侦听器已添加到该行。

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