金子邦彦研究室3次元,地図地図データ国土地理院基盤地図情報・数値標高モデルのダウンロード,CSV ファイルへの変換

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

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

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

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

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

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

    [image]

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

    [image]

  4. 条件を確認する

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

    [image]

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

    [image]

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

    [image]

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

    [image]

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

    [image]

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

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

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

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

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

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

    [image]

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

    [image]

  4. ログイン操作を行う

  5. アンケートへの回答

    [image]

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

    [image]

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

    [image]

  8. データを選択する

    [image]

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

    [image]

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

    [image]

  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))