全球の地面を眺める

全部、無保証です。ご自由に使っていただいて結構ですが、 ご自分の責任でお使い下さい。

標高

標高データを集めた新しいデータとして、アメリカの National Geophysical Data Center (NGDC) が配布している ETOPO1 Global Relief Model というのがある。
過去の ETOPO2 や ETOPO5 などの発展形である。 これを使ってみようと思う。

とりあえずいくつもある選択肢から

を選んで、 ここ からダウンロードした。

これをただ読み出すソフトは、例えばこんな風に書ける。(gfortran43 on FreeBSD)
filename='../Binary/etopo1_ice_g.flt' で読み込みファイルを指定している事に注意!

! ncols         21601
! nrows         10801
! xllcorner     -180.00833333334
! yllcorner     -90.008333333335
! cellsize      0.01666666667
! NODATA_value  -9999
! byteorder     LSBFIRST
! 

module params
implicit none
integer, parameter :: ncols=21601, nrows=10801
real*8, parameter   :: xllcorner=-180.00833333334, yllcorner=-90.008333333335
real*8, parameter   :: cellsize= 0.01666666667
real*4, parameter   :: nodata = -9999
end module

program readetopo
use params
implicit none
!
real*4              :: height(ncols)
real*8              :: posx, posy
integer             :: i, j
character(len=80)   :: filename
!
filename='../Binary/etopo1_ice_g.flt'

open(file=filename, unit=10, status='old', &
	access='direct', recl=4*ncols, form='unformatted')


do j=1, nrows
  read(10, rec=j) (height(i), i=1, ncols)
 do i=1, ncols
 call position( i, j, posx, posy )
! if( posy > 30 .AND. posy < 40 .and. posx > 130 .and.  posx < 140 ) then
 write(*,*) posx, posy, height(i)
!  end if
 end do
end do

close(10)

end

subroutine position( i, j, posx, posy )
use params
implicit none
integer :: i,j
real*8  :: posx, posy

posx = xllcorner+(i-1)*cellsize+cellsize/2
posy = yllcorner+(j-1)*cellsize+cellsize/2

end
さすがに、全部を1つの配列と言う訳には行かなかった。
これは、自動変数をスタック領域という狭い領域に確保するからで、 この問題を避けるためには、動的配列を使えば良い。
このようなプログラムになる。
module params
implicit none
integer, parameter :: ncols=21601, nrows=10801
real*8, parameter   :: xllcorner=-180.00833333334, yllcorner=-90.008333333335
real*8, parameter   :: cellsize= 0.01666666667
real*4, parameter   :: nodata = -9999
end module

program readetopo
use params
implicit none
!
real*4, allocatable              :: height(:, :)
real*8              :: posx, posy
integer             :: i, j
character(len=80)   :: filename
!
filename='../Binary/etopo1_ice_g.flt'

allocate(height(1:ncols, 1:nrows) )

open(file=filename, unit=10, status='old', &
	access='direct', recl=4*ncols, form='unformatted')


do j=1, nrows
  read(10, rec=j) (height(i,j), i=1, ncols)
 do i=1, ncols
 call position( i, j, posx, posy )
! if( posy > 30 .AND. posy < 40 .and. posx > 130 .and.  posx < 140 ) then
 write(*,*) posx, posy, height(i,j)
!  end if
 end do
end do

close(10)

end

subroutine position( i, j, posx, posy )
use params
implicit none
integer :: i,j
real*8  :: posx, posy

posx = xllcorner+(i-1)*cellsize+cellsize/2
posy = yllcorner+(j-1)*cellsize+cellsize/2

end
こちらの方が、メモリを多く使うが、さまざまな処理に便利である。 これらを素材に、さまざなな加工を行うつもり。(2009.8.12)

たとえばヒストグラム

etopo1 の標高のヒストグラム(頻度分布)を作ってみる。 プログラムはここ

このような分布がでてきて、海面付近がもっとも多い事がわかる。

玉川のページ 研究室 流域圏科学研究センター 社会基盤工学科 岐阜大学