目录

# # # 定义类及方法

# 一 tiff数据获取

# 二 专题图画板绘制

# 三 专题图颜色填充

# 四 底图添加

# 五 经纬度刻度线划分及标记

# 六 专题图边框设置

# 七 图例添加

# 八 标题添加

# 九 专题图保存


描述:本篇文章主要内容是基于Basemap绘制专题图,进行地理信息数据可视化;分别从tiff数据获取、专题图画板绘制、专题图颜色填充、底图添加、经纬度刻度线划分及标记、专题图边框设置、图例添加、标题添加及专题图保存这几个方面来描述并提供相关代码及注释说明。

# 导入模块
import os
import sys
import traceback
import gdal
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties# 解决打包时报的RuntimeError: main thread is not in main loop
from osgeo import ogr
plt.switch_backend('agg')
from mpl_toolkits.basemap import Basemap
from utils.configUtils import ConfigUtils
from utils.OSUtils import OSUtils# 载入宋体
simsunpath = os.path.join(os.path.dirname(os.path.realpath(sys.argv[0])), 'resource', 'font', 'SimSun.ttf')
SimSun = FontProperties(fname=simsunpath)# 全局设置字体及大小,设置公式字体即可,若要修改刻度字体,可在此修改全局字体
plt.rcParams['font.serif'] = ['SimSun']
plt.rcParams['font.family'] = 'Times New Roman'  # 设置默认为Times New Roman
plt.rcParams['mathtext.fontset'] = 'stix'  # 设置数学符号字体,stix与Times New Roman接近
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号

# 定义类及方法

class Mapping:def __init__(self, drgs):""":paramdrgs: 阈值"""self.drgs = drgsself.config = ConfigUtils()self.osutils = OSUtils()self.systempath = self.osutils.get_system_path()# basemap画专题图def createBasemap(self, rasterfile, pngpath, tm, algor, ts, point_shp, addvcd):""":paramrasterfile: wgs84坐标下的tif文件pngpath: 输出路径tm:起始时间algor:指标名ts:时间尺度prefixe:前缀地区名addvcd:地区行政编号"""

# 一 tiff数据获取

         try:# 准备tif数据dataset = gdal.Open(rasterfile, gdal.GA_ReadOnly)# 仿射矩阵,左上角像素的大地坐标和像素分辨率。adfGeoTransform = dataset.GetGeoTransform()# 宽im_width = dataset.RasterXSize# 高im_height = dataset.RasterYSize# adfGeoTransform参数:# adfGeoTransform[0]:影像左上角x坐标# adfGeoTransform[1]:像元分辨率# adfGeoTransform[3]:影像左上角y坐标# llon,ulon,ulat,llat 专题图图像所占的最左、最右、最上、最下位置llon = adfGeoTransform[0]  # 左上角x坐标ulon = adfGeoTransform[0] + adfGeoTransform[1] * im_width  # 最右端x坐标ulat = adfGeoTransform[3]  # 影像左上角y坐标llat = adfGeoTransform[3] + adfGeoTransform[5] * im_height  # 最下端y坐标

# 二 专题图画板绘制

        # 设置基本图片画板(背景白板)width = 7fig = plt.figure(figsize=(width, width / 2))# llcrnrlon、llcrnrlat、urcrnrlon、urcrnrlat 包含专题图的外框边界的经纬度llcrnrlon = round(llon - 0.1, 2)llcrnrlat = round(llat - 0.1, 2)urcrnrlon = round(ulon + 0.05, 2)urcrnrlat = round(ulat + 0.05, 2)# axes 专题图的位置[0.0, 0.095, 1.0, 0.77],# 其中,第一个数字代表图像右移;第二个参数代表图像上移;# 第三个参数代表图像左右压缩;第四个参数代表图像上下压缩axes = fig.add_axes([0.0, 0.095, 1.0, 0.77])  # 专题图在画板中的位置# Basemap绘制专题图m = Basemap(llcrnrlon=llcrnrlon, llcrnrlat=llcrnrlat,urcrnrlon=urcrnrlon, urcrnrlat=urcrnrlat,resolution='h', ax=axes)

