Here Maps API:检测何时将标记拖放到折线上

Here Maps API: Detecting when a Marker is dragged and dropped onto a Polyline

我在 Here 地图上有可拖动的标记,我想检测何时将标记拖放到折线上。我一直没能找到检测标记是否落在多段线上或多段线附近的好方法。如果我可以向 Polyline 对象添加一个 "dragend" 事件侦听器,那就太好了,但是除了实际地图之外,其他对象似乎不支持它。

另一种方法是确定从 dragend 出现的点到折线的距离,但我还没有找到计算该距离的直接方法。 (虽然我已经找到了找到离某个点最近的标记的示例。)

有什么建议吗?

可以在地图对象上添加 dragend 事件侦听器。

此代码应该适合您(在 3.0 API 版本中):

var lineString = new H.geo.LineString([0, 0, 0, 50, 50, 0]),
    polyline = new H.map.Polyline(lineString, {style: {lineWidth: 15, strokeColor: 'red'}}),
    marker = new H.map.Marker({lat: 30, lng: 0});

  // Ensure that the marker can receive drag events
  marker.draggable = true;

  // add objects to the map
  map.addObjects([polyline, marker]);

  // set map center and zoom
  map.setCenter({lat: 30, lng: 0});
  map.setZoom(3);

  // disable map's behavior and calculate the offset between mouse and target's position
  // when starting to drag a marker object:
  marker.addEventListener('dragstart', function(ev) {
    var target = ev.target,
        pointer = ev.currentPointer,
        targetPosition = map.geoToScreen(target.getGeometry());

    target['offset'] = new H.math.Point(pointer.viewportX - targetPosition.x, pointer.viewportY - targetPosition.y);
    behavior.disable();
  }, false);

  // Listen to the drag event and move the position of the marker
   marker.addEventListener('drag', function(ev) {
    var target = ev.target,
        pointer = ev.currentPointer;
    target.setGeometry(map.screenToGeo(pointer.viewportX - target['offset'].x, pointer.viewportY - target['offset'].y));
  }, false);

  // re-enable behavior and check if marker was dropped on polyline
  marker.addEventListener('dragend', function(ev) {
    behavior.enable();
    var pointer = ev.currentPointer,
        objects = map.getObjectsAt(pointer.viewportX, pointer.viewportY),
        droppedOnPolyline = false;
    objects.forEach(function(object) {
      if (object === polyline) {
        droppedOnPolyline = true;
      }
    });

    console.log('marker dropped on polyline? %s', droppedOnPolyline);
  }, false);