爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 14824|回复: 5

[源代码] nc全球数据中国区域的提取

[复制链接]

新浪微博达人勋

发表于 2019-6-13 12:51:57 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
个人需要从全球数据中提取中国的,找遍全网,没一个能用的。有个人发布的什么matlab的视频,说的天花乱坠,反正我下载下来看完基本什么用没有。
说下思路,新建空的nc文件,通过中国的0.5格点经纬度,去全球数据中找对应的,然后摘到新建的nc文件里去。
我自己的数据不是单个的变量,有五个,所以新建的变量比较多。中国格点放到txt里了

代码:
import numpy as np
from netCDF4 import Dataset



dataset = Dataset('E:/0China/waterBodiesChina.nc','w',format='NETCDF4_CLASSIC') #创建一个nc文件
lat = dataset.createDimension('lat',360)
lon = dataset.createDimension('lon',720)
time = dataset.createDimension('time',None)#相关维度的创建
#创建变量
latitudes = dataset.createVariable('latitude',np.float32,('lat'))
longitudes = dataset.createVariable('longitude',np.float32,('lon'))
times = dataset.createVariable('time',np.float32,('time'))
fracWaterInp = dataset.createVariable('fracWaterInp',np.float32,('lat','lon','time'))
resMaxCapInp = dataset.createVariable('resMaxCapInp',np.float32,('lat','lon','time'))
resSfAreaInp = dataset.createVariable('resSfAreaInp',np.float32,('lat','lon','time'))
waterBodyIds = dataset.createVariable('waterBodyIds',np.float32,('lat','lon','time'))
waterBodyTyp = dataset.createVariable('waterBodyTyp',np.float32,('lat','lon','time'))
#变量参数设置
latitudes.units = 'degree_north'
longitudes.units = 'degree_east'
times.units = 'days since  2000-01-01 00:00:00'
times.calendar = 'gregorian'
fracWaterInp.units = '-'
resMaxCapInp.units = '10^6 m3'
resSfAreaInp.units = '10^6 m2'
waterBodyIds.units = '-'
waterBodyTyp.units = '-'

#创建经纬度矩阵
lats = np.arange(89.75,-89.75-0.5,-0.5)#创建矩阵
lons = np.arange(-179.75,179.75+0.5,0.5)
latitudes[:] = lats
longitudes[:] = lons

def loadData(fileName):
    inFile = open(fileName,'r')

    LON = []
    LAT = []


    for line in inFile:
        position = line.split()#每行数据按照空格分开成两部分
        LON.append(position[0])
        LAT.append(position[1])

    return LON,LAT

LON,LAT = loadData('E:/0China/China_0.5.txt')

source = Dataset('E:/0China/waterBodies30min.nc')


A = np.zeros((360,720),dtype=float)#创建0矩阵
A[A==-0] =np.nan#全部替换成空值

#from datetime import datetime
import arrow
from netCDF4 import date2num

#添加时间
for count in range(11):#原始数据是从1901-2010,我需要2000-2010,所以最后赋值的时候出现count+100,原始数据的第100层等于新数据第一层

    date = arrow.Arrow(2000,1,1).shift(years = count)
    times_data = date.naive
    times[count] = date2num(times_data, units=times.units, calendar = times.calendar)


    fracWaterInp[:,:,count] = A
    resMaxCapInp[:,:,count] = A
    resSfAreaInp[:,:,count] = A
    waterBodyIds[:,:,count] = A
    waterBodyTyp[:,:,count] = A


     for lo in range (3877):
          LONX = (float(LON[lo])+0.25)*2+359#经纬度转nc矩阵行列号,如果用xarray可以不用转,我没有用那个,用的笨法子
          LATX = (89.75-float(LAT[lo]))*2
          fracWaterInp[LATX,LONX,count] = source.variables['fracWaterInp'][count+100,LATX,LONX]
          resMaxCapInp[LATX,LONX,count] = source.variables['resMaxCapInp'][count+100,LATX,LONX]
          resSfAreaInp[LATX,LONX,count] = source.variables['resSfAreaInp'][count+100,LATX,LONX]
          waterBodyIds[LATX,LONX,count] = source.variables['waterBodyIds'][count+100,LATX,LONX]
          waterBodyTyp[LATX,LONX,count] = source.variables['waterBodyTyp'][count+100,LATX,LONX]




dataset.close()


China_0.5.txt

51.49 KB, 下载次数: 13, 下载积分: 金钱 -5

售价: 2 贡献  [记录]

评分

参与人数 1金钱 +2 收起 理由
chengd + 2 赞一个!

查看全部评分

密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2019-6-13 13:54:10 | 显示全部楼层
搞这么复杂干嘛,cdo一行解决了
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2019-6-13 14:22:34 | 显示全部楼层
不会使,只是自己这么摸索出来的
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2020-2-6 10:36:22 | 显示全部楼层
werewolf 发表于 2019-6-13 13:54
搞这么复杂干嘛,cdo一行解决了

cdo应该怎么操作?
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2020-2-13 18:44:14 | 显示全部楼层
好复杂
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2020-7-10 18:23:13 | 显示全部楼层
请问你这个数据是全球水库水体数据集合吗?哪里可以下载?
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表