如何用python出图,带色带,矢量边界

首先,使用程序出图适用于大批量的出图要求。出图的效果如下:
如何用python出图,带色带,矢量边界_第1张图片
需要有我们的tif图层叠加,并且给他加上颜色。需要添加我们的矢量边界。(后边的文章分享鹰眼图加南海九段线)
首先,使用Python出图,要用到的重要的包有cartopy,具体怎么下载可以搜搜其他博客,这里不再赘述。
其次,由于调的包很多,建议在使用如jupyter lab之类的东西时,先单独import 一下,如下:
如何用python出图,带色带,矢量边界_第2张图片
不然有可能遇到内核崩了的情况,我在单独先import成功之后能够很好的解决这个问题。所以建议大家把cartopy单独先import,以免有问题。
以下是代码:

import cartopy
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
import cmaps
import numpy as np
import os
from osgeo import gdal
import cartopy.crs as ccrs
from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatter
import cartopy.io.shapereader as shpreader
from matplotlib.ticker import MultipleLocator,FuncFormatter
from matplotlib import rcParams
config = {
    "font.family":'Times New Roman',  # 设置字体类型
    "font.size": 16,
#     "mathtext.fontset":'stix',
}
rcParams.update(config)

dir_in1=r'E:\tif_in'
dir_out=r'E:\png'
file_list=os.listdir(dir_in1)#这里为了批量出图,得到tif路径下的所有文件
lon_min=73.0#中国的经纬度范围
lon_max=136.0
lat_min=3.0
lat_max=54.0
resolution=0.1#tif影像分辨率大小设置,自行按照自己的分辨率设置
lon_0=100
lat_0=27
cols=int((lon_max-lon_min)/resolution)+1#得到你这个tif有多少行列
rows=int((lat_max-lat_min)/resolution)+1#得到你这个tif有多少行列
lons=np.empty(cols)#构建经度数据
lats=np.empty(rows)#构建纬度数据
for i in range(rows):
    lats[i]=lat_max-i*resolution
for j in range(cols):
    lons[j]=lon_min+j*resolution
#经纬度构建完成
for file_i in file_list:
    if os.path.splitext(file_i)[1]=='.tiff':#开始循环tiff数据
    	data_now=gdal.Open(os.path.join(dir_in,file_i))
		out_array=data_now.ReadAsArray()#将tif读成一个矩阵
        lon, lat = np.meshgrid(lons, lats)
        fig = plt.figure(figsize=(14,16))#构建一个大小为这么大的画布对象
        ax=plt.axes(projection=ccrs.PlateCarree(central_longitude=0)) 
        leftlon, rightlon, lowerlat, upperlat = (lon_min,lon_max,lat_min,lat_max)
        img_extent = [leftlon, rightlon, lowerlat, upperlat]
        ax.set_extent([leftlon, rightlon, lowerlat, upperlat], crs=ccrs.PlateCarree())#设置图像显示范围
        ax.set_xticks(np.arange(75,136,10),crs=ccrs.PlateCarree())#设置x轴标签,及经度
        plt.xticks(fontsize=20)#设置x轴标签字体大小
        plt.yticks(fontsize=20)
        ax.set_yticks(np.arange(5,55,10),crs=ccrs.PlateCarree())#设置y轴标签,即纬度
        lon_formatter = LongitudeFormatter(zero_direction_label=False)#应该是用于将简单的数字转为图像上的经纬度,比如加上纬度N,E等标志
        lat_formatter = LatitudeFormatter()
		ax.xaxis.set_major_formatter(lon_formatter)
        ax.yaxis.set_major_formatter(lat_formatter)
        ax.set_title('Your Title',loc='center',fontsize =22,family = 'Times New Roman')
        china=shpreader.Reader(r'F:\矢量数据\全国\China.dbf').geometries()#读取国家边界
        nine_line=shpreader.Reader(r'F:\矢量数据\全国\九段线.dbf').geometries()#读取九段线shp
        world=shpreader.Reader(r'G:\continent\continent.dbf').geometries()#读取全球的海岸线边界
        ax.add_geometries(china, ccrs.PlateCarree(),facecolor='none', edgecolor='slategrey',zorder = 2, ls='--',lw=0.8)#添加进图层
        ax.add_geometries(nine_line, ccrs.PlateCarree(),facecolor='none', edgecolor='k',zorder = 2, lw=2)
        ax.add_geometries(world, ccrs.PlateCarree(),facecolor='none', edgecolor='grey',zorder = 1)
  
        cf=ax.pcolormesh(lon[:],lat[:],out_array[:],cmap='jet',transform=ccrs.PlateCarree(),vmin=0,vmax=500)#这里面设置下最大最小值显示范围
        
        cbar=plt.colorbar(cf,orientation='vertical',aspect=19.3,fraction=.039,pad=0.02,extend='neither')#设置他的colorbar 颜色表 fraction可以调节色带大小   aspect:长尺寸与短尺寸色带的比例
        cbar.norm([0,500])#corlorbar的范围
        cbar.set_label('colorbar的label',fontsize=20)
            
        
        plt.savefig(os.path.join(dir_out,file_i+'.png'),dpi=400, bbox_inches='tight')#保存出图
        plt.close()#关闭图像
        print('The file: '+str(file_i)+' has been done!')

最后,欢迎各位大佬讨论。

你可能感兴趣的:(python,python)