MODIS系列之NDVI(MOD13Q1)七:时间序列S-G滤波之Python
时间序列S-G滤波之Python
根据上上篇博文(MODIS系列之NDVI(MOD13Q1)五:NDVI处理流程)做出的NDVI。我们求NDVI时间序列图,但该NDVI时序图为地表各土地类型综合的NDVI时序图。(详情同样参考该系列五博文的文底)
建议:大家应该也能发现从网上粘贴的代码,大部分在各自实际运行中会出现报错,不能运行。这其中有代码本身的错误,但也不乏运行环境的欠缺、误操作、电脑自身特点等原因。本博客的所有代码都经过实际运行再上传,哪怕比较熟悉的代码,再上传前都会尽可能实际运行。目的便是给大家减少参考困难及错误信息。因为己所不欲勿施于人么。不足之处,还请见谅,并留下建议。
1. 完整代码如下(实际运行成功):
import matplotlib.pyplot as plt
from osgeo import gdal
from gdalconst import *
import matplotlib
import numpy
import time
import os
import os.path def Gettiff(getpath):
tiff=[]
os.system("dir "+getpath+"\\"+"*.tif /b /s>tiff.TXT")
tifftxt = open("tiff.TXT").readlines()
for i in tifftxt:
tiff.append(i.strip())
return tiff def greater(data,dt,r,c):
count=0
for i in range(r):
for j in range(c):
if data[i][j]!=dt:
count=count+1
else:
continue
return count
def getsum(data,c,r,nodata):
sum1=0
for i in range(c):
for j in range(r):
if data[i][j]==nodata:
continue
else:
sum1=sum1+data[i][j]
return sum1 def write_img(savepath,filename,im_proj,im_geotrans,im_data):
#gdal数据类型包括
#gdal.GDT_Byte,
#gdal .GDT_UInt16, gdal.GDT_Int16, gdal.GDT_UInt32, gdal.GDT_Int32,
#gdal.GDT_Float32, gdal.GDT_Float64
a = os.path.exists(savepath)
if a== False:
os.mkdir(savepath)
#判断栅格数据的数据类型
if 'int8' in im_data.dtype.name:
datatype = gdal.GDT_Byte
elif 'int16' in im_data.dtype.name:
datatype = gdal.GDT_UInt16
else:
datatype = gdal.GDT_Float32 #判读数组维数
if len(im_data.shape) == 3:
im_bands, im_height, im_width = im_data.shape
else:
im_bands, (im_height, im_width) = 1,im_data.shape #创建文件
driver = gdal.GetDriverByName("GTiff") #数据类型必须有,因为要计算需要多大内存空间
dataset = driver.Create(savepath+"\\"+filename, im_width, im_height, im_bands, datatype) dataset.SetGeoTransform(im_geotrans) #写入仿射变换参数
dataset.SetProjection(im_proj) #写入投影 if im_bands == 1:
dataset.GetRasterBand(1).WriteArray(im_data) #写入数组数据
else:
for i in range(im_bands):
dataset.GetRasterBand(i+1).WriteArray(im_data[i]) del dataset def GetValue(TIFF):
x=list()
y=list()
Geo=[]
for i,b in zip(TIFF,range(len(TIFF))):
filePath=r"D:\ArcMapData\tif\.tif" #该路径不是读取和保存路径。是时序图X轴数值定义
end_time=os.path.split(i)[-1][5:8] #截取字符串,截取该文件夹下.tif文件的文件名的部分作为时序图X轴数值
endtime=int(end_time)
ds = gdal.Open(i,GA_ReadOnly)
rows = ds.RasterYSize
cols = ds.RasterXSize
band = ds.GetRasterBand(1)
Nodata=band.GetNoDataValue()
data = band.ReadAsArray(0, 0, cols, rows)
sum1=getsum(data,rows,cols,Nodata)
count = greater(data,Nodata,rows,cols)
ignore0_pixel = sum1/count
x.append(ignore0_pixel)
y.append(endtime)
del ds
return x,y
# print(rows,cols,im_proj)
# print("\n\n\n")
# print(data)
def showtiff(listx,listy,listx1,listy1):
plt.plot(listy,listx,".-b")
plt.plot(listy1,listx1,"*-r")
plt.tick_params(labelsize=10)
plt.xticks(fontsize = 8)
plt.show()
if __name__=='__main__':
#for i in range(2000,2018):
getpath=r"D:\ArcMapData\xiaomaiNDVI"
tiff=Gettiff(getpath)
zhfont1 = matplotlib.font_manager.FontProperties(fname="微软vista黑体.ttf")
x3,y3=GetValue(tiff)
plt.plot(y3,x3,"*-",label='NDVI',color='red')
plt.title("2010年河南省3、4、5月冬小麦NDVI",fontproperties=zhfont1)
plt.xlabel("天数", fontproperties=zhfont1)
plt.ylabel("NDVI")
plt.legend(ncol=1, mode="None")
plt.show()
运行结果如下:

