我正在使用Python、Folium和GeoJSON创建的地图,类似于这个地图。
然而,我不想让这张地图成为一个交互式的HTML文档,我宁愿将其导出为PNG或SVG格式。
使用以下语法:
m = folium.Map( # etc..)
m.save("filename.png")
保存文件,但仍为HTML格式,而不是png。如何正确输出指令以呈现非HTML格式的文件?
我正在使用Python、Folium和GeoJSON创建的地图,类似于这个地图。
然而,我不想让这张地图成为一个交互式的HTML文档,我宁愿将其导出为PNG或SVG格式。
使用以下语法:
m = folium.Map( # etc..)
m.save("filename.png")
保存文件,但仍为HTML格式,而不是png。如何正确输出指令以呈现非HTML格式的文件?
我使用这个:
...其中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')
"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
在解决了同样的问题之后,我找到了使用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