将folium地图导出为png格式

26

我正在使用Python、Folium和GeoJSON创建的地图,类似于这个地图

然而,我不想让这张地图成为一个交互式的HTML文档,我宁愿将其导出为PNG或SVG格式。

使用以下语法:

m = folium.Map( # etc..)
m.save("filename.png")

保存文件,但仍为HTML格式,而不是png。如何正确输出指令以呈现非HTML格式的文件?


将HTML转换为图像不是已经解决了吗? - Jongware
5
这个页面似乎有一个使用Selenium的解决方法。 - G. Anderson
谢谢,usr2564301,但将渲染转换为HTML会包括很多放大和元数据,涵盖了我视野之外的地图其他区域。与默认的HTML渲染提供的交互式地图相比,我真的更喜欢直接渲染到我创建的图像。 - Mittenchops
1
@G.Anderson的解决方法在2023年已经不再适用。Selenium在其更新版本中不再包含PhantomJS,这是根据他在链接帖子中的最后一条评论所述。 - Kristen G.
3个回答

29

我使用这个:

...其中m是我的地图对象。 而5是渲染地图所需的时间(秒)。

import io
from PIL import Image

img_data = m._to_png(5)
img = Image.open(io.BytesIO(img_data))
img.save('image.png')

17
需要使用SELENIUM,因此需要在路径中安装web driver。我很高兴找到了这个答案。如果一开始就提到了SELENIUM要求,我就不会费心去用folium了。 - jaromrax
1
如果出现“期望的浏览器二进制文件位置,但无法在默认位置找到二进制文件...”错误,请下载Firefox浏览器。对我来说立即起作用。请注意,PhantomJS解决方案(上面的评论中提供链接)已过时,不再适用。 - Jordan MacLachlan

1
在这种情况下,我发现PrintScreen是一个福音,它是一个一键程序,但您也可以通过使用无头截图模式的浏览器来实现类似的效果。只是手动操作更快。并非所有选项都需要,只是我的过度热衷,因为Edge仅生成/输出固定大小的800x600图像。
"C:\Apps\Browsers\GoogleChrome\GoogleChromePortable.exe" --headless --start-maximized --start-fullscreen --window-size="2000,1000" --hide-scrollbars --virtual-time-budget=5000 --screenshot="c:\Data\MySampleData\screen.png"  "C:\Data\MySampleData\map.html" &&timeout 6 &&screen.png

enter image description here


0

在解决了同样的问题之后,我找到了使用pdfkit、wkthmltopdf和fitz的解决方案,而没有使用SElENIUM或其他需要打开浏览器的工具(我一直在挑战自己,只用我的iPhone / iPad与Google Colab编码):无需SELENIUM将Folium地图转换为PNG

首先,我使用pdfkit将folium地图从HTML转换为PDF,然后使用fitz将PDF转换为PNG,并使用pillow剪切图像。

这很繁琐,但现在对我来说可行。

更多详细信息请参见上面的Colab链接

def convert_map_png(folium_map, file_name):
  mapName = file_name
  
  # Get HTML File of Map
  folium_map.save(mapName + '.html')
  htmlfile = mapName + '.html'

  # Convert Map from HTML to PDF, Delay to Allow Rendering
  options = {'javascript-delay': 500,
    'page-size': 'Letter',
    'margin-top': '0.0in',
    'margin-right': '0.0in',
    'margin-bottom': '0.0in',
    'margin-left': '0.0in',
    'encoding': "UTF-8",
    'custom-header': [
        ('Accept-Encoding', 'gzip')
    ]}
  pdfkit.from_file(htmlfile,  (mapName + '.pdf'), options=options)
  pdffile = mapName + '.pdf'

  # Convert Map from PDF to PNG
  doc = fitz.open(pdffile)
  page = doc.load_page(0)
  pix = page.get_pixmap()
  output = mapName + '.png'
  pix.save(output)
  pngfile = mapName + '.png'
  doc.close()

  # Crop Out Map Image
  pilImage = Image.open(pngfile)
  
  croppedImage = pilImage.crop((0,0,287,287)) # Adjust this if your map renders differently on PDF

  return croppedImage

请在您的答案中添加必要的部分,而不是链接到GitHub解决方案。 - yacc
wkhtmltopdf,不是wkthmltopdf。 - Eran
我一直收到“没有名为'fitz'的模块”的错误提示。当我使用“pip install fitz”时,它会安装一个神经影像包。 - frank

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接