Figure界面介绍:
重置原始视图
返回上一个视图
前进到下一个视图
用鼠标左键平移轴,用鼠标右键缩放
缩放到矩形
配置子批次
保存图形(.png格式)
2. 部分代码解读(为解读的代码通常不用更改,若另有改动需求,请便):
2.1 安装matplotlib module
import matplotlib
本人在运行代码遇到的第一个问题就是这个,相信大家在运行的过程中也可能会遇到。python交互式命令行页面会报出 无 matplotlib module 类型 。那就安装 matplotlib module 。具体安装步骤请参考博文:Python之 module安装
2.2 该部分为根据各自需要获取X轴数值
filePath=r"D:\ArcMapData\tif\.tif" #该路径不是读取和保存路径。是时序图X轴数值定义
end_time=os.path.split(i)[-1][5:8] #截取字符串,截取该文件夹下.tif文件的文件名的部分作为时序图X轴数值
endtime=int(end_time)
2.3 数据读取路径(替换自己的数据读取路径)
getpath=r"D:\ArcMapData\xiaomaiNDVI"
2.4 重点介绍 (图形中文显示)
Matplotlib 默认情况不支持中文,我们可以使用以下简单的方法来解决:
首先下载字体(注意系统):https://www.fontpalace.com/font-details/SimHei/
SimHei.ttf 文件放在当前执行的代码文件中:
2.4.1安装SimHei.ttf 文件
打开上文链接(该系列操作电脑比较慢,如果打不开,请重复操作,国外网站都这样。我大天国太强)


如果该操作不行。请用网盘链接
链接:https://pan.baidu.com/s/1h_U37kA_dzEIjW4Vy9tX9Q
提取码:7tm1
如图:

