使用 Python 使 Folium 工具提示换行

Make Folium tooltips wrap text using Python

我正在使用 Folium 创建交互式 Leaflet 地图。我的地图有 运行 屏幕外的工具提示。如何将文本框设置为换行?一个建议是创建一个独立的 CSS 文件并以这种方式修改 HTML 输出,但我宁愿在 Python 中这样做。

我的代码和图片如下:

import folium
from folium.plugins import MarkerCluster

m = folium.Map(location=df[["lat", "lon"]].mean().to_list(), zoom_start=4)
title_html = '''
              <h3 align="center" style="font-size:16px"><b>{}</b></h3>
             '''.format(f'Russian Oligarch Real Estate Transactions/investments')

marker_cluster = MarkerCluster().add_to(m)

for i,r in df.iterrows():
    location = (r["lat"], r["lon"])
    info = (r['Name'],r['Full_Address'],r['Oligarch_Description'])
    info = list(info)
    new_line = '<br>'
    bold_start = '<strong>'
    bold_end = '</strong>'
    text = f'Name: {bold_start}{info[0]}{bold_end}{new_line} \
    Address: {bold_start}{info[1]}{bold_end}{new_line}Brief Bio: \
    {bold_start}{info[2]}{bold_end}'
    folium.Marker(location=location,
                      tooltip=text)\
    .add_to(marker_cluster)

m.get_root().html.add_child(folium.Element(title_html))

m

我不知道这是否能解决问题,但您可以在 Python 中使用 string-functions 来包装它。

您可以用 <br> 替换每个点 - 这样每个句子都会换行

text = text.replace(". ", ". <br>")

或者您可以分成 50 个字符的行,然后使用 <br>

重新加入
import textwrap

desc = r['Oligarch_Description']

splited = textwrap.wrap(desc, 50)

desc = '<br>'.join(splitted)

print(desc)

设备 480x320 的屏幕截图(使用 Firefox Ctrl+Shift+M


完整的工作代码,代码中包含示例数据。

它保存在文件中并在浏览器中打开(我运行它作为普通脚本,而不是Jupyter)。

import folium
from folium.plugins import MarkerCluster

import pandas as pd
import webbrowser
import textwrap

df = pd.DataFrame({
  'lat':[55],
  'lon': [38],
  'Name': ['Ivan'],
  'Full_Address': ['Moscow'],
  'Oligarch_Description': ["Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."],
})    

m = folium.Map(location=df[["lat", "lon"]].mean().to_list(), zoom_start=4)

title = 'Russian Oligarch Real Estate Transactions/investments'
title_html = '<h3 align="center" style="font-size:16px"><b>{}</b></h3>'.format(title)

marker_cluster = MarkerCluster().add_to(m)

for i, r in df.iterrows():
    location = (r["lat"], r["lon"])
    
    desc = r['Oligarch_Description']
    #desc = desc.replace('. ', '. <br>')
    desc = '<br>'.join(textwrap.wrap(desc, 50))
    print(desc)
    
    text = f"Name: <strong>{r['Name']}</strong></br> \
Address: <strong>{r['Full_Address']}</strong></br> \
Brief Bio:<br> \
<strong>{desc}</strong>"
    
    folium.Marker(location=location, tooltip=text).add_to(marker_cluster)

m.get_root().html.add_child(folium.Element(title_html))

m.save('folim.html')
webbrowser.open('folim.html')