Изменение размера маркеров в листовке, но с сохранением той же центральной точки в Angular

#javascript #angular #leaflet

#javascript #angular #листовка

Вопрос:

Я взялся за проект Angular и у меня возникли некоторые проблемы с библиотекой JS Leaflet. В частности, есть значки, которые вы можете щелкнуть на панели инструментов, а затем щелкнуть, чтобы разместить их на карте. Существует боковое меню, в котором вы можете выбрать нужный размер значка — маленький (20×20), средний (41×41) или большой (60×60). Проблема в том, что при изменении размеров центральная точка размещенных значков не поддерживается. Вот код, который выполняется при нажатии большой кнопки (средний размер по умолчанию используется при загрузке страницы):

   $(document).on("click", ".largeicon", function () {
    console.log("Large clicked!");
    drawnItems.eachLayer(function (layer) {
      if (layer instanceof L.Marker) {
        if (layer.dragging) {
          type_marker = layer._icon.classList[1];

          L.Icon.Large = L.Icon.Default.extend({
            options: {
              iconSize: new L.Point(60, 60),
              iconUrl: layer.dragging._marker._icon.currentSrc,
              iconRetinaUrl: layer.dragging._marker._icon.currentSrc,
            }
          });

          var large = new L.Icon.Large();
          //console.log("new L.Icon.Large", large);
          if (map.getBounds().contains(layer.getLatLng())) {
            layer.setIcon(large);
            layer._icon.style[L.DomUtil.TRANSFORM   'Origin'] = '30px 30px 0px';
          }
        }
      }
    });
    L.Icon.Default.prototype.options.iconSize = [60, 60];
    pinsize = 60;
  });
}
  

И у меня есть функция, которая (должна) правильно вычислять новое положение маркера, чтобы сохранялась та же центральная точка:

 function getNewLatLng(style, originalLat, originalLng, newWidth, newHeight) {
  var originalWidth = style["width"].slice(0, -2);
  var originalHeight = style["height"].slice(0, -2);

  var newLat = originalLat - ((newWidth - originalWidth) / 2);
  var newLng = originalLng - ((newHeight - originalHeight) / 2);

  return {
    newLat: newLat,
    newLng: newLng
  };
}
  

Используя ведение журнала консоли, кажется, что этот метод правильно вычисляет новые смещения, но всякий раз, когда я нажимаю между большим и средним размерами, маркер медленно перемещается по карте с каждым переключением.

Кто-нибудь может предоставить некоторую помощь / руководство о том, как я могу установить обновленное положение маркера, чтобы между изменениями размера сохранялась одна и та же центральная точка?

Заранее благодарю вас.

Ответ №1:

Итак, после долгих проб и ошибок я наконец понял, как сохранить ту же центральную точку маркеров. Мне нужно было обновить код до этого:

 if (map.getBounds().contains(layer.getLatLng())) {
            layer.setIcon(large);
            layer._icon.style[L.DomUtil.TRANSFORM] = "translate3d("   nc.newX   "px,"   nc.newY   "px,0px) rotateZ(0deg)";
            layer._icon.style[L.DomUtil.TRANSFORM   'Origin'] = '30px 30px 0px';
          }
  

После добавления [L.DomUtil.TRANSFORM] = "translate3d... линии центры были должным образом сохранены при изменении размера метки с любого размера на любой другой размер.

Комментарии:

1. Откуда вы взяли значения nc.newX и nc.newY?

2. @RobertRubyII Это был проект 2-летней давности для компании, в которой я больше не работаю. К сожалению, я не помню точно, откуда взялись эти значения. Я полагаю, что существовал отдельный метод для вычисления того, какой должна быть новая точка, аналогичный методу getNewLatLng, упомянутому в исходном сообщении. Извините, я не смог быть более полезным.