Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 更新GMAP中的标记+;使用小部件的Jupyter_Python_Python 3.x_Jupyter Notebook - Fatal编程技术网

Python 更新GMAP中的标记+;使用小部件的Jupyter

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

我正在学习gmap,我正在尝试使用widgets.button刷新gmap标记,但当我点击按钮时无法刷新地图。 也许这是一个简单的问题,但我试了几个小时,还是解决不了。 遵循我的代码

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