Здесь API Карт: Обнаружение, когда Маркер перетаскивается на Полилинию. - PullRequest
0 голосов
/ 18 октября 2019

У меня есть перетаскиваемые маркеры на карте Here, и я хотел бы определить, когда маркер перетаскивается на полилинию. Я не смог найти хороший способ обнаружить, что маркер падает на полилинию или рядом с ней. Было бы неплохо, если бы я мог добавить прослушиватель событий "dragend" к объекту Polyline, но это, похоже, не поддерживается для объектов, отличных от реальной карты.

Другим подходом будет определение расстояниядо полилинии от точки, где происходит драгенд, но я не нашел простой способ рассчитать это расстояние. (Хотя я нашел пример для нахождения ближайшего маркера к точке.)

Есть предложения?

1 Ответ

0 голосов
/ 24 октября 2019

Можно добавить 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);

...