国土地理院基盤地図情報・数値標高モデルのダウンロード,CSV ファイルへの変換

国土地理院の共通ID,パスワードの発行を受ける

利用条件などは,利用者で確認すること.

  1. 基盤地図情報サイトのページを開く

    https://www.gsi.go.jp/kiban/index.html

  2. 基盤地図情報のダウンロード」をクリック

  3. 新規登録」をクリック

  4. 条件を確認する

    同意する場合は続行する.

  5. 所定の項目を記入して,「登録確認へ」をクリック.

  6. 登録内容を確認して,「登録する」をクリック.

  7. 電子メールで送られてきた指示に従って,本登録を行う

  8. 画面で登録完了を確認する.

  9. 電子メールで ID とパスワードが通知されるので確認する.

基盤地図情報のダウンロード

利用条件などは,利用者で確認すること.

  1. 基盤地図情報サイトのページを開く

    https://www.gsi.go.jp/kiban/index.html

  2. 基盤地図情報のダウンロード」をクリック

  3. ログイン 」をクリック

  4. ログイン操作を行う
  5. アンケートへの回答

  6. 「ダウンロード」のところで,「数値標高モデル」の 「ファイル選択へ」をクリック

  7. 検索条件を指定する.

  8. データを選択する

  9. 選択リストを確認し, 「ダウンロードファイル確認へ」をクリック

  10. ダウンロードしたいものを選び,ダウンロードする

  11. ファイルがダウンロードされるので,確認する.

FG GML DEM データ前処理(C プログラム)

FG GML DEM データを次の手順で csv ファイルに変換するプログラム(C プログラム)

/* usage: ./a.out FG-GML-5130-05-dem10b-20090201.xml */
#include<stdio.h>

int main(int argc, char **argv) 
{ 
  FILE *fp;
  char* header_name= "header.txt";
  char buf[1000];

  int low_x, low_y; 
  int high_x, high_y; 
  float lower_corner_x, lower_corner_y; 
  float upper_corner_x, upper_corner_y; 
  int state; 
  int i, j; 

  /* read header */

  fp = fopen( header_name, "r" );
  if ( fp == NULL ) {
    fprintf(stderr, "error, %s", header_name); 
    return -1;
  }

  fgets(buf, sizeof(buf), fp);
  sscanf(buf, "%d %d", &low_x, &low_y); 
  fgets(buf, sizeof(buf), fp);
  sscanf(buf, "%d %d", &high_x, &high_y); 
  fgets(buf, sizeof(buf), fp);
  sscanf(buf, "%f %f", &lower_corner_x, &lower_corner_y); 
  fgets(buf, sizeof(buf), fp);
  sscanf(buf, "%f %f", &upper_corner_x, &upper_corner_y); 
  close(fp);
  
  printf("low_x, low_y, high_x, high_y, lower_corner_x, lower_corner_y, upper_corner_x, upper_corner_y\n");
  printf("%d, %d, ", low_x, low_y); 
  printf("%d, %d, ", high_x, high_y); 
  printf("%f, %f, ", lower_corner_x, lower_corner_y); 
  printf("%f, %f\n", upper_corner_x, upper_corner_y); 

  /* open data file */

  fp = fopen( argv[1], "r" );
  if ( fp == NULL ) {
    fprintf(stderr, "error"); 
    return -1;
  }

  i = 0; 
  j = 0; 
  state = 0;
  while (fgets(buf, sizeof(buf), fp) != NULL) {
    if ( state == 0 ) {
      if (strcmp("<gml:tupleList>\r\n", buf) == 0) {
	state = 1;
      }
    }
    else if ( state == 1 ) {
      if (strcmp("</gml:tupleList>\r\n", buf) == 0) {
	state = 2;
      }
      else {
        if ( j < high_y ) {
  	  printf("%d,%d,%s", i, j, buf);
          i++;
          if ( i > high_x ) {
            i = 0; 
            j++;
          }
        }
      }
    }
  }
}

複数ファイルの一括変換のための bash スクリプト

#!/bin/bash
cp FG_GML_DEM5福岡.zip /tmp 
cd /tmp 
unzip FG_GML_DEM5福岡.zip
unzip FG-GML-5030-05-DEM5B.zip 

for i in *.xml; do
  echo $i
  rm -f /tmp/header.txt
  touch /tmp/header.txt
  grep ''      $i | sed 's/gml:low//g'  | sed 's/<>//g' | sed 's/<\/>//g' >> /tmp/header.txt
  grep ''     $i | sed 's/gml:high//g' | sed 's/<>//g' | sed 's/<\/>//g' >> /tmp/header.txt
  grep ''      $i | sed 's/gml:lowerCorner//g'  | sed 's/<>//g' | sed 's/<\/>//g' >> /tmp/header.txt
  grep ''      $i | sed 's/gml:upperCorner//g'  | sed 's/<>//g' | sed 's/<\/>//g' >> /tmp/header.txt

#
  rm -f /tmp/a.xml 
  nkf -w $i > /tmp/a.xml
  ./a.out /tmp/a.xml > `basename $i .xml`.csv
done

Rシステムを用いてプロット

#!/bin/bash

rm -f /tmp/a.$$.csv
for i in *.csv; do
  cat $i | sed 's/-9999.00/-0.9999/g' | tail -n +3 > /tmp/a.$$.csv
  cp /tmp/a.$$.csv $i
done

require(data.table)
require(ggplot2)
T <- data.table( read.csv("FG-GML-5030-05-91-DEM5B-20110915.csv", header=FALSE, as.is=TRUE) )
ggplot(T, aes(x=V1, y=V2, fill=V4)) + geom_tile() + scale_fill_gradientn("frequency", colours = terrain.colors(100))