时间序列S-G滤波之Python

根据上上篇博文(MODIS系列之NDVI(MOD13Q1)五:NDVI处理流程)做出的NDVI。我们求NDVI时间序列图,但该NDVI时序图为地表各土地类型综合的NDVI时序图。(详情同样参考该系列五博文的文底)

建议:大家应该也能发现从网上粘贴的代码,大部分在各自实际运行中会出现报错,不能运行。这其中有代码本身的错误,但也不乏运行环境的欠缺、误操作、电脑自身特点等原因。本博客的所有代码都经过实际运行再上传,哪怕比较熟悉的代码,再上传前都会尽可能实际运行。目的便是给大家减少参考困难及错误信息。因为己所不欲勿施于人么。不足之处,还请见谅,并留下建议。

1. 完整代码如下(实际运行成功):

  1. import matplotlib.pyplot as plt
    from osgeo import gdal
    from gdalconst import *
    import matplotlib
    import numpy
    import time
    import os
    import os.path
  2.  
  3. 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
  4.  
  5. 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
  6.  
  7. 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
  8.  
  9.     #判读数组维数
        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
  10.  
  11.     #创建文件
        driver = gdal.GetDriverByName("GTiff")            #数据类型必须有,因为要计算需要多大内存空间
        dataset = driver.Create(savepath+"\\"+filename, im_width, im_height, im_bands, datatype)
  12.  
  13.     dataset.SetGeoTransform(im_geotrans)              #写入仿射变换参数
        dataset.SetProjection(im_proj)                    #写入投影
  14.  
  15.     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])
  16.  
  17.     del dataset
  18.  
  19. 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()
        
  20.  
  21. if __name__=='__main__':
  22.  
  23.     
        #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")
  24.  
  25.  
        
        plt.legend(ncol=1, mode="None")
        plt.show()
  26.  

运行结果如下:

Figure界面介绍:

重置原始视图

返回上一个视图

前进到下一个视图

用鼠标左键平移轴,用鼠标右键缩放

缩放到矩形

配置子批次

保存图形(.png格式)

2. 部分代码解读(为解读的代码通常不用更改,若另有改动需求,请便):

2.1 安装matplotlib module

  1. import matplotlib

本人在运行代码遇到的第一个问题就是这个,相信大家在运行的过程中也可能会遇到。python交互式命令行页面会报出  无 matplotlib module 类型 。那就安装 matplotlib module 。具体安装步骤请参考博文:Python之 module安装

2.2 该部分为根据各自需要获取X轴数值

  1. filePath=r"D:\ArcMapData\tif\.tif" #该路径不是读取和保存路径。是时序图X轴数值定义
  2. end_time=os.path.split(i)[-1][5:8] #截取字符串,截取该文件夹下.tif文件的文件名的部分作为时序图X轴数值
  3. endtime=int(end_time)

2.3 数据读取路径(替换自己的数据读取路径)

  1. 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

  1. plt.plot(y3,x3,"*-",label='NDVI',color='red')
  2. plt.title("2010年河南省3、4、5月冬小麦NDVI",fontproperties=zhfont1)
  3. plt.xlabel("天数", fontproperties=zhfont1)
  4. plt.ylabel("NDVI")

2.5.1

  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. 用Jenkins集成ios项目设置多scheme,同一代码自动输出多个环境包 实现便捷切换API环境

    Jenkins 安装使用参考我的博客http://www.cnblogs.com/zhujin/p/9064820.html Xcode 配置:说明 一个schema 对应一套环境(如生产,测试),一 ...

  2. Starlims Client Request Portal 客户申请门户

    用户可以直接在starlims对外的"客户申请门户"上发起检验申请,并追踪检验进度等. 工作流程图示如下:

  3. EndNote自动修改导入文献标题

    今天使用EndNote导入文献,插入到word中时发现是标题的名字,导入的文献格式不标准,在百度后终于找到了解决办法,EndNote的强大可见一斑. 这个是我要导入的PDF文件的名字 导入后的名字 设 ...

  4. L12 Transformer

    Transformer 在之前的章节中,我们已经介绍了主流的神经网络架构如卷积神经网络(CNNs)和循环神经网络(RNNs).让我们进行一些回顾: CNNs 易于并行化,却不适合捕捉变长序列内的依赖关 ...

  5. 1324E - Sleeping Schedule

    题目大意:一天有h个小时,一个人喜欢睡觉,一共睡n次,每次都睡h个小时,开始时间为0,间隔a[i]或a[i]-1个小时开始睡第i次觉,每天都有一个最好时间区间,问这n次觉,最多有多少次是在最好时间内睡 ...

  6. Numpy学习-(2)

    我学习numpy过程的记录 1. 切片和索引 (1) 两种切片方式示例: (2) 多维数组: import numpy as np a = np.array([[1,2,3],[3,4,5],[4,5 ...

  7. testlink数据表分析

    创建一个项目test node_types: 节点类型,这是一个固定的表 rights: 权限表,用户的操作权限 role_rights: 角色和权限关系表 roles: 角色表 testprojec ...

  8. orcale 树形结构查询

    接到需求是要在一个表中(表结构为主键id和父id)循环显示数据,类似于省市县++这种情况  也可能不只有三级子菜单 id  name   parentid 1     a          0 2  ...

  9. 10w+QPS 的 Redis 真的只是因为单线程和内存?360° 深入底层设计为你揭开 Redis 神秘面纱!

    原文链接:10w+QPS 的 Redis 真的只是因为单线程和内存?360° 深入底层设计为你揭开 Redis 神秘面纱! 你以为 Redis 这么快仅仅因为单线程和基于内存? 那么你想得太少了,我个 ...

  10. python爬虫+正则表达式实例爬取豆瓣Top250的图片

    直接上全部代码 新手上路代码风格可能不太好 import requests import re from fake_useragent import UserAgent #### 用来伪造爬头部信息 ...