保存版 サルでも分かる国土数値情報マニュアル


目次
1.はじめに
2.元データについて
3.作業の流れ,注意点
4.プログラムについて

1.はじめに

RAMSの計算に必要な標準ファイルとしては,標高 海陸比 植生分布 土壌分布の4種類が必要です.そのために,全国の国土数値情報データを切り出し,並べ替える作業が必要となります.ここでは,標準ファイルを作成するまでの過程を説明します.
なお,ここで述べるすべてのファイルはcpus.cc.titech.ac.jp(131.112.3.7)のyinoueにあるものです.使うときには井上に申し出てください.


2.元データについて

4種類の標準ファイルを作るための元データは2種類です.1つは標高ファイル,もう一つは土地利用ファイルです.土地利用から,海陸比,植生分布,土壌分布の3種類をつくります.下に,元データファイルの情報を示します.
標高ファイル 土地利用ファイル
ファイル名 height1.dat ks202
パス(cpus) ~yinoue/height/ ~yinoue/map/
解像度 250M 100M

なお,両者はlha形式で圧縮してあります.それぞれ,height1.lzhとks202.lzhです.解凍コマンド
lha xvf height1.lzh(ks202.lzh)
により解凍してください.


3.作業の流れ,注意点

 元データがそろったら,切り出す領域(標準ファイルを必要とする領域)を決めます.これは,数値地図ユーザーズガイド2ページ目にある地図を参考にしてください.1度×2/3度のメッシュ単位で領域を選択するのですが,このときに南北方向のメッシュ数は3で割り切れる数にしておいてください.あとで,1度×1度に直す必要があるからです.

 領域を決めたらプログラムにより,元データから切り出しを行います.流れとしては,切り出し→並び替えとまとめ→標準ファイル作成,となっており,3つのプログラムを動かすことになります.
 ここで,250Mや100Mといった最も細かい解像度のデータをそのまま使う場合と,ある程度の間引きをかけて1kmメッシュに直して使う場合の2種類のプログラムを用意してあります.当然ですが,細かい方がファイルサイズが大きくなります.計算解像度等,考えてどちらを使うか決めましょう.
 ただし,海陸比の標準ファイルを作成する場合は1kmメッシュのものしか作成できません.

以下に,使うべきプログラム名と解像度等の対応を記しておきます.
~yinoue/height/height-11.f 標高切り出し 250M
~yinoue/height/test/height-12.f 1000M
~yinoue/height/height-21.f 標高並び替え&まとめ 250M
~yinoue/height/test/height-22.f 1000M
~yinoue/map/ks202-11.f 土地利用切り出し(植生・土壌) 100M
~yinoue/map/test/ks202-12.f 〃(植生・土壌) 1000M
~yinoue/map/test/ks202-13.f 〃(海陸比) 1000M
~yinoue/map/ks202-21.f 土地利用並び替え&まとめ(植生・土壌) 100M
~yinoue/map/test/ks202-22.f 〃(植生・土壌) 1000M
~yinoue/map/test/ks202-23.f 〃(海陸比) 1000M


4.プログラムについて

各プログラムの説明の中で実際に使うときに,どこを自分で変更する必要があるか,という点をまとめてみます.見ての通り,変更はすべて同じ1行のみです.

標高,250Mメッシュ

    1.heigh-11.f
      これは250M用の標高データ切り出しプログラムですが,どの領域を切り出す必要があるのか,という情報を各自書き直す必要があります.
      プログラムの3行目のパラメータで南北方向,東西方向の切り出しサイズを国土数値情報独自のメッシュコードで指定するので,各自ここの値を変更してください.ただし,南北方向は切り出すメッシュの数が3の倍数でないといけません.(後で間引くため)
      切り出しは1度×2/3度(1次メッシュ)ごとにファイルを作成して切り出しを行います.それぞれのファイル名には,1次メッシュコードがそのまま付くようになっています.(メッシュコードは数値地図ユーザーズガイドを参照のこと)
    2.height-21.f
      これは250M用の切り出しデータを並び替えてひとまとめにするプログラムです.
      変更点は,3行目のパラメータです.まとめる際に使う領域を1次メッシュコードで指定します.

