利用GDAL对中国范围长时间序列栅格数据的分析

1.数据为中国2000-2015年的ndvi数据,放置位置如下图。

Paste_Image.png

2.安装GDAL,主要通过下载.whl文件,通过pip安装。

3.对每个单元格的多年数据进行线性回归,并给出F值。

#coding=utf-8
import os
import os.path
import gdal
import sys
from gdalconst import *
from osgeo import gdal
import osr
import numpy as np
import mk
import pandas as pd
from statsmodels.formula.api import ols
from statsmodels.stats.anova import anova_lm

def Read(RasterFile):#读取每个图像的信息
    ds = gdal.Open(RasterFile,GA_ReadOnly)    
    if ds is None:
        print 'Cannot open ',RasterFile
        sys.exit(1)
    cols = ds.RasterXSize
    rows = ds.RasterYSize
    band = ds.GetRasterBand(1)
    data = band.ReadAsArray(0,0,cols,rows)  
    return data

def Readxy(RasterFile): #读取每个图像的坐标信息并返回     
    ds = gdal.Open(RasterFile,GA_ReadOnly)
    if ds is None:
        print 'Cannot open ',RasterFile
        sys.exit(1)
    cols = ds.RasterXSize
    rows = ds.RasterYSize
    band = ds.GetRasterBand(1)
    #data = band.ReadAsArray(0,0,cols,rows)
    noDataValue = band.GetNoDataValue()
    projection=ds.GetProjection()
    geotransform = ds.GetGeoTransform()
    return rows,cols,geotransform,projection,noDataValue

def WriteGTiffFile(filename, nRows, nCols, data,geotrans,proj, noDataValue, gdalType):#向磁盘写入结果文件
    format = "GTiff"   
    driver = gdal.GetDriverByName(format)
    ds = driver.Create(filename, nCols, nRows, 1, gdalType)
    ds.SetGeoTransform(geotrans)
    ds.SetProjection(proj)
    ds.GetRasterBand(1).SetNoDataValue(noDataValue)
    ds.GetRasterBand(1).WriteArray(data)    
    ds = None
rows,cols,geotransform,projection,noDataValue = Readxy("D:/china/2000.tif") 
print rows,cols
count=0
rootdir = "D:/china"
datalist=[]
for dirpath,filename,filenames in os.walk(rootdir):#遍历源文件
    for filename in filenames:
        if os.path.splitext(filename)[1] == '.tif':#判断是否为tif格式
             filepath = os.path.join(dirpath,filename)
             filedata1 = [[0.0]*cols]*rows
             
             filedata2 = np.array(filedata1)
             filedata3 = Read(filepath)
             count+=1
             datalist.append(filedata3)
             
dtarelist=[]
for m in range(len(datalist)):
    dtarelist.append((datalist[m].reshape((1,396, 697))))
#print dtarelist
#print dtarelist[2].shape
for a in range(len(datalist)):
  if a==0:
    dtaz=np.concatenate([dtarelist[a],dtarelist[a+1]],axis=0)
  if a>1:
    dtaz=np.concatenate([dtaz,dtarelist[a]],axis=0)
#print dtaz.shape

    
Arraytime=np.array([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15])

Time=np.vstack([Arraytime,np.ones(len(Arraytime))]).T
temparray=[]
XL=np.zeros((396, 697),dtype=np.float)
XF=np.zeros((396, 697),dtype=np.float)
for r in range(396):
     for c in range(697):
         for k in range(16):
              temparray.append(dtaz[k,r,c])
         data={'Time':Time[:,0],'Arrayslope':temparray}
         df=pd.DataFrame(data)
         #Arrayslope=np.array(temparray)
         temparray=[]
         formula='Arrayslope~Time'
         model=ols(formula,df).fit()
         f=anova_lm(model)
         m=model.params.Time
         #m,b=np.linalg.lstsq(Time,Arrayslope)[0]
         XF[r,c]=f.iloc[0,3]
         XL[r,c]=m
     print r
        
