- 积分
- 1104
- 贡献
-
- 精华
- 在线时间
- 小时
- 注册时间
- 2016-9-23
- 最后登录
- 1970-1-1
|

楼主 |
发表于 2016-11-11 21:00:14
|
显示全部楼层
本帖最后由 毕业两年的小白 于 2016-11-11 21:07 编辑
不好意思,个人觉得站点数据可以正常出图,应该不是转换二进制的问题。不过还是贴出来源代码吧,请各位大神给诊断诊断。
代码比较啰嗦,不好意思啊。
数据就不贴了,给两张图吧:
下面这张是我代码中的 f1sta:站点经纬度表
下面这张是我代码中的f2txt:数据文件,其特点是先排列站点,每个站点的所有时次都列完后再列下一个站点的。每一行依次是:站号+时间+6个变量。
下面是我的代码:
program Catch_staID
implicit none
! 定义变量
! ###########################################################
! 手动输入1/2
integer,parameter :: T=24 !数据文件共T个时次
integer,parameter :: Numvar=6 !数据文件共Numvar个变量
integer,parameter :: X=720, Y=361, Z=1 !格点文件共有X*Y*Z个格点
integer,parameter :: NumofStation_Id_1=2170 !站点信息文件中共有NumofStation_Id_1个站点
! ###########################################################
integer :: i,j,k,l,m,Line,Numsta
real :: tim
integer ::nlev,flag
! 下面的变量指的是各个文件的路径
character (len=80) :: f1sta,f2txt,f3dat,f4grd,f5ctl,f6map,f7grdctl
character (len=1) :: keyboard
! 下面的变量指的是站点文件
Character*8, dimension(NumofStation_Id_1) :: Station_Id_1
real, dimension(NumofStation_Id_1) :: Lat,Lon
! 下面的变量指的是数据文件,数组大小可酌情增减
Character*8,dimension(6000) :: Station_Id_2
integer, dimension(6000,4) ::Time
real, dimension(6000,Numvar) :: Var
real, dimension(6000) :: Lat2,Lon2
! 下面的变量指的是格点文件
real, dimension(X,Y,Z,Numvar,T) :: vargrd
vargrd=1.0
! ###########################################################
! 手动输入2/2:输入路径\文件名.后缀名
f1sta='F:\My_Fortran\中国地面气象台站表 :SURF_CHN_MUL_HOR_STATION.txt' !站点信息文件的路径
f2txt='C:\Users\Administrator\Desktop\T.txt' !TXT数据文件的路径
f3dat='C:\Users\Administrator\Desktop\T.dat' !二进制站点数据的路径
f4grd='C:\Users\Administrator\Desktop\T-grd.dat' !转换后的格点数据的路径
! ###########################################################
! 先求出数据文件中 有 效 数 据 的行数
open(12,file=f2txt,status='old')
Line=0
do while(.not.eof(12))
read(12,*)
Line=Line+1
enddo
Line=Line-1
print*,'--> 数据文件中有效数据共',Line,'行'
close(12)
! 求数据文件站点总数
Numsta=Line/T
! 开始一连串工作^_^
open(11,file=f1sta,status='old')
open(12,file=f2txt,status='old')
open(13,file=f3dat,status='replace',form='binary')
open(14,file=f4grd,status='replace',form='binary')
! 读取站点经纬度信息11到各个数组
read(11,*)
do i=1,NumofStation_Id_1
read(11,*) Station_Id_1(i),Lat(i),Lon(i)
! print*, Station_Id_1(i),Lat(i),Lon(i)
enddo
print*, '1/6:站点信息表读取完毕'
! 读取数据文件12到各个数组
read(12,*)
do i=1,Line
read(12,*) Station_Id_2(i),Time(i,:),Var(i,:)
! print*, Station_Id_2(i),Time(i,:),Var(i,:)
enddo
print*,'2/6:数据文件读取完毕'
! 检查数据文件是否有误
i=0
do while(i<=Line-1)
i=i+1
do while(Station_Id_2(i)==Station_Id_2(i+1))
i=i+1
enddo
if(MOD(i,T)==0)then
cycle
else
print*,'!!! 数据文件有误,站号为:',Station_Id_2(i)
stop
endif
enddo
print*,'3/6:数据文件检查完毕,行数无错误'
! 从(11)Station_Id_1中查找(12)Station_Id_2对应的经纬度
do i=1,Line
do j=1,NumofStation_Id_1
if ( Station_Id_2(i)==Station_Id_1(j) ) then
Lat2(i)=Lat(j)
Lon2(i)=Lon(j)
! write(*,*) i,Station_Id_2(i),Lat2(i),Lon2(i)
endif
enddo
enddo
print*,'4/6:完成经纬度查找与匹配'
! 给dat文件赋值
do i=1,T
tim=0.0
nlev=1
flag=1
do j=0,Numsta-1
write(13) Station_Id_2(j*T+i),Lat2(j*T+i),Lon2(j*T+i),tim,nlev,flag,Var(j*T+i,:)
! print*, j,'-->',Station_Id_2(j*T+i),Lat2(j*T+i),Lon2(j*T+i),tim,nlev,flag,Var(j*T+i,:)
enddo
nlev=0
write(13) Station_Id_2((Numsta-1)*T+i),Lat2((Numsta-1)*T+i),Lon2((Numsta-1)*T+i),tim,nlev,flag
! print*, j,'-->',Station_Id_2((Numsta-1)*T+i),Lat2((Numsta-1)*T+i),Lon2((Numsta-1)*T+i),tim,nlev,flag
! pause
enddo
print*,'5/6:成功写入二进制文件,开始转换格点文件……'
!
! 转换出格点文件*-grd.dat
do l=1,T
do m=1,Numvar
do k=1,Z
do j=1,Y
do i=1,X
write(14) vargrd(i,j,k,m,l)
enddo
enddo
enddo
enddo
enddo
print*,'6/6:完成格点文件转换'
close(14)
close(13)
close(12)
close(11)
end program Catch_staID
|
|