標高,1000Mメッシュ

    3.height-12.f
      これは1000M用の標高切り出しプログラムですが,ほとんどheight-11.fと変わりません.各自の変更点もheight-11.fと同じです.
    4.height-22.f
      これは1000M用の切り出しデータを並び替えてひとまとめにするプログラムで,height-21.fと変更点は同じです.

土地利用(植生・土壌),100Mメッシュ

    5.ks202-11.f
      これは100M用の土地利用切り出しプログラムですが,基本的にはheight-11と変わりません.変更点も同じで,プログラムの3行目のパラメータで南北方向,東西方向の切り出しサイズを国土数値情報独自のメッシュコードで指定するので,各自ここの値を変更してください.ただし,南北方向は切り出すメッシュの数が3の倍数でないといけません.(後で間引くため)
    6.ks202-21.f
      これは100M用の切り出しデータを並び替えてひとまとめにするプログラムです.
      変更点は,3行目のパラメータです.まとめる際に使う領域を1次メッシュコードで指定します.

土地利用(植生・土壌),1000Mメッシュ

    7.ks202-12.f
      これは1000M用の土地利用切り出しプログラムですが,ほとんどks202-11.fと変わりません.各自の変更点もks202-11.fと同じです.
    8.ks202-22.f
      これは1000M用の切り出しデータを並び替えてひとまとめにするプログラムです.
      各自の変更点はks202-21.fと同様で,パラメータの部分のみです.