2.5
plt.plot(y3,x3,"*-",label='NDVI',color='red')
plt.title("2010年河南省3、4、5月冬小麦NDVI",fontproperties=zhfont1)
plt.xlabel("天数", fontproperties=zhfont1)
plt.ylabel("NDVI")
2.5.1
*- 为实线样式。
作为线性图的替代,可以通过向 plot() 函数添加格式字符串来显示离散值。 可以使用以下格式化字符。
| 字符 | 描述 |
|---|---|
'-' |
实线样式 |
'--' |
短横线样式 |
'-.' |
点划线样式 |
':' |
虚线样式 |
'.' |
点标记 |
',' |
像素标记 |
'o' |
圆标记 |
'v' |
倒三角标记 |
'^' |
正三角标记 |
'<' |
左三角标记 |
'>' |
右三角标记 |
'1' |
下箭头标记 |
'2' |
上箭头标记 |
'3' |
左箭头标记 |
'4' |
右箭头标记 |
's' |
正方形标记 |
'p' |
五边形标记 |
'*' |
星形标记 |
'h' |
六边形标记 1 |
'H' |
六边形标记 2 |
'+' |
加号标记 |
'x' |
X 标记 |
'D' |
菱形标记 |
'd' |
窄菱形标记 |
'|' |
竖直线标记 |
'_' |
水平线标记 |
2.5.2
label='NDVI' label为标注
2.5.3
color='red'
线条颜色可以用英文或缩写
以下是颜色的缩写:
| 字符 | 颜色 |
|---|---|
'b' |
蓝色 |
'g' |
绿色 |
'r' |
红色 |
'c' |
青色 |
'm' |
品红色 |
'y' |
黄色 |
'k' |
黑色 |
'w' |
白色 |
2.5.4
第二行为标题设置 "2010年河南省3、4、5月冬小麦NDVI" 为本操作标题
fontproperties=zhfont1 为 fontproperties 设置中文显示,fontsize 设置字体大小
2.5.5
第三行为设置X轴标注和中文显示和字体大小
2.5.6
第四行为设置Y轴标注
若有其它需要,请自行更改代码
MODIS系列之NDVI(MOD13Q1)七:时间序列S-G滤波之Python的更多相关文章
- MODIS系列之NDVI(MOD13Q1)二:modis数据相关信息
1.MODIS数据的特点 (1)全球免费:NASA对MODIS数据实行全球免费接收的政策(TERRA卫星除MODIS外的其他传感器获取的数据均采取公开有偿接收和有偿使用的政策),这样的数据接收和使用政 ...
- MODIS系列之NDVI(MOD13Q1)四:MRT单次及批次处理数据
前言: 本篇文章的出发点是因为之前接触过相关研究,困囧于该系列资料匮乏,想做一个系列.个人道行太浅,不足之处还请见谅.愿与诸君共勉. 数据准备: MODIS数据产品MOD13Q1—以2010年河南省3 ...
- MODIS系列之NDVI(MOD13Q1)五:NDVI处理流程
前言:(个人建议) 1.进行数据处理工作,由于通常数据量比较大.所以在个人电脑中,要将基础数据.不断增长的过程数据.结果数据等分门别类,使得简单易找. 2.将重要数据备份,因为在数据处理过程中,由于出 ...
- MODIS系列之NDVI(MOD13Q1)一:数据下载(一)基于插件
引言: 写MODIS数据处理这个系列文章的初衷,主要是为了分享本人处理MODIS数据方面的一些经验.鉴于网上对这方面系统性的总结还比较少,我搜集资料时也是走了许多的弯路,因此希望通过此文让初学者能够更 ...
- MODIS系列之NDVI(MOD13Q1)三:.jdk文件配置+MRT安装
MRT(MODIS Reprojection Tool)简介: MODIS的全称为中分辨率成像光谱仪(Moderate-Resolution Imaging Spectroradiometer),是搭 ...
- MODIS系列之NDVI(MOD13Q1)一:数据下载(二)基于FTP
这一篇我们来介绍下MODIS数据的下载方式.当然这边主要是介绍国外网站的下载方式,国内网站的普遍是在地理空间数据云和遥感集市下载.国外网站(NASA官网)下载方式主要介绍两种.本篇主要针对第一种方式, ...
- Django 系列博客(七)
Django 系列博客(七) 前言 本篇博客介绍 Django 中的视图层中的相关参数,HttpRequest 对象.HttpResponse 对象.JsonResponse,以及视图层的两种响应方式 ...
- JavaScript 系列博客(七)
JavaScript 系列博客(七) 前言 本篇博客介绍页面节点概念.文档结构以及如何使用 js 操作文档节点还有事件 target 以及 BOM 操作. 节点 dom与dom属性 // DOM: 文 ...
- Linux Shell系列教程之(七)Shell输出
本文是Linux Shell系列教程的第(七)篇,更多shell教程请看:Linux Shell系列教程 与其他语言一样,Shell中也有输出操作,而且在实际应用中也是非常重要的,今天就为大家介绍下S ...
随机推荐
- 2020-3-3 20175110王礼博 《网络对抗技术》Exp1 PC平台逆向破解
目录 1.实践目标与基础知识 2.直接修改程序机器指令,改变程序执行流程 3.通过构造输入参数,造成BOF攻击,改变程序执行流 4.注入Shellcode并执行 5.实验收获与感想 6.什么是漏洞?漏 ...
- matplotlib 中其他基于Affine2DBase的类
2020-04-11 11:42:22 --Edit by yangray以下所有类(除了BboxTransformToMaxOnly )都直接继承于Affine2DBaseIdentityTrans ...
- Git应用详解第六讲:Git协作与Git pull常见问题
前言 前情提要:Git应用详解第五讲:远程仓库Github与Git图形化界面 git除了可以很好地管理个人项目外,最大的一个用处就是实现团队协作开发.况且,linus大神开发git的初衷就是为了维护L ...
- C# 基础知识系列- 9 字符串的更多用法(二)
0. 前言 上一篇文章介绍了字符串自身的一些方法,就是对象方法.在字符串体系中,还有一些是string类提供的静态方法.这两部分构成了字符串体系,当然还有一些三方库为字符串提供了扩展方法. 这里简单的 ...
- Linux Mint(Ubuntu)如何管理开机自动启动项?
Linux Mint自带了一个简洁的开机自启管理应用,使用方法也很简单: 依次点击“Menu”==>“控制中心”==>“个人”==>“启动应用程序”,界面如图所示: 上面打勾的就是系 ...
- 基于my-DAQ的温室迷你温室设计
这是一个小项目,采用NI的my-DAQ做数据采集,需要采集的数据有温度(LM35),气体(MQ2),需要控制的设备有风扇.加热棒,另外还有光照亮度调节. 一.数据采集 1.LM35 LM35是模拟输出 ...
- Three.js三维模型几何体旋转、缩放和平移
创建场景中的三维模型往往需要设置显示大小.位置.角度,three.js提供了一系列网格模型对象的几何变换方法,从WebGL的角度看,旋转.缩放.平移对应的都是模型变换矩阵,关于矩阵变换内容可以观看本人 ...
- python干货-类属性和方法,类的方法重写
类属性与方法 类的私有属性 __private_attrs: 两个下划线开头,表明为私有,外部不可用,内部使用时self.__private_attrs. 类的方法 在类的内部,使用 def 关键字来 ...
- win10安装docker,VSCode管理docker
背景 docker:随着技术的不断迭代,开发环境的配置与部署越来越重要.Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linu ...
- Daily Scrum 1/7/2015
Process: Zhaoyang: Do some code intergration and test the total feature in the IOS APP. Yandong: Cod ...