调整传单中标记的大小,但在角度中保持相同的中心点

Resizing Markers in Leaflet but Keep Same Center Point in Angular

提问人:Dominick 提问时间:4/7/2019 更新时间:4/9/2019 访问量:524

问:

我接手了一个 Angular 项目,但在 Leaflet JS 库上遇到了一些麻烦。具体来说,您可以从工具栏中单击图标,然后单击以将它们放置在地图上。有一个侧边栏菜单,您可以在其中单击所需的图标大小 - 小 (20x20)、中 (41x41) 或大 (60x60)。问题在于,在大小之间更改时,未保留放置的图标的中心点。以下是单击“大”按钮时执行的代码(页面加载时默认为“中等大小”):

  $(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
  };
}

使用控制台日志记录,此方法似乎可以正确计算新的偏移量,但是每当我在“大”和“中”尺寸之间单击时,标记都会随着每个开关在地图上缓慢移动。

任何人都可以就如何设置更新的标记位置以在尺寸更改之间保持相同的中心点提供一些帮助/指导吗?

先谢谢你。

JavaScript Angular 宣传册

评论


答:

1赞 Dominick 4/9/2019 #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...

评论

0赞 Robert Ruby II 1/17/2021
你从哪里想出 nc.newX 和 nc.newY 值?
0赞 Dominick 2/17/2021
@RobertRubyII 这是 2 年前为一家我不再工作的公司做的一个项目。不幸的是,我不记得这些值的确切来源。我相信有一种单独的方法来计算新点应该是什么,类似于原始帖子中提到的 getNewLatLng 方法。 对不起,我不能更有帮助。