0

大家好,我正在使用 Python 在传单地图上绘制 DataFrame df 中包含的飞机位置。使用飞机符号创建图标。所以我将所有标记添加到地图中,使用:

    for i in range(0, len(df)):
        ac = Marker(name = df['callsign'][i],
                    location=(df['latitude'][i], df['longitude'][i]), 
                    icon            = icon, 
                    rotation_angle  = float(df['heading'][i]), 
                    rotation_origin = 'center')
        m.add_layer(ac)

对于下一个更新周期,我需要删除这些层(可能多达一百个),但我找不到专门解决需要删除的层的方法,尽管它们是用“名称”字段定义的:

    # remove all the ac symbols before we go into the next loop
    for i in range(0, len(df)):
        m.remove_layer(i)

给出这个错误:

AttributeError                            Traceback (most recent call last)
~\AppData\Local\Temp/ipykernel_18204/2482639859.py in <module>
     71     # remove all the ac symbols before we go into the next loop
     72     for i in range(0, len(df)):
---> 73         m.remove_layer(i)
     74         #print(ac.name)
     75 

~\anaconda3\lib\site-packages\ipyleaflet\leaflet.py in remove_layer(self, rm_layer)
   2152             The layer to remove.
   2153         """
-> 2154         if rm_layer.model_id not in self._layer_ids:
   2155             raise LayerException('layer not on map: %r' % rm_layer)
   2156         self.layers = tuple([layer for layer in self.layers if layer.model_id != rm_layer.model_id])

AttributeError: 'int' object has no attribute 'model_id'

所以看起来我可以以某种方式引用这些层,但找不到如何。任何线索都非常感谢。

4

1 回答 1

0

所以答案如下所示:

    # remove all the ac symbols before we go into the next loop
    # except the first layer because that is the background map
    
    print('There are', len(m.layers), 'layers')
    for i in range(1, len(m.layers)):
        print('Removing layer',i, m.layers[1].name)
        m.remove_layer(m.layers[1])

第 1 层是地图。因为我总是删除第 2 层(索引为 1),所以层总数减一。所以下一个周期我需要再次删除第 2 层(索引为 1)。希望这是有道理的。

然而,这种层的移除非常缓慢......并且在地图上非常明显。这不是一个几乎看不见的更新。嗯……

于 2022-01-31T16:47:06.807 回答