第一章 使用folium制作地图
第二章 使用Html2Image生成png图片
第三章 使用reportlab制作pdf报告
提示:这里可以添加本文要记录的大概内容:
我讲一下我这个需求的来源,做的项目是一个地理空间查询和使用的系统,通过在前端调用高德地图api创建了一个查询区域,获取区域内的地理数据(数据库)。具体的需求就是,将查询区域和地理数据制作成一个覆盖率分析报告,报告中的其他内容都已完成,但报告中需要展示高德地图、查询区域、地理数据的完整图片这个功能卡了2个星期,主要原因是我对地理空间数据不熟悉,很多python相关库也不清楚,在构建图形的过程中走了很多弯路。
现在将整个实现过程梳理完成,希望对各位同道有帮助,跟其他文章和官网不同,本博客是以使用的优先级来讲解这个库。<我们靠所得来谋生,但靠给予来创造生活>
HTML2Image 是一个轻量级的 Python 包,它充当现有 Web 浏览器无头模式的包装器,从 URL 和 HTML+CSS 字符串或文件生成图像。
大多数 Web 浏览器都有无头模式,这是一种在不显示任何图形界面的情况下运行它们的方法。无头模式主要用于自动测试,但如果您想截取网页的屏幕截图,这些网页与您自己使用浏览器时在屏幕上看到的内容完全相同,也会派上用场。
但是,为了截图,无头模式使用起来不是很方便。HTML2Image旨在隐藏浏览器无头模式的不便,同时添加有用的功能,例如允许从小到一个字符串创建图像。
官网链接:https://pypi.org/project/html2image/
pip install html2image
代码如下(示例):
import html2image as hti
html2image这个库使用是有前提的,无论是windows、MacOS还是linux系统,都需要安装浏览器,因为本人解读了库的源码,就是用了默认的浏览器(即参数browser=‘chrome’),如果你想自己制定浏览器,需要修改2个参browser和browser_executable。
windows下安装chrome谷歌浏览器很容易,从谷歌官网直接下载安装即可,谷歌官网。
linux安装chrome谷歌浏览器需要先下载liunx版安装包,参考链接。
folium是js上著名的地理信息可视化库leafet.js为Python提供的接口,通过它,我们获取了html的内容,数据格式我们转成了str。
import folium
def map2png(map_data,out_file='pdf.png'):
# 1.直接构造,默认底图
mo = folium.Map(location=[0, 0])
# 添加一个点
folium.Marker(
location=[45.3311, -121.7113],
popup="Timberline Lodge",
icon=folium.Icon(color="green"),).add_to(m)
# 添加一个线形
folium.PolyLine(
locations=[[38.68,115.67],
[38.85,115.48],
[38.65,115.37],
[38.68,115.67]],
color='green', weight=2, opacity=1).add_to(m)
# 添加一个面
folium.Polygon(
locations=[[38.68,115.67],
[38.85,115.48],
[38.65,115.37],
[38.68,115.67]],
color='green', weight=2,
fill=True,fill_color = 'red').add_to(mo)
mo.fit_bounds([[38.68,115.67],
[38.85,115.48],
[38.65,115.37],
[38.68,115.67]]) # 根据范围缩放地图
root = mo.get_root()
html = root.render() # 这个拿到的就是一个html的内容
# mo.save('text.html')
Html2Image主要有6个参数,
-“browser”:str,可选
+将用于拍摄屏幕截图的浏览器类型。
+默认为Chrome。
-“browser_executable”:str,可选
+浏览器可执行文件的路径。
-“output_path”:str,可选
+保存截图的目录路径。
+默认为当前工作目录。
-“size”:(int,int),可选
+屏幕截图的大小。
+默认值为(1920、1080)。
-“temp_path”:str,可选
+将用于存储临时文件的目录的路径。
-“custom_flags”:str或str的列表,可选
+无头浏览器的其他自定义标志。
覆盖物就是地理空间常用的数据,包括点线面等,数据有多种来源,可以是数据库读出来、文件读出来的、或者网络传输geojson等。
import folium
import os
from pathlib import Path
from html2image import Html2Image
def map2png(map_data,out_file='pdf.png'):
# 1.直接构造,默认底图
mo = folium.Map(location=[0, 0])
# 添加一个点
folium.Marker(
location=[45.3311, -121.7113],
popup="Timberline Lodge",
icon=folium.Icon(color="green"),).add_to(m)
# 添加一个线形
folium.PolyLine(
locations=[[38.68,115.67],
[38.85,115.48],
[38.65,115.37],
[38.68,115.67]],
color='green', weight=2, opacity=1).add_to(m)
# 添加一个面
folium.Polygon(
locations=[[38.68,115.67],
[38.85,115.48],
[38.65,115.37],
[38.68,115.67]],
color='green', weight=2,
fill=True,fill_color = 'red').add_to(mo)
mo.fit_bounds([[38.68,115.67],
[38.85,115.48],
[38.65,115.37],
[38.68,115.67]]) # 根据范围缩放地图
root = mo.get_root()
html = root.render() # 这个拿到的就是一个html的内容
# mo.save('text.html')
# 2.使用Html2Image将地图html文件转成png
base = Path(__file__).resolve().parent
# 以下为Html2Image参数的2中写法,custom_flags参数是网页生成后延迟10秒生成图片(地图加载慢,眼部就会出现空白方块,output_path 是文件生成后存储的文件夹,screenshot为生成图片的方法)
hti = Html2Image(custom_flags=['--virtual-time-budget=10000', '--hide-scrollbars'])
hti.output_path = os.path.join(base, 'map_png')
hti.screenshot(html_str=str(html), save_as='test.png')
提示:这里对文章进行总结:
本博客是以使用的优先级来讲解这个库。<我们靠所得来谋生,但靠给予来创造生活>