机器学习之用R处理NASA数据(.hdf 或.nc文件)

1.下载NASA数据

这里不在赘述,参考如何获取NASA数据,下面的例子根据下载的LandCoverRainfall数据进行展示,如何利用R语音进行读取,然后绘图。先加载所需R包及地图文件

library(ncdf4)
library(rgdal)
library(gdalUtils)
library(raster)
library(rasterVis)
library(sf)
library(exactextractr)
library(maptools)
library(cleangeo)
library(rworldmap)
rm(list=ls())
# continental shapefile
cont = getMap()
cont = clgeo_Clean(cont)
cont = sapply(levels(cont$continent),
               FUN = function(i){
                 poly = gUnionCascaded(subset(cont, continent == i))
                 poly = spChFIDs(poly, i)
                 SpatialPolygonsDataFrame(poly, data.frame(continent = i, row.names = i))
               }, USE.NAMES = TRUE)
cont = Reduce(spRbind, cont)
# read shp files
setwd("/Users/Desktop/NASA/LandCover")
CHN = st_read("/Users/Desktop/NASA/LandCover/shp/最新的全国区划/县.shp")
CHN_sp = readOGR("/Users/Desktop/NASA/LandCovershp/最新的全国区划/县.shp")

2.读取hdf文件

hdf文件存在Landcover文件夹目录下,然后查看hdf文件

> hdf=list.files(pattern = ".hdf")
> hdf
[1] "MCD12C1.A2010001.006.2018053185051.hdf" "MCD12C1.A2011001.006.2018053185321.hdf"
[3] "MCD12C1.A2014001.006.2018053185556.hdf" "MCD12C1.A2015001.006.2018053185652.hdf"
[5] "MCD12C1.A2016001.006.2018324172410.hdf" "MCD12C1.A2017001.006.2019192025407.hdf"
[7] "MCD12C1.A2018001.006.2019200161458.hdf"

譬如我们需要读取第二个文件 MCD12C1.A2011001.006.2018053185321.hdf;这里的gdalinfo(hdf_filesname) 可以显示该hdf文件的详细列表信息,经纬度,坐标系,年份及卫星信息;sds就是我们想要的数据,其中Majority_Land_Cover_Type_1是根据MCD12C1第一个分类标准,将地球的植被覆盖分成25个类型;具体见官网说明文档。

hdf_filesname=hdf[2]
hdf_tif_name=paste0(unlist(str_split(hdf_filesname,".hdf"))[1],".tif")
gdalinfo(hdf_filesname)
hdf_time = str_extract(hdf_filesname,"()[0-9]{7}") 
sds = get_subdatasets(hdf_filesname)
> sds
[1] "HDF4_EOS:EOS_GRID:MCD12C1.A2011001.006.2018053185321.hdf:MOD12C1:Majority_Land_Cover_Type_1"           
[2] "HDF4_EOS:EOS_GRID:MCD12C1.A2011001.006.2018053185321.hdf:MOD12C1:Majority_Land_Cover_Type_1_Assessment"
[3] "HDF4_EOS:EOS_GRID:MCD12C1.A2011001.006.2018053185321.hdf:MOD12C1:Land_Cover_Type_1_Percent"            
[4] "HDF4_EOS:EOS_GRID:MCD12C1.A2011001.006.2018053185321.hdf:MOD12C1:Majority_Land_Cover_Type_2"           
[5] "HDF4_EOS:EOS_GRID:MCD12C1.A2011001.006.2018053185321.hdf:MOD12C1:Majority_Land_Cover_Type_2_Assessment"
[6] "HDF4_EOS:EOS_GRID:MCD12C1.A2011001.006.2018053185321.hdf:MOD12C1:Land_Cover_Type_2_Percent"            
[7] "HDF4_EOS:EOS_GRID:MCD12C1.A2011001.006.2018053185321.hdf:MOD12C1:Majority_Land_Cover_Type_3"           
[8] "HDF4_EOS:EOS_GRID:MCD12C1.A2011001.006.2018053185321.hdf:MOD12C1:Majority_Land_Cover_Type_3_Assessment"
[9] "HDF4_EOS:EOS_GRID:MCD12C1.A2011001.006.2018053185321.hdf:MOD12C1:Land_Cover_Type_3_Percent" 

最关键的一步,就是读取的第一个Majority_Land_Cover_Type_1文件,从hdf抽取出来转换成tiff文件。你会发现,你的文件夹下多了个相同hdf名字的tiff文件。然后读取tiffraster就可以了

gdal_translate(sds[1], dst_dataset = hdf_tif_name)  # change hdf to tiff
hdf_raster=raster(hdf_tif_name)                     # read tiff as raster
# covert F into T
names(hdf_raster)=hdf_time
hdf_raster
class      : RasterLayer 
dimensions : 3600, 7200, 25920000  (nrow, ncol, ncell)
resolution : 0.05, 0.05  (x, y)
extent     : -180, 180, -90, 90  (xmin, xmax, ymin, ymax)
crs        : +proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0 
source     : /Users/Desktop/NASA/Landcover/MCD12C1.A2011001.006.2018053185321.tif 
names      : X2011001 
values     : 0, 255  (min, max)

3.绘图

hdf_raster是我们提取到的25类 landcover,接下来就是绘图部分

rasterVis::levelplot(hdf_raster, margin = NA, par.settings = RdBuTheme) + 
  layer(sp.polygons(cont))

屏幕快照 2020-06-03 下午3.55.26.png

4.提取中国范围内的数据

接下来就是根据中国地图,将Landcover裁剪至China map

# crop within China
CHN_cropped = crop(hdf_raster, CHN)
CHN_masked = mask(hdf_raster, CHN) # take >5mins
# plot
mapTheme = rasterTheme(region=rev(brewer.pal(8,"Greens")))
rasterVis::levelplot(CHN_cropped, margin = NA, par.settings = mapTheme) +
  layer(sp.polygons(CHN_sp1))

屏幕快照 2020-06-03 下午3.59.05.png

接下来,我们用ggplot展示下结果。(制图反应时间较长)
第一种方法,加载SpatialPolygonsDataFram地图
第二种方法,加载Classes ‘sf’格式地图

#ggplot with raster
# change raster into dataframe
df_CHN_masked=as.data.frame(CHN_masked,xy=T) 
colnames(df_CHN_masked)=c("x","y","LandCover")
  
# change SpatialPolygonsDataFram into dataframe
CHNshp = fortify(CHN_sp)

# Method 1
ggplot(df_CHN_masked  %>% na.omit() ) +
  geom_raster(aes(x,y,fill=LandCover))+
  scale_fill_gradientn(colours=c("grey","green")) +
  coord_quickmap()+
  geom_polygon(data = CHNshp, aes(long, lat, group = group),
             fill=NA,color="grey50", size=0.1)

# Method 2
ggplot(df_CHN_masked  %>% na.omit() ) +
  geom_tile(aes(x,y,fill=LandCover))+
  scale_fill_gradientn(colours=c("grey","blue")) +
  geom_sf(data=CHN,size=1,fill=NA) 

# with the county seat
#source1
Chinamap=read_sf("https://gw.alipayobjects.com/os/rmsportal/JToMOWvicvJOISZFCkEI.json")
ggplot()+
  geom_sf(data=Chinamap)

ggplot(df_CHN_masked  %>% na.omit() ) +
  geom_tile(aes(x,y,fill=LandCover))+
  scale_fill_gradientn(colours=c("grey","blue")) +
  geom_sf(data=Chinamap,size=0.2,fill=NA,color="black")

  • 25
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

辣椒种子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值