# 三 专题图颜色填充

        # 画等值图 (np.linspace用来生成等差数列)loni = np.linspace(llon, ulon, im_width)lati = np.linspace(ulat, llat, im_height)# 从坐标向量返回坐标矩阵 X, Y = np.meshgrid(x, y)# 代表的是将x中每一个数据和y中每一个数据组合生成很多点, 然后将这些点的x坐标放入到X中, y坐标放入Y中, 并且相应位置是对应的lonnew, latnew = np.meshgrid(loni, lati)  # im_width列 im_height行data = dataset.ReadAsArray()  # 按块读取栅格# 配置文件读取不同干旱等级对应的颜色color = self.config.getkey('carto', 'colors').split(',')if algor in ('RWSI', 'CWSI', 'CDD', 'ONEMAP'):if self.drgs[0] > self.drgs[-1]:self.drgs = self.drgs[::-1]color = color[::-1]# contourf:在地图上填充等值线图(每个栅格数据对应的颜色图);antialiased:抗锯齿m.contourf(lonnew, latnew, data, self.drgs, zorder=2, alpha=0.8, colors=color, antialiased=True)        

# 四 底图添加

        if addvcd == 610000:# 添加市县的矢量底图shi_shpfile = os.path.join(self.systempath, 'resource', 'boundary', 'shi')# readshapefile:在专题图上添加线、面shp文件,只绘出shp的边界,shp必须为地理坐标m.readshapefile(shi_shpfile, 'shi', linewidth=0.2, default_encoding='utf-8')xian_shpfile = os.path.join(self.systempath, 'resource', 'boundary', 'xian')m.readshapefile(xian_shpfile, 'xian', linewidth=0.05)# 站点shp叠加point_shpfile = point_shp.rsplit('.', 1)[0]m.readshapefile(point_shpfile, 'name', default_encoding='gbk')for shpdict, shape in zip(m.name_info, m.name):J = float(shpdict['lon'])W = float(shpdict['lat'])Z = shpdict['GRADE']if Z == U'特旱':f = '#730000'elif Z == U'重旱':f = '#E60000'elif Z == U'中旱':f = '#FFB400'elif Z == U'轻旱':f = '#FFFF00'else:f = '#FFFFFF'plt.plot(J, W, marker='o', markerfacecolor=f, markersize=3, markeredgecolor='k',markeredgewidth=0.5)# 此处需要用plt.plot绘制散点图,网上所说用plot.scatter绘制散点图会导致站点在专题图上显示不明显(如图1及图2)for shapedict, shape in zip(m.shi_info, m.shi):name = shapedict['name']lon = float(shapedict['lot'])lat = float(shapedict['lat'])# (shp注记)设置文本时,size设置一定要放在fontproperties后,否则字体大小调整失灵plt.text(lon, lat, name,# fontproperties=SimSun,family='SimHei',  # 黑体style="italic",fontweight='light',linespacing=1.2,ha='center',va='center',color='#696969',size=6,alpha=0.8)# 读取省的边界urban = str(addvcd)shpfile = os.path.join(self.systempath, 'resource', 'boundary', str(addvcd))m.readshapefile(shpfile, urban)

图1 plot.scatter 绘制站点图显示

图2 plot.plot 绘制站点图显示

# 五 经纬度刻度线划分及标记

        # 经纬度线绘制、标记纬度线parallels = np.linspace(llcrnrlat, urcrnrlat, 5, endpoint=False)  # 均分parallels = np.append(parallels, np.array([urcrnrlat]), 0)paralabel = []m.drawparallels(parallels,linewidth=0.5,fontsize=5,labels=[False, False, False, False],alpha=0.1)  # 以度为单位标记纬度线for i in parallels:degree = int(i)  # 度minute = int((i - degree) * 60)  # 分a = str(degree) + str('°') + str(minute) + str('′N')paralabel.append(a)# 标记经度线meridians = np.linspace(llcrnrlon, urcrnrlon, 4, endpoint=False)   # 均分meridians = np.append(meridians, np.array([urcrnrlat]), 0)m.drawmeridians(meridians,alpha=0.1,linewidth=0.5,fontsize=1,labels=[False, False, False, False])  # 以度为单位标记经度线merlabel = []for j in meridians:degree = int(j)  # 度minute = int((j - degree) * 60)  # 分b = str(degree) + str('°') + str(minute) + str('′E')merlabel.append(b)

