Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.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 Folium:将GeoJson添加到地图时的颜色映射_Python_Folium - Fatal编程技术网

Python Folium:将GeoJson添加到地图时的颜色映射

Python Folium:将GeoJson添加到地图时的颜色映射,python,folium,Python,Folium,我的python代码中有一个循环,它将特性添加到我的folium映射中。每个功能都保存在一个字典(称为产品)中,每个功能都有一个参数字典(GeoJson字符串和属性)。我想根据其中一个参数为特征着色 我首先为参数创建一个唯一值列表。然后将颜色映射到每个唯一值: orb_list = [value['relativeorbitnumber'] for key, value in products.items()] orb_list = list(set(orb_list)) color_cycl

我的python代码中有一个循环,它将特性添加到我的folium映射中。每个功能都保存在一个字典(称为产品)中,每个功能都有一个参数字典(GeoJson字符串和属性)。我想根据其中一个参数为特征着色

我首先为参数创建一个唯一值列表。然后将颜色映射到每个唯一值:

orb_list = [value['relativeorbitnumber'] for key, value in products.items()]
orb_list = list(set(orb_list))

color_cycle = cycler(color=['#8e0038', '#8e0073', '#59008e'], fillColor=['#8e0038', '#8e0073', '#59008e'])

orb_colors=dict([[i, sty] for i, sty in zip(orb_list, cycle(color_cycle))])
接下来,我创建一个循环,在其中检索与特征的参数值相对应的颜色和fillColor,并在style_函数中使用它:

for key,value in products.items():
    footprint = json.dumps(wkt.loads(products[key]['footprint']))
    fillColor = orb_colors[products[key]['relativeorbitnumber']]['fillColor']
    color = orb_colors[products[key]['relativeorbitnumber']]['color']
    feat = folium.GeoJson(footprint,
               style_function=lambda x: {'fillColor':fillColor,'color':color},
               highlight_function=lambda feature: {'fillcolor':'green','color':'green'},
               name='Footprint')

    feat.add_to(mapa)

我认为这会起作用,但是所有的特性似乎都是由循环中最后的“fillColor”和“color”着色的。有人能解释为什么会这样吗?我假设在所有循环完成之前不会渲染特征,因此“color”和“fillColor”的最后值将用于所有特征。你能建议如何修改我的代码来解决这个问题吗?或者,我的做法可能完全错误,您可以建议一种更干净的方法?

您在Python中遇到了一个常见的陷阱

您传递给的函数,例如
style_函数
不会在循环中立即执行,而是稍后执行。此时,
fillColor
将从外部作用域中检索(因为它没有在
lambda
表达式创建的内部作用域中定义),此时它将具有最后一个值

要演示正在发生的事情,请执行以下操作:

In [1]: out = []
   ...: for k in ('a', 'b', 'c'):
   ...:     l = lambda: k
   ...:     out.append(l)
   ...: [l() for l in out]
Out[1]: ['c', 'c', 'c']
为了防止出现这种情况,可以将变量的(当前)值作为一个参数传递给lambda表达式创建的函数,以便在以后执行函数时使用该值:

In [2]: out = []
   ...: for k in ('a', 'b', 'c'):
   ...:     l = lambda k=k: k
   ...:     out.append(l)
   ...: [l() for l in out]
Out[2]: ['a', 'b', 'c']
或者在您的代码中:

for key, value in products.items():
    footprint = json.dumps(wkt.loads(products[key]["footprint"]))
    fillColor = orb_colors[products[key]["relativeorbitnumber"]]["fillColor"]
    color = orb_colors[products[key]["relativeorbitnumber"]]["color"]
    feat = folium.GeoJson(
        footprint,
        style_function=lambda x, fillColor=fillColor, color=color: {
            "fillColor": fillColor,
            "color": color,
        },
        highlight_function=lambda feature: {"fillcolor": "green", "color": "green"},
        name="Footprint",
    )

    feat.add_to(mapa)
这应该可以解决问题