时间序列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的更多相关文章

  1. MODIS系列之NDVI(MOD13Q1)二:modis数据相关信息

    1.MODIS数据的特点 (1)全球免费:NASA对MODIS数据实行全球免费接收的政策(TERRA卫星除MODIS外的其他传感器获取的数据均采取公开有偿接收和有偿使用的政策),这样的数据接收和使用政 ...

  2. MODIS系列之NDVI(MOD13Q1)四:MRT单次及批次处理数据

    前言: 本篇文章的出发点是因为之前接触过相关研究,困囧于该系列资料匮乏,想做一个系列.个人道行太浅,不足之处还请见谅.愿与诸君共勉. 数据准备: MODIS数据产品MOD13Q1—以2010年河南省3 ...

  3. MODIS系列之NDVI(MOD13Q1)五:NDVI处理流程

    前言:(个人建议) 1.进行数据处理工作,由于通常数据量比较大.所以在个人电脑中,要将基础数据.不断增长的过程数据.结果数据等分门别类,使得简单易找. 2.将重要数据备份,因为在数据处理过程中,由于出 ...

  4. MODIS系列之NDVI(MOD13Q1)一:数据下载(一)基于插件

    引言: 写MODIS数据处理这个系列文章的初衷,主要是为了分享本人处理MODIS数据方面的一些经验.鉴于网上对这方面系统性的总结还比较少,我搜集资料时也是走了许多的弯路,因此希望通过此文让初学者能够更 ...

  5. MODIS系列之NDVI(MOD13Q1)三:.jdk文件配置+MRT安装

    MRT(MODIS Reprojection Tool)简介: MODIS的全称为中分辨率成像光谱仪(Moderate-Resolution Imaging Spectroradiometer),是搭 ...

  6. MODIS系列之NDVI(MOD13Q1)一:数据下载(二)基于FTP

    这一篇我们来介绍下MODIS数据的下载方式.当然这边主要是介绍国外网站的下载方式,国内网站的普遍是在地理空间数据云和遥感集市下载.国外网站(NASA官网)下载方式主要介绍两种.本篇主要针对第一种方式, ...

  7. Django 系列博客(七)

    Django 系列博客(七) 前言 本篇博客介绍 Django 中的视图层中的相关参数,HttpRequest 对象.HttpResponse 对象.JsonResponse,以及视图层的两种响应方式 ...

  8. JavaScript 系列博客(七)

    JavaScript 系列博客(七) 前言 本篇博客介绍页面节点概念.文档结构以及如何使用 js 操作文档节点还有事件 target 以及 BOM 操作. 节点 dom与dom属性 // DOM: 文 ...

  9. Linux Shell系列教程之(七)Shell输出

    本文是Linux Shell系列教程的第(七)篇,更多shell教程请看:Linux Shell系列教程 与其他语言一样,Shell中也有输出操作,而且在实际应用中也是非常重要的,今天就为大家介绍下S ...

随机推荐

  1. 2020-3-3 20175110王礼博 《网络对抗技术》Exp1 PC平台逆向破解

    目录 1.实践目标与基础知识 2.直接修改程序机器指令,改变程序执行流程 3.通过构造输入参数,造成BOF攻击,改变程序执行流 4.注入Shellcode并执行 5.实验收获与感想 6.什么是漏洞?漏 ...

  2. matplotlib 中其他基于Affine2DBase的类

    2020-04-11 11:42:22 --Edit by yangray以下所有类(除了BboxTransformToMaxOnly )都直接继承于Affine2DBaseIdentityTrans ...

  3. Git应用详解第六讲:Git协作与Git pull常见问题

    前言 前情提要:Git应用详解第五讲:远程仓库Github与Git图形化界面 git除了可以很好地管理个人项目外,最大的一个用处就是实现团队协作开发.况且,linus大神开发git的初衷就是为了维护L ...

  4. C# 基础知识系列- 9 字符串的更多用法(二)

    0. 前言 上一篇文章介绍了字符串自身的一些方法,就是对象方法.在字符串体系中,还有一些是string类提供的静态方法.这两部分构成了字符串体系,当然还有一些三方库为字符串提供了扩展方法. 这里简单的 ...

  5. Linux Mint(Ubuntu)如何管理开机自动启动项?

    Linux Mint自带了一个简洁的开机自启管理应用,使用方法也很简单: 依次点击“Menu”==>“控制中心”==>“个人”==>“启动应用程序”,界面如图所示: 上面打勾的就是系 ...

  6. 基于my-DAQ的温室迷你温室设计

    这是一个小项目,采用NI的my-DAQ做数据采集,需要采集的数据有温度(LM35),气体(MQ2),需要控制的设备有风扇.加热棒,另外还有光照亮度调节. 一.数据采集 1.LM35 LM35是模拟输出 ...

  7. Three.js三维模型几何体旋转、缩放和平移

    创建场景中的三维模型往往需要设置显示大小.位置.角度,three.js提供了一系列网格模型对象的几何变换方法,从WebGL的角度看,旋转.缩放.平移对应的都是模型变换矩阵,关于矩阵变换内容可以观看本人 ...

  8. python干货-类属性和方法,类的方法重写

    类属性与方法 类的私有属性 __private_attrs: 两个下划线开头,表明为私有,外部不可用,内部使用时self.__private_attrs. 类的方法 在类的内部,使用 def 关键字来 ...

  9. win10安装docker,VSCode管理docker

    背景 docker:随着技术的不断迭代,开发环境的配置与部署越来越重要.Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linu ...

  10. Daily Scrum 1/7/2015

    Process: Zhaoyang: Do some code intergration and test the total feature in the IOS APP. Yandong: Cod ...