【问题标题】:How do I create a popup on folium map using data from json file?如何使用 json 文件中的数据在 folium 地图上创建弹出窗口?
【发布时间】:2020-06-19 20:20:04
【问题描述】:

如何在我的 folium 地图上创建一个弹出窗口以显示有关节点的信息?如下图所示,我的folium 地图目前正在从我从overpass turbo 下载的json 文件中绘制数据。因此地图上建筑物的蓝色轮廓。我无法创建一个弹出窗口,这样当用户点击建筑物时,会出现一个弹出窗口来显示信息,就像在立交桥涡轮中一样。目前,我正在尝试检索下的所有信息 “属性”,但我的代码什么也没做,因为当我试图点击建筑物而不是弹出窗口时,点击地图只会放大。

*PS 我当前的 GUI 是基于我发布的另一个问题提供给我的答案“How to include folium map into PyQt5 application window?

大叶地图

代码

 with open('exportBuildings.geojson') as access_json:
            read_content = json.load(access_json)

 feature_access = read_content['features']


# Creating folium map
for feature_data in feature_access:
            buildingName = feature_data['properties']

m = folium.Map(location=[1.400150, 103.910172], titles="Punggol", zoom_start=17)
nodeData = os.path.join('exportFULL.geojson')
folium.GeoJson(nodeData).add_child(folium.Popup(buildingName))
folium.GeoJson(nodeData).add_to(m)
data = io.BytesIO()
m.save(data, close_file=False)
self.view.setHtml(data.getvalue().decode())

JSON 格式

"type": "Feature",
  "properties": {
    "@id": "way/768461439",
    "building": "train_station",
    "layer": "1",
    "name": "Damai LRT",
    "wikidata": "Q7313275",
    "wikipedia": "en:Damai LRT station"
  },

【问题讨论】:

    标签: python pyqt5 folium


    【解决方案1】:

    说明:

    问题是您正在创建 2 个 GeoJSON 项目:

    folium.GeoJson(nodeData).add_child(folium.Popup(buildingName))
    folium.GeoJson(nodeData).add_to(m)

    在第一个中,您将弹出窗口添加为子项但未将其添加到地图中,在第二个中将其添加到地图中但没有弹出窗口,即在没有弹出的地图。

    解决办法:

    解决方案是只创建一个GeoJson,其中添加项目并将弹出窗口建立为子项:

    geo_json = folium.GeoJson(nodeData)
    geo_json.add_child(folium.Popup(buildingName))
    geo_json.add_to(m)
    

    利用返回相同项目的 add_to() 和 add_child() 属性可以简化为:

    folium.GeoJson(nodeData).add_to(m).add_child(folium.Popup(buildingName))
    

    或者

    folium.GeoJson(nodeData).add_child(folium.Popup(buildingName)).add_to(m)
    

    【讨论】:

    • 非常感谢您提供的信息。现在每个建筑物都是可点击的。但是,弹出框是空的。可能是因为我的 json 文件?
    • @DeniseTay 如果弹出窗口为空,那么唯一的原因是 buildingName 是一个空字符串。将 folium.Popup(buildingName) 更改为 folium.Popup("Hello World")
    • buildingName 不是空字符串,因为我已经通过打印 buildingName 进行了尝试,它返回了属性下的所有信息
    • @DeniseTay 尝试:folium.Popup(str(buildingName))
    • 哦,它有效。谢谢。只是检查,即使我可以单击所有建筑物并显示信息。我注意到所有建筑物都有相同的信息。是因为我的 for 循环吗?即从 json 文件中检索数据
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    • 2016-11-05
    相关资源
    最近更新 更多