【问题标题】:Display multiple images on multiple points using folium popup使用 folium 弹出窗口在多个点上显示多个图像
【发布时间】:2022-01-14 11:55:33
【问题描述】:

我想绘制我的点数据并通过我的 folium 地图上的弹出窗口显示独特的图像。我有 67 个地块,每个地块都分配了不同的图像。

我有一个geopandas 点数据框,其属性Path 链接到相关图像路径,即:C:/Users/Documents/GIS/Untitled Folder/photo1.jpg

我想创建一个循环来读取“图像路径”并在弹出窗口中为每个位置绘制相关图像。

我已将我的文件导入为.shpPhotos 是我的数据框。

locations1 = Photos[['Y', 'X']]
locationlist1 = locations1.values.tolist()

path=Photos[['Path']]
pathlist=path.values.tolist()

for point in range(0, len(locationlist1)):
   png=Photos[pathlist].format()
   encoded = base64.b64encode(open(png, 'rb').read())
   html = '<img src="data:image/png;base64,{}">'.format
   iframe = IFrame(html(encoded.decode('UTF-8')), width=400, height=350)
   popup = folium.Popup(iframe, max_width=400)
   folium.Marker(locationlist1[point], tooltip=html, popup = pathlist[popup], icon=folium.Icon(color = 'purple')).add_to(m)

m

我知道在我的 for 循环中我需要指向图像路径,但不确定如何读取每个点的文件路径。

【问题讨论】:

    标签: python dataframe popup geopandas folium


    【解决方案1】:
    • 创建一个工作的独立代码
      1. 世界的源标志
      2. 自然地球低分辨率用于几何
    • 用于文件中的每个国家/地区源标志。编码使其在 HTML 元素中工作
    • 为编码图像创建标记和弹出窗口

    源图像文件

    • 获取世界旗帜
    import kaggle.cli
    import sys, requests, urllib
    import pandas as pd
    from pathlib import Path
    from zipfile import ZipFile
    
    # fmt: off
    # download data set
    url = "https://www.kaggle.com/zhongtr0n/country-flag-urls"
    sys.argv = [sys.argv[0]] + f"datasets download {urllib.parse.urlparse(url).path[1:]}".split(" ")
    kaggle.cli.main()
    zfile = ZipFile(f'{urllib.parse.urlparse(url).path.split("/")[-1]}.zip')
    dfs = {f.filename: pd.read_csv(zfile.open(f)) for f in zfile.infolist()}
    # fmt: on
    
    f = Path.cwd().joinpath("flags")
    if not f.exists():
        f.mkdir()
    
    for r in dfs["flags_iso.csv"].iterrows():
        flag_file = f.joinpath(f'{r[1]["Alpha-3 code"]}.gif')
        if not flag_file.exists():
            r = requests.get(r[1]["URL"], stream=True, headers={"User-Agent": "XY"})
            with open(flag_file, "wb") as fd:
                for chunk in r.iter_content(chunk_size=128):
                    fd.write(chunk)
    
    
    

    解决方案

    import folium
    import base64, io
    import geopandas as gpd
    from PIL import Image
    
    world = gpd.read_file(gpd.datasets.get_path("naturalearth_lowres"))
    # change to centroid
    world["geometry"] = world["geometry"].centroid
    # define image path for each row
    img_d = Path.cwd().joinpath("flags")
    world["path"] = world["iso_a3"].apply(lambda c: str(img_d.joinpath(f"{c}.gif")))
    
    # create folium map
    m = world.explore()
    
    # create markers with popups
    for _, r in world.iterrows():
        lat = r['geometry'].y
        lon = r['geometry'].x
        path = r["path"]
        
        try:
            b = io.BytesIO()
            im = Image.open(path) # Your image here!
            im.save(b, format='PNG')
            b64 = base64.b64encode(b.getvalue())
            folium.Marker(location=[lat, lon], 
                          popup=f'<img src="data:image/png;base64,{ b64.decode("utf-8") }">').add_to(m)
        except FileNotFoundError as e:
            pass
    m
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-26
      • 2017-10-28
      • 1970-01-01
      • 2021-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多