【问题标题】:Google Maps V3 DrawingManager not remembering editable/draggable flagsGoogle Maps V3 DrawingManager 不记得可编辑/可拖动标志
【发布时间】:2019-04-17 05:17:39
【问题描述】:

我正在尝试在 Google Maps DrawingManager 创建后的某个时间设置其笔触和填充颜色。我不知道 DrawingManager 最初是否设置为具有可编辑和可拖动的多边形,因此我不想更改可编辑和可拖动标志。我不想做的就是改变颜色。但是,似乎如果我不提供可编辑和可拖动的值,DrawingManager 会自动将它们设置为 false。

这不是多边形的工作方式。如果您创建了一个 Polygon 并将其设置为可编辑和可拖动,然后更改其颜色,它将记住原始标志状态。

文档并不清楚应该预期什么,但这种不一致对我来说似乎是 Google 地图中的一个错误。最终,我不想单独跟踪 DrawingManager 的状态并传递它。

有人知道为什么会这样吗?

查看此示例并注意 DrawingManager 和 Polygon 的行为方式的差异。原始多边形是可编辑的,但使用 DrawingManager 绘制的则不可编辑。

https://jsfiddle.net/wv9zapud/

google.maps.event.addDomListener(window, "load", function() {

  var map = new google.maps.Map(document.getElementById("map_div"), {
    center: new google.maps.LatLng(25, -70),
    zoom: 5,
  });

  var triangleCoords = [{
      lat: 25.774,
      lng: -80.190
    },
    {
      lat: 18.466,
      lng: -66.118
    },
    {
      lat: 32.321,
      lng: -64.757
    },
    {
      lat: 25.774,
      lng: -80.190
    }
  ];

  var bermudaTriangle = new google.maps.Polygon({
    map: map,
    paths: triangleCoords,
    strokeColor: 'red',
    fillColor: 'red',
    editable: true,
    draggable: true
  });

  bermudaTriangle.setOptions({
    strokeColor: 'blue',
    fillColor: 'blue'
  });

  var drawingManager = new google.maps.drawing.DrawingManager({
    map: map,
    drawingMode: google.maps.drawing.OverlayType.POLYGON,
    drawingControl: false,
    polygonOptions: {
      fillColor: 'red',
      strokeColor: 'red',
      editable: true,
      draggable: true
    }
  });

  drawingManager.setOptions({
    polygonOptions: {
      fillColor: 'blue',
      strokeColor: 'blue'
    }
  });

});

【问题讨论】:

  • 我同意这在文档中不是很清楚。另请注意,使用绘图管理器时,您只能使用 2 个几乎等效的多边形事件:overlaycompletepolygoncomplete。我通常做的是使用polygoncomplete 事件,获取形状路径并从中创建一个 normal 多边形。这样您就可以访问 Polygon 类的所有事件。见this example。如果您想保持绘图模式,可以注释掉drawingManager.setDrawingMode(null); 行。
  • 然后重新。你的问题是为什么它的行为方式,我 认为 这是因为在你的 Polygon 示例中,你正在为那个 Polygon 更改一些选项,而绘图管理器的 setOptions 设置所有形状的选项,因此如果您省略某些值,它们将使用默认值。
  • @MrUpsidown 感谢您的想法和榜样。我同意setOptions第一次应该使用默认值来丢失参数(它还能做什么?)。但是,当在 DrawingManager 上设置新选项时,我希望它坚持最初创建时设置的参数值,并且只覆盖专门提供的参数。这正是 Polygon 所做的。在您的示例中,您假设可编辑/可拖动为真。我希望新的多边形只有在最初以这种方式创建的绘图管理器时才可编辑/可拖动。
  • 不应该太难保留这些选项的参考,因为这已在另一条评论中向您建议。同样在overlaycompletepolygoncomplete 事件监听器中(再看我的例子)你可以检查event.overlay.draggable。如果您设置它,它将是true / false,如果您没有设置它/使用默认值,它将是 undefined。 editable 也一样。
  • 我的主要目标是提出一个更清洁的解决方案,然后保持对状态的引用(这样当我更改颜色时,我可以重新应用状态)。但看起来这就是我最终必须要做的。

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


【解决方案1】:

您将 drawingManager polygonOptions 设置为未定义 editabledraggable(两者都默认为 false)。

如果您希望drawingManager 绘制的多边形可编辑或可拖动,则需要在调用drawingManager.setOptions 时将其设置为true:

drawingManager.setOptions({
  polygonOptions: {
    fillColor: 'blue',
    strokeColor: 'blue',
    editable: true,
    draggable: true
  }
});

proof of concept fiddle

代码 sn-p:

google.maps.event.addDomListener(window, "load", function() {

  var map = new google.maps.Map(document.getElementById("map_div"), {
    center: new google.maps.LatLng(25, -70),
    zoom: 5,
  });

  var triangleCoords = [
    { lat: 25.774, lng: -80.190},
    { lat: 18.466, lng: -66.118},
    { lat: 32.321, lng: -64.757},
    { lat: 25.774, lng: -80.190}
  ];

  var bermudaTriangle = new google.maps.Polygon({
    map: map,
    paths: triangleCoords,
    strokeColor: 'red',
    fillColor: 'red',
    editable: true,
    draggable: true
  });

  bermudaTriangle.setOptions({
    strokeColor: 'blue',
    fillColor: 'blue'
  });

  var drawingManager = new google.maps.drawing.DrawingManager({
    map: map,
    drawingMode: google.maps.drawing.OverlayType.POLYGON,
    drawingControl: false,
    polygonOptions: {
      fillColor: 'red',
      strokeColor: 'red',
      editable: true,
      draggable: true
    }
  });

  drawingManager.setOptions({
    polygonOptions: {
      fillColor: 'blue',
      strokeColor: 'blue',
      editable: true,
      draggable: true
    }
  });

});
html,
body,
#map_div {
  height: 100%;
  width: 100%;
  padding: 0px;
  margin: 0px;
}
<script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?libraries=drawing"></script>
<div id="map_div"></div>

【讨论】:

  • 我的例子是一个简化的案例。在我的实际代码中,我有一个 DrawingManager,但我不知道是否已打开或关闭可编辑或可拖动。我只是想更改 DrawingManager 的颜色,同时保留标志的原始值。这个答案假设我总是希望它们是可编辑和可拖动的。
  • 那么你必须保留对当前状态的引用,并使用它,因为这些参数默认为false
  • 是的,这就是我最终害怕的。只是希望有一种更清洁的方法。谢谢!
  • 这些状态是如何“改变”的?您确实应该提供一个 minimal reproducible example 来演示您原始问题中的实际问题。
  • 对不起,我不确定如何以模拟我所看到的场景的方式编写它。也许如果在创建 DrawingManager 时将可编辑和可拖动标志设置为 Math.random() &gt; 0.5 之类的东西。这样我们就无法知道 DrawingManager 的原始状态,我们只是想将其保存在以下更改颜色的代码中。
猜你喜欢
  • 1970-01-01
  • 2015-10-27
  • 1970-01-01
  • 2011-03-19
  • 2013-02-24
  • 1970-01-01
  • 1970-01-01
  • 2012-08-27
  • 1970-01-01
相关资源
最近更新 更多