#六  专题图边框设置

        # 设置边框bwith = 1.0  # 边框宽度设置TK = plt.gca()  # 获取边框, 返回当前 axes# TK.set_frame_on(False)  # 利用spine对象关闭轴脊for axes in ['bottom', 'left', 'top', 'right']:TK.spines[axes].set_linewidth(bwith)  # 图框宽度设置TK.spines[axes].set_color('k')  # 图框颜色设置TK.spines[axes].set_alpha(0.7)  # 图框透明设置 0-1TK.xaxis.set_ticks_position('top')TK.xaxis.set_ticks_position('bottom')TK.yaxis.set_ticks_position('right')TK.yaxis.set_ticks_position('left')# # 替换lableplt.yticks(list(parallels), paralabel, fontsize=5)plt.xticks(list(meridians), merlabel, fontsize=5)plt.tick_params(length=0, pad=2, bottom=bool, top=bool, left=bool, right=bool,labelbottom=bool, labeltop=bool, labelleft=bool, labelright=bool,grid_alpha=0.1)

#  七 图例添加

         # 增加图例axes = fig.add_axes([0.00, -0.03, 1.0, 0.1])legend_label = self.config.getkey('carto', 'label').split(',')color = self.config.getkey('carto', 'colors').split(',')delt_intervals = 0.1start = (1 - 5 * delt_intervals) / 2 + 0.02for i in range(5):axes.add_patch(plt.Rectangle((start + i * delt_intervals, 0.65), 0.04, 0.30,facecolor=color[i], linewidth=0.5, edgecolor='k'))axes.text(start + 0.05 + i * delt_intervals,0.73, legend_label[i], fontproperties=SimSun, fontsize=5)axes.axis('off')

# 八 标题添加

        # 画titleaxes = fig.add_axes([0.00, 0.9, 1.0, 0.3])axes.axis('off')# axes.text(0.5, 0.11, prefixe + '干旱监测图', ha='center', fontproperties=SimSun, fontsize=10)title = r'$\mathrm{%(year)d}$年$\mathrm{%(month)d}$月$\mathrm{%(day)d}$日$\mathrm{(%(al)s}$-$\mathrm{%(ts)s)}$'axes.text(0.5, 0, title % {"year": tm.year, "month": tm.month, "day": tm.day,"al": algor, "ts": ts}, ha='center', fontproperties=SimSun,fontsize=8)

# 九 专题图保存

        # 保存OSUtils().checkdir_path(os.path.dirname(pngpath))plt.savefig(pngpath, bbox_inches='tight', format="png", dpi=300)plt.close()  # 切记del dataset# plt.show()except Exception:print(traceback.format_exc())