WriteGTiffFile("D:/cal/NDVIMEAN_L.tif",rows,cols,XL,geotransform,projection,noDataValue, GDT_Float32)
WriteGTiffFile("D:/cal/NDVIMEAN_F.tif",rows,cols,XF,geotransform,projection,noDataValue, GDT_Float32)                

4.在上述代码的基础上,增加中值计算的函数和mk计算的函数。

···python
def median(x):
if len(x) < 1:
return None
else:
x.sort()
return x[len(x) // 2]
def mk_trend(x):
import math
import numpy as np
s=0
length=len(x)
for m in range(0,length-1):
for n in range(m+1,length):
if x[n]>x[m]:
s=s+1
elif x[n]==x[m]:
s=s+0
else:
s=s-1
#计算vars
vars=length(length-1)(2*length+5)/18
#计算zc
if s>0:
zc=(s-1)/math.sqrt(vars)
elif s==0:
zc=0
else:
zc=(s+1)/math.sqrt(vars)

#计算za    
zc1=abs(zc)
bl=0
if zc1>1.96:#对应95%的置信度
  bl=1
#计算倾斜度
    
ndash=length*(length-1)/2
slope1=np.zeros(ndash)
m=0
for k in range(0,length-1):
    for j  in range(k+1,length):
        slope1[m]=(x[j]-x[k])/(j-k)
        m=m+1
        
slope=median(slope1)
return slope,bl,zc

5.对网格循环部分修改代码,将mk计算嵌入网格循环中。
···python
temparray=[]
x_slope=np.zeros((396, 697),dtype=np.float)
x_bl=np.zeros((396, 697),dtype=np.float)
x_zc=np.zeros((396, 697),dtype=np.float)
for r in range(396):
     for c in range(697):
         for k in range(16):
              temparray.append(dtaz[k,r,c])
         #data={'Time':Time[:,0],'Arrayslope':temparray}
         #df=pd.DataFrame(data)
         #Arrayslope=np.array(temparray)
         
         #formula='Arrayslope~Time'
         #model=ols(formula,df).fit()
         slope,bl,zc=mk_trend(temparray)
         #f=anova_lm(model)
         #m=model.params.Time
         #m,b=np.linalg.lstsq(Time,Arrayslope)[0]
         x_slope[r,c]=slope
         x_bl[r,c]=bl
         x_zc[r,c]=zc
         temparray=[]
     print r
        
WriteGTiffFile("D:/cal/NDVIMEAN_slope2.tif",rows,cols,x_slope,geotransform,projection,noDataValue, GDT_Float32)
WriteGTiffFile("D:/cal/NDVIMEAN_bl2.tif",rows,cols,x_bl,geotransform,projection,noDataValue, GDT_Float32)
WriteGTiffFile("D:/cal/NDVIMEAN_zc2.tif",rows,cols,x_zc,geotransform,projection,noDataValue, GDT_Float32)  
···

其中x_slope为坡度值, x_zc为检验判断依据, x_bl为判断依据,值为1即通过mk检验。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容

  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些阅读 2,013评论 0 2
  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,059评论 0 13
  • (一)关于MK检验 降雨、径流分析采用非参数检验方法曼-肯德尔法(Mann-Kendall)检验法来检测泾河合水川...
    d33911380280阅读 9,916评论 2 6
  • 长长的流水线呀, 怎能阻隔我对你的情义。 古老的护城河, 哪会洗尽我心中的泪痕。 记亿中那一个炎热的夏日, 在邻近...
    无为追梦人005阅读 352评论 0 0
  • 想每天给你写一首酸腐的诗 藏着情藏着意 还要带上我全部的心跳 想每天给你写一首酸腐的诗 酸的是我的嫉妒 嫉妒你身边...
    懒墨阅读 218评论 0 3