已知:图片尺寸大小(比如宽700dpi,高600dpi),绘图范围(比如经度102-105、纬度33-35)或者需要绘图的geopandas几何数据。
目的:计算合适的缩放级别zoom,能将范围内的几何要素全部展现的图片上,并尽可能的展现更多地图细节。
步骤:1、获取本机电脑显示屏的分辨率和实际物理尺寸,并计算每个DPI对应的实际物理尺寸;
2、计算图片尺寸所对应的实际物理尺寸(单位mm);
3、计算最大最小经度距离m,和最大最小纬度距离(单位m);
4、计算图片尺寸宽度、高度与经纬度距离m的缩放比例,并取最大缩放比例为参考值r;
5、对照天地图各个缩放级别的比例尺,最终确定合适的缩放级别zoom。
具体的代码如下,代码中都给出了详细的注释。
import tkinter as tk
from geopy import distance
import geopandas as gpd
def cal_tianditu_zoom(self,myw=700,myh=600,eqigdf=None):
'''
myw 设定窗口大小宽度dpi,
myh 设定窗口大小高度dpi
eqigdf 要在地图上绘制几何要素的geopandas,用于计算经纬度范围
'''
myw=myw-20
myh=myh-20
#计算要绘图的长和宽,单位米
if eqigdf.shape[0]>3:
eqigdf=eqigdf.tail(3).copy()#取最后3行
gdfbox=eqigdf.total_bounds#GeoSeries.bounds 数列中包含的几何图形的界限
#print(gdfbox)
p0=(gdfbox[1],gdfbox[0])#左下
p1=(gdfbox[3],gdfbox[0])#左上
p2=(gdfbox[1],gdfbox[2])#右下
ph=int(distance.distance(p0,p1).m)
pw=int(distance.distance(p0,p2).m)
#print('地图范围宽高/m:',pw,ph)
#获取PC屏幕参数
root = tk.Tk()
width_px = root.winfo_screenwidth() #px像素
height_px = root.winfo_screenheight()
width_mm = root.winfo_screenmmwidth() #屏幕宽度mm
height_mm = root.winfo_screenmmheight() # 2.54 cm = in
width_in = width_mm / 25.4 #mm毫米转为英寸in
height_in = height_mm / 25.4
width_dpi = width_px/width_in #屏幕分辨率dpi
height_dpi = height_px/height_in
#像素 = 厘米 * ( dpi 或 ppi / 2.54 )
h_mm=(myh/height_dpi)*10#屏幕绘图区域实际高度mm
w_mm=(myw/width_dpi)*10
#print('屏幕绘图区域宽度和高度mm:',w_mm,h_mm)
#计算比例尺
r_w=pw*1000/w_mm
r_h=ph*1000/h_mm
#print('宽高比例尺',r_w,r_h)
if r_w>=r_h:
r=r_w
else:
r=r_h
#print('取最大比例尺',r)
mydict={"1":295829355.45456564,'2':147914677.72728282,'3':73957338.863641411,'4':36978669.431820706,\
'5':18489334.715910353,'6':9244667.3579551764,'7':4622333.6789775882,'8':2311166.8394887941,\
'9':1155583.419744397,'10':577791.70987219852,'11':288895.85493609926,'12':144447.92746804963,\
'13':72223.963734024815,'14':36111.981867012408,'15':18055.990933506204,'16':9027.9954667531019,\
'17':4513.997733376551,'18':2256.9988666882755,'19':1128.4994333441377,'20':564.24971667206887}
for key,value in mydict.items():
if r>value:
zoom=int(key)
break
print('缩放级别',zoom)
return(zoom)