Python: Basemap进行数据可视化分析------专题图绘制相关推荐

  1. Python爬虫以及数据可视化分析

    Python爬虫以及数据可视化分析之Bilibili动漫排行榜信息爬取分析 简书地址:https://www.jianshu.com/u/40ac87350697 简单几步,通过Python对B站番剧 ...

  2. python爬虫及数据可视化分析

    python爬虫及数据可视化分析 1.前言 2.数据爬取 2.1定位到爬取数据 2.2爬虫实现方法 3.数据可视化分析 3.1将短文学网的各类文章做一个统计 3.2对某一类文章进行分析 1.前言 本篇 ...

  3. 基于python的电影数据可视化分析与推荐系统

    温馨提示:文末有 CSDN 平台官方提供的博主 Wechat / QQ 名片 :) 1. 项目简介 本项目利用网络爬虫技术从国外某电影网站和国内某电影评论网站采集电影数据,并对电影数据进行可视化分析, ...

  4. Python爬虫以及数据可视化分析!

    简单几步,通过Python对B站番剧排行数据进行爬取,并进行可视化分析 源码文件可以参考Github上传的项目:https://github.com/Lemon-Sheep/Py/tree/maste ...

  5. Python爬虫以及数据可视化分析!这才是零基础入门案例!

    简单几步,通过Python对B站番剧排行数据进行爬取,并进行可视化分析 下面,我们开始吧! PS: 作为Python爬虫初学者,如有不正确的地方,望各路大神不吝赐教[抱拳] 本项目将会对B站番剧排行的 ...

  6. Python爬虫以及数据可视化分析之某站热搜排行榜信息爬取分析

    目录 前言 一,确定目标 二,发送请求 三, 解析数据 四, 保存数据 pyecharts进行可视化 "某站"数据排名前10视频类型 "某站"标题标签可视化 & ...

  7. Python爬虫以及数据可视化分析(最新B站番剧排行榜数据)

    本博客将会对B站番剧排行榜的数据进行信息爬取以及数据可视化分析,适应最新的B站网页结构 参考大佬:https://blog.csdn.net/Jacompol/article/details/1116 ...

  8. 简单易懂 爬取某网站卫衣数据(python)及数据可视化分析(matplotlib、pyecharts)

    爬取网址: http://search.dangdang.com/?key=%CE%C0%D2%C2&category_id=10010336&page_index=1 前言 利用py ...

  9. 基于Python的电影数据可视化分析系统 设计报告+答辩PPT+项目源码

    目录 引言 2 1.1 编写目的 2 1.2 读者对象 2 1.3 软件项目概述 2 1.4 文档概述 2 1.5 定义 2 1.6 参考资料 3 软件的一般性描述 4 2.1软件产品与其环境之间的关 ...

  10. Python画地图数据可视化分析

    如何使用Python画地图数据 地图可视化 地图可视化常用包非plotly莫属,支持Python和R. 地址:https://plot.ly/python/scattermapbox/ 需要先注册账号 ...

最新文章

  1. 拥抱AI大趋势,ARM发布两款AI芯片架构
  2. 神策数据完成B轮融资1100万美元,DCM领投、红杉跟投
  3. Linux内核引导简析
  4. Python学习笔记(五) Python高级特性
  5. JVM监控工具介绍jstack, jconsole, jinfo, jmap, jdb, jsta (Linux 如何查看进程的各线程的CPU占用 )
  6. NSArray、NSDictionary、NSString存储、删改、遍历
  7. flume linux 命令,Linux环境Flume安装配置及使用
  8. mysql 时间 between查询 索引吗_Mysql: mysql between 日期索引 索引问题-日期索引使用...
  9. mysql中rm+-f_Mysql命令大全
  10. 解决双击excel文件打开多个excel.exe进程的问题
  11. IC数字常见问题(一)时钟
  12. RK3288 开发板 排插物理引脚对应图以及如何进入android6.0.1内核终端、uboot终端
  13. 刷脸支付在新零售行业线上线下加速融合
  14. 即食花胶的功效与作用 即食花胶怎么吃?
  15. Android加密 看雪,Android加密与解密入门两题
  16. 安装使用Discuz!破解模版插件提示“您安装的不是正版应用
  17. Java基础教程-第十章-图形程序设计(详尽版)
  18. 基于Dragonboard 410c 的Grove - Digital Light Sensor驱动移植
  19. ZYNQ7000系列入门之GPIO点灯
  20. 哈希表:线性探测法和链地址法求查找成功与不成功的平均查找长度

热门文章

  1. Vue3动态加载图片
  2. 基于SSM的医院管理系统
  3. ubuntu20 关闭防火墙_ubuntu中如何关闭防火墙
  4. 计算机断电后自动启动,断电来电后自动开机,神奇的电脑开机方法
  5. 使用Contect.Handler显示提交过来的“编辑成功”的信息
  6. Android破解九宫格密码
  7. 2024 递归Eason
  8. 解决方案(.sln)文件
  9. JVM--基础--19.4--垃圾收集器--Parallel Scavenge
  10. 无线传感器网络实验与作业总结