python处理遥感影像---采用MODIS植被数据(VCC/VCF)产品MOD44B来分析我国近十二年(如:2000~2011年)的植被空间分布变化

    去年由于要采用MODIS植被数据(VCC/VCF)产品MOD44B来分析我国近十二年(如:2000~2011年)的植被空间分布变化,但是,由于时间尺度是12年,空间尺度为全中国,所以数据量是及其庞大的,要采用软件的方式来处理这些数据,基本上是不可能的。所以在此就选择了利用python结合一些遥感影像处理开发包,写了一段代码,来实现上述目的。

    首先,介绍下我的分析方法。为了分析近12年的植被空间分布变化,为此,我采用了基于最小二乘法的线性拟合来求算植被覆盖度在这十二年中的一个变化斜率,通过这个变化斜率来反映我国植被覆盖度的变化情况。

   然后,我采用了普聚类算法,将植被覆盖度的变化分为五类(增长很大、增长较大、无变化、衰退较快、衰退很快),以此来反映植被覆盖度变化的一个空间聚集性。

   以下是实现线性拟合的代码:

  

#coding=utf-8
import numpy as np
import os
import pyhdf.SD as hdf
import Image
import scipy as sp
import osgeo.gdal as gdal
import osgeo.osr as osr
from osgeo.gdalconst import *
import re


#定义文件输入和输出路径
path='D:/GJSF/DATA/2908'
#path='D:/GJSF/DATA/jx'
savepth='D://GJSF//DATA//TIFF'

#从影像中得到数据集
lista=os.listdir(path)
datalist=[]
for k in range(len(lista)):
  strpth=path+'/'+lista[k]
         dt=hdf.SD(strpth)
         dataset=dt.select('Percent_Tree_Cover')
         data=dataset.get()
         #将所有的数据暂时存入一个列表中
         datalist.append(data)
  
#进行数据叠加处理
dtarelist=[]
for m in range(len(datalist)):
 dtarelist.append((datalist[m].reshape((1,4800,4800))))

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)
  
#清理内存空间
del(dataset)
del(data)
del(datalist)
del(dtarelist)


#数据分割处理


#dtalist=[]
#dtalist.append(dtaz[0:11,0:2400,0:2400])
#dtalist.append(dtaz[0:11,0:2400,2400:4800])
#dtalist.append(dtaz[0:11,2400:4800,0:2400])
#dtalist.append(dtaz[0:11,2400:4800,2400:4800])


#del(dtaz)
#采用最小二乘法,实现线性拟合,并得到斜率值
#设定时间数组
Arraytime=np.array([0,1,2,3,4,5,6,7,8,9,10])
Time=np.vstack([Arraytime,np.ones(len(Arraytime))]).T
#定义结果存储数组
temparray=[]

XL=np.zeros((4800,4800),dtype=np.float)
#进行斜率值的计算

for r in range(4800):
 for c in range(4800):
  for k in range(11):
    temparray.append(dtaz[k,r,c])
  Arrayslope=np.array(temparray)
  temparray=[]
  m,b=np.linalg.lstsq(Time,Arrayslope)[0]
  XL[r,c]=m
  
  
#将结果输出为tiff影像
driver=gdal.GetDriverByName("GTiff")
driver.Register()
print np.max(XL)
tifsavepth=savepth+'/'+'2908.tif'
outDataset = driver.Create(tifsavepth,4800,4800,1,gdal.GDT_Float32)
#定义空间参考坐标系
proj=osr.SpatialReference()
proj.ImportFromProj4("+proj=sinu +lon_0=0 +x_0=0 +y_0=0 +a=6371007.181 +b=6371007.181 +units=m +no_defs")
outDataset.SetProjection(proj.ExportToWkt())

