富在术数不在劳身,利在局势不在力耕
用到的技术folium
,playwright
使用folium
渲染出地图
import folium
from folium import TileLayer
def create_map_html(polygons ):
# 不同的地图服务
custom_tile_layer_url = 'http://t0.tianditu.gov.cn/img_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=img&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk=天地图申请的token'
# 拿到全部坐标的极值
min_lat = min(coord[1] for polygon in polygons for coord in polygon)
min_lon = min(coord[0] for polygon in polygons for coord in polygon)
max_lat = max(coord[1] for polygon in polygons for coord in polygon)
max_lon = max(coord[0] for polygon in polygons for coord in polygon)
# 极值坐标
bbox = [[min_lon, min_lat], [max_lon, max_lat]]
# 创建Folium地图并设置缩放级别
m = folium.Map(location=[(min_lat + max_lat) / 2, (min_lon + max_lon) / 2], tiles=custom_tile_layer_url, attr='0')
m.fit_bounds(bbox)
# 循环添加多边形图层,并添加到地图
for polygon in polygons:
polygon_layer = folium.Polygon(locations=polygon, color='yellow', fill=True, fill_opacity=0.6)
polygon_layer.add_to(m)
# 保存生成的地图
m.save('map.html')
至此,直接在浏览器打开html就可以看到地图渲染效果,
后台生成html的截图,提示:(为了加快速度,可以使用本地资源)。
保存图片使用的是无界面浏览器技术,好处是可以统一截图的大小,样式可以针对性的适配。
with sync_playwright() as p:
browser = p.chromium.launch(headless=True) # 启动 Headless Chrome
page = browser.new_page()
# 设置自定义请求头
custom_headers = {
'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Mobile Safari/537.36',
}
page.set_extra_http_headers(custom_headers)
# file_dir = "www.baidu.com"
print(file_dir)
print(f"Attempting to navigate to URL: {file_dir}")
# 打开本地网页
page.goto(f"file://{file_dir}")
page.wait_for_load_state("load")
# 截图网页
page.screenshot(path=BASE_DIR+f'/{name}.png') # 截图保存为 screenshot.png
# 如果为了性能,可以适当复用逻辑,减少资源的申请和释放的资源消耗
browser.close()
写在最后,科学上网问题。
在网页渲染时,需要进行科学上网,这里有三种方案,第一种是使用国内的CDN对静态资源进行加载,第二种方案是使用静态资源的国内镜像站,第三种是将静态资源下载到本地,并更改生成的html静态资源路径,如果是为了性能,最推荐第三种方案
文章分类