土地利用(海陸比),1000Mメッシュ

    9.ks202-13.f
      元データは7.ks202-12.fと同じなんですが,海陸比を計算する切り出し用プログラムです(1000M用のみ).変更点は同じで,プログラムの3行目のパラメータで南北方向,東西方向の切り出しサイズを国土数値情報独自のメッシュコードで指定するので,各自ここの値を変更してください.ただし,南北方向は切り出すメッシュの数が3の倍数でないといけません.(後で間引くため)
    10.ks202-23.f
      海陸比の切り出しデータを並び替えてひとまとめにするプログラムです.各自の変更点は,3行目のパラメータです.まとめる際に使う領域を1次メッシュコードで指定します.


      program height_11(250m)
      

      parameter(latmin=48,latmax=59,lonmin=36,lonmax=42)
 切り出す領域にあわせてこのパラメータを変更する
      integer fnum,nn,E,N,d1,d2,d3,d4,dd
      integer data(16),dat(6400,16)
      character fname*4
      fnum=0
      
      do L=latmin,latmax
       do M=lonmin,lonmax
       open(100,file='height1.dat',status='old')

        dd=0
        fnum=fnum+1
        ii=int(100*L+M)
        write(fname,200) ii
 200    format(i4.4)
        write(*,*) fname
        open(fnum,file=fname,status='unknown')
        
        do i=1,6400
         do k=1,16
          dat(i,k)=0
         end do
        end do
        
 10   continue
      read(100,110,end=20) N,E,d1,d2,d3,d4,(data(k),k=1,16)
 110  format(4x,3x,2i2,4i1,16(i4,x))
         if ((N.eq.L).and.(E.eq.M)) then
         dd=(d1*8+d2)*100+d3*10+d4
         
         do i=1,16
      if (data(i).eq.9999.or.data(i).eq.8888.or.data(i).eq.7777) then
      data(i)=0
      elseif (data(i).eq.6666) then
      data(i)=5
      end if
         end do
          do j=1,4
           do k=1,4
            dat(dd+1,4*(j-1)+k)=data(k+12-4*(j-1))
           end do
          end do
         endif
         
         if (((N.gt.L).and.(E.gt.M)).or.(dd.eq.6399)) then
          go to 20
         endif
      go to 10
 20   continue

          do j=1,6400
           write(fnum,120) j,(dat(j,k),k=1,16)
          end do
 120  format(i4,16i4)
        close(fnum)
        close(100)
       end do
      end do
      
      stop
      end


      program height_21(250m)
      

      parameter(latmin=48,latmax=59,lonmin=36,lonmax=42)
 まとめる領域にあわせてこのパラメータを変更する
      integer fnum1,fnum2,lat,lon,x,y,P,Q,R
      integer data1(320,320)
      integer data2(latmax-latmin+1,lonmax-lonmin+1,320,320)
      character fname1*4,fname3*15
      fnum1=0
      fname3='all_topo.dat'
      
      do lat=latmin,latmax
       do lon=lonmin,lonmax
       
        fnum1=fnum1+1
        
        ii=int(100*lat+lon)
        write(*,*) ii
        write(fname1,100) ii
 100    format(i4.4)
        open(fnum1,file=fname1,status='old')
        do m=1,8
         do l=1,8
          do j=10*(m-1)+1,10*m
           do i=10*(l-1)+1,10*l
            read(fnum1,200) ((data1(x,y),x=4*(i-1)+1,4*i),
     +                     y=4*(j-1)+1,4*j)
 200  format(4x,16i4)
           end do
          end do
         end do
        end do
       
        do y=1,320
         do x=1,320
          data2(lat-(latmin-1),lon-(lonmin-1),y,x)=data1(x,y)
         end do
        end do
       

       close(fnum1)
       end do
      end do
      
      open(200,file=fname3,status='unknown')

      Q=0
      R=0
      do lon=1,(lonmax-lonmin+1)
      write(*,*) lon
       do x=1,320
       P=0
        do lat=1,(latmax-latmin+1)
         do y=1,320
          if (mod(y+Q,3).ne.2) then
           P=P+1
           write(200,250) x+R,P,data2(lat,lon,y,x)
 250  format(2i6,i5)
          end if
         end do
        Q=Q+320
        end do
       end do
      R=R+320
      end do
      
      stop
      end


      program ks202_11(100m)
      

      parameter(latmin=48,latmax=59,lonmin=36,lonmax=42)
 切り出す領域にあわせてこのパラメータを変更する
      integer fnum,nn,E,N,d1,d2,d3,d4,dd
      integer data(100),dat(6400,100)
      character fname*4
      fnum=0

      do L=latmin,latmax
       do M=lonmin,lonmax
       open(100,file='ks202',status='old')

        dd=0
        fnum=fnum+1
        ii=int(100*L+M)
        write(fname,200) ii
 200    format(i4.4)
        write(*,*) fname
        open(fnum,file=fname,status='unknown')
        
        do i=1,6400
         do k=1,100
          dat(i,k)=15
         end do
        end do
        
 30     continue
         read(100,110,end=20) N,E,d1,d2,d3,d4,(data(k),k=1,100)
 110  format(2i2,4i1,100i2)
 
         if ((N.eq.L).and.(E.eq.M)) then
         dd=(d1*8+d2)*100+d3*10+d4
          do k=1,100
           dat(dd+1,k)=15
          end do
          do k=1,100
           dat(dd+1,k)=data(k)
          end do
         endif
         
         if (((N.gt.L).and.(E.gt.M)).or.(dd.eq.6399)) then
          go to 20
         endif

        go to 30
 20    continue

         do j=1,6400
         write(fnum,120) j,(dat(j,k),k=1,100)
 120  format(i4,100i2)
         end do

        close(fnum)
        close(100)
       end do
      end do
      
      stop
      end


      program ks202_21
      

      parameter(latmin=48,latmax=59,lonmin=36,lonmax=42)
 まとめる領域にあわせてこのパラメータを変更する
      integer fnum1,fnum2,lat,lon,x,y,P,Q,R
      integer data1(800,800)
      integer data2(latmax-latmin+1,lonmax-lonmin+1,800,800)
      character fname1*4,fname3*15
      fnum1=0
      fname3='all_land.dat'
      
      do lat=latmin,latmax
       do lon=lonmin,lonmax
       
        fnum1=fnum1+1
        
        ii=int(100*lat+lon)
        write(*,*) ii
        write(fname1,100) ii
 100    format(i4.4)
        open(fnum1,file=fname1,status='old')
        do m=1,8
         do l=1,8
          do j=10*(m-1)+1,10*m
           do i=10*(l-1)+1,10*l
            read(fnum1,200) ((data1(x,y),x=10*(i-1)+1,10*i),
     +                     y=10*(j-1)+1,10*j)
 200  format(4x,100i2)
           end do
          end do
         end do
        end do
       
        do y=1,800
         do x=1,800
          data2(lat-(latmin-1),lon-(lonmin-1),y,x)=data1(x,y)
         end do
        end do
       

       close(fnum1)
       end do
      end do
      
      open(200,file=fname3,status='unknown')

      Q=0
      R=0
      do lon=1,(lonmax-lonmin+1)
      write(*,*) lon
       do x=1,800
       P=0
        do lat=1,(latmax-latmin+1)
         do y=1,800
          if (mod(y+Q,3).ne.2) then
           P=P+1
           write(200,250) x+R,P,data2(lat,lon,y,x)
 250  format(2i6,i3)
          end if
         end do
        Q=Q+800
        end do
       end do
      R=R+800
      end do
      
      stop
      end


      program ks202_13
      

      parameter(latmin=48,latmax=62,lonmin=34,lonmax=44)
 切り出す領域にあわせてこのパラメータを変更する
      integer fnum,nn,E,N,d1,d2,d3,d4,dd
      integer data(100),dat(6400),c(15)
      real pctdat(6400)
      character fname1*7
      fnum=0
      
      do L=latmin,latmax
       do M=lonmin,lonmax
       open(100,file='../ks202',status='old')

        dd=0
        fnum=fnum+1
        ii=int(100*L+M)
        write(fname1,200) ii
 200    format('pct',(i4.4))
        write(*,*) fname1
        open(fnum,file=fname1,status='unknown')
        
        do i=1,6400
          pctdat(i)=0.
        end do
 30     continue
         read(100,110,end=20) N,E,d1,d2,d3,d4,(data(k),k=1,100)
 110  format(2i2,4i1,100i2)

         if ((N.eq.L).and.(E.eq.M)) then
         dd=(d1*8+d2)*100+d3*10+d4
        do i=dd+1,6400
          pctdat(i)=0.
        end do

          do nc=1,15
          c(nc)=0
           do kk=1,100
            if (data(kk).eq.nc) c(nc)=c(nc)+1
           end do
          end do
          pctdat(dd+1)=1.-real(c(15))/100.
         end if

         if (((N.gt.L).and.(E.gt.M)).or.(dd.eq.6399)) then
          go to 20
         end if
        go to 30
 20    continue

         do j=1,6400
         write(fnum,120) j,pctdat(j)
 120  format(i4,f10.1)
         if ((pctdat(j).gt.1).or.(pctdat(j).lt.0)) then 
         write(*,*)'out of range',j,pctdat(j)
         end if
         end do

        close(fnum)
        close(100)
       end do
      end do
      
      stop
      end


      program ks202_23
      

      parameter(latmin=48,latmax=62,lonmin=34,lonmax=44)
 まとめる領域にあわせてこのパラメータを変更する
      integer fnum1,fnum2,lat,lon,x,y,P,Q,R
      real data1(80,80)
      real data2(latmax-latmin+1,lonmax-lonmin+1,80,80)
      character fname1*7,fname3*15
      fnum1=0
      fname3='all_pct.dat'
      
      do lat=latmin,latmax
       do lon=lonmin,lonmax
       
        fnum1=fnum1+1
        
        ii=int(100*lat+lon)
        write(*,*) ii
        write(fname1,100) ii
 100    format('pct',(i4.4))
        open(fnum1,file=fname1,status='old')
        do m=1,8
         do l=1,8
          do j=10*(m-1)+1,10*m
           do i=10*(l-1)+1,10*l
            read(fnum1,200) data1(i,j)
 200  format(4x,f10.1)
           end do
          end do
         end do
        end do
       
        do y=1,80
         do x=1,80
          data2(lat-(latmin-1),lon-(lonmin-1),y,x)=data1(x,y)
         end do
        end do
       

       close(fnum1)
       end do
      end do
      
      open(200,file=fname3,status='unknown')

      Q=0
      R=0
      do lon=1,(lonmax-lonmin+1)
      write(*,*) lon
       do x=1,80
       P=0
        do lat=1,(latmax-latmin+1)
         do y=1,80
          if (mod(y+Q,3).ne.2) then
           P=P+1
           write(200,250) x+R,P,data2(lat,lon,y,x)
 250  format(2i6,f3.1)
          end if
         end do
        Q=Q+80
        end do
       end do
      R=R+80
      end do
      
      stop
      end