Python 更新GMAP中的标记+;使用小部件的Jupyter
我正在学习gmap,我正在尝试使用widgets.button刷新gmap标记,但当我点击按钮时无法刷新地图。 也许这是一个简单的问题,但我试了几个小时,还是解决不了。 遵循我的代码Python 更新GMAP中的标记+;使用小部件的Jupyter,python,python-3.x,jupyter-notebook,Python,Python 3.x,Jupyter Notebook,我正在学习gmap,我正在尝试使用widgets.button刷新gmap标记,但当我点击按钮时无法刷新地图。 也许这是一个简单的问题,但我试了几个小时,还是解决不了。 遵循我的代码 from IPython.display import display import ipywidgets as widgets import gmaps gmaps.configure(api_key='') class AcledExplorer(object): """ Jupyter
from IPython.display import display
import ipywidgets as widgets
import gmaps
gmaps.configure(api_key='')
class AcledExplorer(object):
"""
Jupyter widget for exploring the ACLED dataset.
The user uses the slider to choose a year. This renders
a heatmap of civilian victims in that year.
"""
def __init__(self):
self.marker_locations = [(None, None)]
self._slider = None
self._slider2 = None
title_widget = widgets.HTML(
'<h3>MY TEST, my test</h3>'
'<h4>test1 <a href="https://www.test.com/">ACLED project</a></h4>'
)
map_figure = self._render_map(-15.7934036, -47.8823172)
control = self._render_control()
self._container = widgets.VBox([title_widget, control, map_figure])
def render(self):
display(self._container)
def on_button_clicked(self, b):
latitude = self.FloatSlider1.value
longitude = self.FloatSlider2.value
print("Button clicked.")
self.markers = gmaps.marker_layer([(latitude, longitude)])
return self._container
def _render_control(self):
""" Render the widgets """
self.FloatSlider1 = widgets.FloatSlider(
value=-15.8,
min=-34,
max=4.5,
step=0.2,
description='Latitude:',
disabled=False,
continuous_update=False,
orientation='horizontal',
readout=True,
readout_format='.1f',
)
self.FloatSlider2 = widgets.FloatSlider(
value=-47.9,
min=-74,
max=-33,
step=0.2,
description='Longitude:',
disabled=False,
continuous_update=False,
orientation='horizontal',
readout=True,
readout_format='.1f',
)
self.button = widgets.Button(
description="Plot!"
)
self.button.on_click(self.on_button_clicked)
controls = widgets.VBox(
[self.FloatSlider1, self.FloatSlider2, self.button])
return controls
def _render_map(self, latitude, longitude):
""" Render the initial map """
self.marker_locations = [(latitude, longitude)]
brasilia_coordinates = (-15.7934036, -47.8823172)
fig = gmaps.figure(center=brasilia_coordinates, zoom_level=3)
self.markers = gmaps.marker_layer(self.marker_locations)
fig.add_layer(self.markers)
return fig
AcledExplorer().render()
从IPython.display导入显示
将IPyWidget作为小部件导入
进口gmap
配置(api_键=“”)
类对象(对象):
"""
用于探索ACLED数据集的Jupyter小部件。
用户使用滑块选择年份。这将渲染
那一年平民受害者的热图。
"""
定义初始化(自):
self.marker_locations=[(无,无)]
self.\u滑块=无
self.\u slider2=无
title\u widget=widgets.HTML(
“我的测试,我的测试”
“测试1”
)
映射图=自映射图(-15.7934036,-47.8823172)
控件=自身。_render_control()
self.\u container=widgets.VBox([title\u widget,control,map\u figure])
def渲染(自):
显示器(自身容器)
def on_按钮_点击(自身,b):
纬度=self.FloatSlider1.value
经度=self.FloatSlider2.value
打印(“单击按钮”)
self.markers=gmaps.marker_层([(纬度、经度)])
返回自.\u容器
def_渲染_控件(自):
“”“呈现小部件”“”
self.FloatSlider1=widgets.FloatSlider(
值=-15.8,
最小值=-34,
最大值=4.5,
阶跃=0.2,
description='lation:',
禁用=错误,
持续更新=错误,
“水平”方向,
读数=真,
读数_格式='.1f',
)
self.FloatSlider2=widgets.FloatSlider(
值=-47.9,
最小值=-74,
最大值=-33,
阶跃=0.2,
description='Longitude:',
禁用=错误,
持续更新=错误,
“水平”方向,
读数=真,
读数_格式='.1f',
)
self.button=widgets.button(
description=“绘图!”
)
self.button.on_单击(self.on_按钮已单击)
控件=widgets.VBox(
[self.FloatSlider1、self.FloatSlider2、self.button])
返回控件
定义渲染地图(自身、纬度、经度):
“”“渲染初始贴图”“”
self.marker_locations=[(纬度、经度)]
巴西利亚坐标=(-15.7934036,-47.8823172)
图=gmaps。图(中心=巴西利亚坐标,缩放级别=3)
self.markers=gmaps.marker\u层(self.marker\u位置)
图添加_层(自标记)
返回图
AcledExplorer().render()
在将值从滑块链接到按钮之后,我开始创建小部件。我需要刷新标记位置时,点击按钮
在函数on_按钮_单击,我可以看到纬度和经度的新闻值正在从滑动条获取,所以我正在更新self.marker,可能我的错误留在这里
您的代码有问题
在按钮上单击,实际上并不是在更新标记层。你现在写:
self.markers=gmaps.marker\u层([(纬度、经度)])
但这只是设置类的标记
属性。实际上,您要做的是在标记层中对标记集进行变异。您可以进行的最简单更改是将该行更改为:
self.markers.markers=[gmaps.Marker(位置=(纬度、经度))]
这会改变标记层的markers
属性,基本上就是标记列表。每次按“绘图”键时,它都会销毁地图上的标记,并在更新的位置用新标记替换
改进您的解决方案
使用诸如marker\u layer
之类的高级工厂方法可能会模糊jupyter GMAP如何在内部使用小部件。为了让它更容易理解,让我们介绍一个\u create\u marker()
方法来创建gmaps.marker
对象:
def\u创建标记(自身、纬度、经度):
返回gmaps.Marker(位置=(纬度、经度))
现在,我们可以在初始渲染中使用此选项:
def_渲染_地图(自身、纬度、经度):
“”“渲染初始贴图”“”
巴西利亚坐标=(-15.7934036,-47.8823172)
图=gmaps。图(中心=巴西利亚坐标,缩放级别=3)
self.marker_layer=gmaps.Markers()
初始标记=自身。创建标记(纬度、经度)
self.marker_layer.markers=[initial_marker]#设置第一个标记
图添加_层(自标记_层)
返回图
请注意,我已将self.markers
重命名为self.marker\u层
,以明确它是一个层
最后,更新代码现在是:
def on_按钮_单击(self,u):
纬度=self.FloatSlider1.value
经度=self.FloatSlider2.value
#查看以下两行与构造代码的匹配程度
新建标记=自身。创建标记(纬度、经度)
self.marker\u layer.markers=[新的\u标记]
Hi Pascal,tnx非常感谢您的快速帮助。我还在努力,但我解决不了我的问题。根据您的建议,我无法运行脚本,因为:self.marker_layer=gmaps.Markers()gmaps.Markers()正在请求位置参数。这很奇怪,因为在文档中不需要标记()位置。错误在于:markers实例的“markers”特征必须是长度为1的抱歉--我在\u render\u map
方法中输入了一个错误。我编辑过。如果您有任何问题,请告诉我。我根本不需要更改gmap.Markers
调用。您使用的是哪个版本的gmaps
?(gmaps.\uuuuu版本\uuuuuu
)对不起,帕斯卡,也许我的问题是我的环境。我无法运行line-self.marker\u layer=gmaps.Markers()
。部分错误:…-->18 map\u figure=self.\u render\u map(-15.7934036,-47.8823172)--->79 self.marker\u layer=gmap