sd = hdf.SD('D:/GJSF/DATA/2908/MOD44B.A2000065.h29v08.005.2011259234325.hdf')
md = sd.attributes()['StructMetadata.0'][0:1111]
mu = re.search("UpperLeftPointMtrs=(.+)",md)
UpperLeftPointMtrs = md[mu.start():mu.end()]
x0,y0 = eval(UpperLeftPointMtrs[19:])
mu = re.search("LowerRightMtrs=(.+)",md)
LowerRightMtrs = md[mu.start():mu.end()]
x1,y1 = eval(LowerRightMtrs[15:])

geotransform = (x0,(x1-x0)/4800,0,y0,0,-(y1-y0)/4800)
outDataset.SetGeoTransform(geotransform)

band = outDataset.GetRasterBand(1)
dataset = band.WriteArray(XL)

 

结果如下图所示:

 

其实上述代码还是有缺陷的,每次只能处理同一地区12年的影像。没有实现全国的一次性计算完成,原因是多方面的:1.自己的水平还相当有限,写此博客也是班门弄斧。2.自己的计算机性能有限,没法一次性完成全国的计算。3.时间和精力有限。

在此希望有志同道合之人能够将此代码加以修改,将不胜感激!

 

下面是实现普聚类的代码:

#coding=utf-8
#Python 2.6.6 (r266:84297, Aug 24 2010, 18:46:32) [MSC v.1500 32 bit (Intel)] on win32
import sklearn
from sklearn.cluster import KMeans
from sklearn import metrics
import numpy as np
import pylab as pl
from sklearn.feature_extraction import image
from sklearn.cluster import spectral_clustering
import osgeo.gdal as gdal
import Image as Img
#读取tiff影像
dtatif=Img.open('D:/GJSF/DATA/ccy/2605RSize.tif')
tempArray=np.array(dtatif)
smallarray=tempArray[0:1200,0:1200]
#tempImg=Img.fromarray(tempArray)
ddimg=image.array2d(smallarray)
del(tempArray)
del(dtatif)
del(smallarray)
mask = ddimg.astype(bool)
ddimg=ddimg.astype(float)
graph = image.img_to_graph(ddimg, mask=mask)
graph.data = np.exp(-graph.data / graph.data.std())
labels = spectral_clustering(graph, n_clusters=4, eigen_solver='arpack')
label_im = -np.ones(mask.shape)
label_im[mask] = labels
pl.matshow(ddimg)
pl.matshow(label_im)
pl.show()

 

聚类结果如下图所示:

 

 

在聚类的过程中,没有完整的对整幅影像进行聚类,只是挑选了一块像素100*100的进行聚类。

  • 9
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
Python是一种功能强大的编程语言,因其灵活性和易用性,被广泛用于各种应用实战案例中。其中一个案例是使用Python处理ModisModerate Resolution Imaging Spectroradiometer)数据,并计算温度植被干旱指数(TVDI)。 Modis是一种远程感知卫星传感器,可提供地球表面的高分辨率影像。利用Modis数据,可以获取温度、植被指数等信息来评估干旱程度。温度植被干旱指数(TVDI)是一种广泛采用的指标,用于描述植被生长和干旱状况之间的关系。 Python中有许多库可以用于处理地理空间数据遥感数据,例如GDAL、NumPy和Pandas等。在这个案例中,我们可以使用这些库来读取和处理Modis数据,并计算TVDI指数。 首先,我们需要将Modis数据导入Python环境中。使用GDAL库可以方便地读取遥感数据的各个波段。然后,通过计算温度和植被指数,例如NDVI(Normalized Difference Vegetation Index),可以得到相应的数值。 接下来,我们可以根据TVDI的计算公式,结合温度和植被指数,计算TVDI指数。根据地区的特点和需求,可以调整计算公式的参数。在完成计算后,可以将结果可视化,以便更直观地理解干旱情况。 总而言之,Python处理Modis数据并计算温度植被干旱指数方面非常有用。通过使用Python的各种库和工具,可以对遥感数据进行处理分析,并得出干旱指数的结果。这种方法不仅可以提供更准确的干旱评估结果,还可以为相关研究和应用提供有价值的支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值