海底暴风雪

富在术数不在劳身,利在局势不在力耕

后端无界面渲染地图,多边形,贴图

用到的技术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静态资源路径,如果是为了性能,最推荐第三种方案

搜索

文章分类