当前位置:   article > 正文

【python】绘制地图:使用Html2Image生成png图片

html2image

原文作者:我辈理想
版权声明:文章原创,转载时请务必加上原文超链接、作者信息和本声明。

Python使用folium制作地图并生成png图片

第一章 folium的方法和类的介绍(思维导图)
第二章 使用folium制作地图
第三章 folium实用功能进阶
第三章 使用Html2Image生成png图片
第四章 使用reportlab制作pdf报告



前言

提示:这里可以添加本文要记录的大概内容:
我讲一下我这个需求的来源,做的项目是一个地理空间查询和使用的系统,通过在前端调用高德地图api创建了一个查询区域,获取区域内的地理数据(数据库)。具体的需求就是,将查询区域和地理数据制作成一个覆盖率分析报告,报告中的其他内容都已完成,但报告中需要展示高德地图、查询区域、地理数据的完整图片这个功能卡了2个星期,主要原因是我对地理空间数据不熟悉,很多python相关库也不清楚,在构建图形的过程中走了很多弯路。
现在将整个实现过程梳理完成,希望对各位同道有帮助,跟其他文章和官网不同,本博客是以使用的优先级来讲解这个库。<我们靠所得来谋生,但靠给予来创造生活>
在这里插入图片描述


一、Html2Image是什么

HTML2Image 是一个轻量级的 Python 包,它充当现有 Web 浏览器无头模式的包装器,从 URL 和 HTML+CSS 字符串或文件生成图像。

大多数 Web 浏览器都有无头模式,这是一种在不显示任何图形界面的情况下运行它们的方法。无头模式主要用于自动测试,但如果您想截取网页的屏幕截图,这些网页与您自己使用浏览器时在屏幕上看到的内容完全相同,也会派上用场。

但是,为了截图,无头模式使用起来不是很方便。HTML2Image旨在隐藏浏览器无头模式的不便,同时添加有用的功能,例如允许从小到一个字符串创建图像。

二、

1.安装和导入库

官网链接:https://pypi.org/project/html2image/

pip install html2image
  • 1

代码如下(示例):

import html2image as hti
  • 1

html2image这个库使用是有前提的,无论是windows、MacOS还是linux系统,都需要安装浏览器,因为本人解读了库的源码,就是用了默认的浏览器(即参数browser=‘chrome’),如果你想自己制定浏览器,需要修改2个参browser和browser_executable。
windows下安装chrome谷歌浏览器很容易,从谷歌官网直接下载安装即可,谷歌官网
linux安装chrome谷歌浏览器需要先下载liunx版安装包,参考链接

2.folium获取html内容

​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')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

3.参数

Html2Image主要有6个参数,

-“browser”:str,可选
+将用于拍摄屏幕截图的浏览器类型。
+默认为Chrome。

-“browser_executable”:str,可选
+浏览器可执行文件的路径。

-“output_path”:str,可选
+保存截图的目录路径。
+默认为当前工作目录。


-“size”:(intint),可选
+屏幕截图的大小。
+默认值为(19201080)。

-“temp_path”:str,可选
+将用于存储临时文件的目录的路径。

-“custom_flags”:strstr的列表,可选
+无头浏览器的其他自定义标志。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

4.将html内容转成png图片

覆盖物就是地理空间常用的数据,包括点线面等,数据有多种来源,可以是数据库读出来、文件读出来的、或者网络传输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')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

总结

提示:这里对文章进行总结:

本博客是以使用的优先级来讲解这个库。<我们靠所得来谋生,但靠给予来创造生活>

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/611058
推荐阅读
相关标签
  

闽ICP备14008679号