使用小部件更新Gmaps + Jupyter中的标记

时间:2019-02-24 23:56:00

标签: python python-3.x jupyter-notebook

我正在研究gmap,并且正在尝试使用widgets.button刷新gmap标记,但是单击按钮时无法刷新地图。 也许这是一个简单的问题,但我尝试了几个小时却无法解决。 按照我的代码。

  PID,                 STARTED,%CPU,%MEM,COMMAND
    1,Mon Feb 25 00:00:01 2019, 0.0, 0.1,examplecommand1
    2,Mon Feb 25 00:00:01 2019, 0.0, 0.0,examplecommand2
                           (...)

在将“滑块”的值链接到按钮之后,我开始创建窗口小部件。单击按钮时,我需要刷新标记位置。

在on_button_click函数中,我可以看到正在从滑块获取经度和纬度的新闻值,因此我正在更新self.marker,也许我的错误就留在这里了。

Result of code image

1 个答案:

答案 0 :(得分:1)

您的代码存在问题

on_button_click中,您实际上并没有更新标记层。您当前写的是:

self.markers = gmaps.marker_layer([(latitude, longitude)])

但这只是设置类的markers属性。您真正想要做的是在标记层中对一组标记进行突变。您可以做的最简单的更改就是将该行更改为:

self.markers.markers = [gmaps.Marker(location=(latitude, longitude))]

这会更改标记层的markers属性-基本上是标记列表。每次按剧情,都会破坏地图上的标记,并在更新的位置用新标记替换它。

改善您的解决方案

使用marker_layer之类的高级工厂方法可能会掩盖 jupyter-gmaps 在内部使用小部件的方式。为了使它更易于理解,我们来介绍创建一个_create_marker()对象的gmaps.Marker方法:

def _create_marker(self, latitude, longitude):
    return gmaps.Marker(location=(latitude, longitude))

我们现在可以在初始渲染中使用它:

def _render_map(self, latitude, longitude):
    """ Render the initial map """
    brasilia_coordinates = (-15.7934036, -47.8823172)

    fig = gmaps.figure(center=brasilia_coordinates, zoom_level=3)
    self.marker_layer = gmaps.Markers()
    initial_marker = self._create_marker(latitude, longitude)
    self.marker_layer.markers = [initial_marker]  # set the first marker
    fig.add_layer(self.marker_layer)
    return fig

请注意,我已将self.markers重命名为self.marker_layer,以使其清晰可见。

最后,更新代码现在为:

def on_button_clicked(self, _):
    latitude = self.FloatSlider1.value
    longitude = self.FloatSlider2.value

    # look how closely the following two lines match the construction code
    new_marker = self._create_marker(latitude, longitude)
    self.marker_layer.markers = [new_marker]