【python绘图】python实现地图瓦片拼接
本文介绍了基于Python实现等温图生成的技术方案。由于HTML+JS方案在持续生成图片方面存在困难,最终采用Python开发。关键技术包括:1)使用matplotlib.image加载瓦片图;2)计算瓦片图位置和范围;3)通过坐标转换实现瓦片拼接。相比前端地图框架,Python方案需要手动处理瓦片位置计算和拼接,但更适合自动化生成任务。该方法可用于内网环境下的定时气象数据可视化需求。
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
接到需求:在内网环境下,需要每小时基于水汽数据生成等温图,并使用地形数据作为底图。
最初考虑用HTML+JS编写代码,通过调用地图框架可以轻松实现地图功能。但考虑到需要24小时不间断生成图片,这种依赖浏览器的方案在图片保存和持续生成方面存在困难。最终决定改用Python开发小程序来实现。
实施过程中遇到的主要技术难点是瓦片图的拼接处理。
一、python加载瓦片图的几种方案
1.folium加载地图,生成html,再将其转换为matplotlib可显示的地图
2.matplotlib.image
博主目前仅成功实现了方案二。
二、瓦片图拼接关键技术
整个项目中用到的库
import threading
import datetime
import json
import math
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import geopandas as gpd
from matplotlib.colors import LinearSegmentedColormap
from matplotlib.colors import Normalize
import requests
from shapely.geometry import MultiPolygon
from time import sleep
import matplotlib.image as mpimg
from PIL import Image
1.计算瓦片图所在的位置、范围
根据瓦片图的路径计算瓦片图所在位置,代码如下(示例):
瓦片路径如下图,\7\91\49.png分别对应z\x\y.png
def get_tile_range(self,tile_path, x, y, z):
# 行 列 缩放级别
# 获取瓦片像素尺寸
with Image.open(tile_path) as img:
width, height = img.size
# 计算当前瓦片四角坐标
lat1, lon1 = self.num2deg(x, y, z)
lat2, lon2 = self.num2deg(x + 1, y + 1, z)
return {
'pixel_size': (width, height),
'geo_range': (lon1, lat1, lon2, lat2),
'tile_coord': (x, y, z)
}
2.根据瓦片信息拼接
Matplotlib的imshow要求[xmin, xmax, ymin, ymax]
extent=[tileInfo.get('geo_range')[0],tileInfo.get('geo_range')[2],tileInfo.get('geo_range')[3],tileInfo.get('geo_range')[1]]
ax.imshow(瓦片路径,瓦片范围,origin=‘upper’, alpha=0.9)
代码如下(示例):
def load_Tile(self,x,y,z):
tile_path=f'./data/tile/{z}/{x}/{y}.png'
tileInfo = self.get_tile_range(tile_path, x, y, z)
extent=[tileInfo.get('geo_range')[0],tileInfo.get('geo_range')[2],tileInfo.get('geo_range')[3],tileInfo.get('geo_range')[1]]
tile_img = mpimg.imread(tile_path,'rb')
return (extent, tile_img)
fig, ax = plt.subplots(figsize=(16, 10))
tile = LoadTile().load_Tile(25, 12, 5)
ax.imshow(tile[1], extent=tile[0], origin='upper', alpha=0.9)
最后绘图结果如下图,如果底图比较多,就写个函数遍历瓦片图的文件夹,添加并拼接。加载好底图之后,就能添加各种地理数据曲线、坐标点什么的啦
总结
加载png瓦片图的方式很多,但不像前端,利用地图框架就能轻松展示瓦片图,需要自己去计算瓦片图的位置,进行拼接
更多推荐
所有评论(0)