忍者ブログ
バナヤンの忍者風呂
忍者ブログのカスタマイズ、各種WEBツールのテストなど試行錯誤の日々。 VMLによる地図の作成を研究していましたが、一時中断して、今はPHPを勉強しているところです。
ニュース
この欄には、このブログの内容に関連するニュースを掲載する予定です。
お知らせ
この欄には管理人からのお知らせなどを掲載します。
[10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20]

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

国土数値情報。データの取り込み。

国土数値情報のデータを活用できれば、正確な情報をたくさん活用できるようになります。地図を作るときも非常に楽になるはずです。国土数値情報をどのように取り込めばいいか考えてみました。

国土数値情報のダウンロード

国土数値情報は、地形、土地利用、公共施設、道路、鉄道等国土に関する様々な地理的情報を数値化したもので、国土数値情報ダウンロードサービスのサイトからダウンロードすることができます。

国土数値情報のダウンロードにあたっては、国土数値情報利用約款を遵守することが求められます。いろいろなことが書かれていますが、利用者が知っておくべきポイントは次のものでしょう。

・転載・引用
  ファイル名、年度・地域等の明記
・編集・加工、その成果物の頒布・譲渡・貸与
  自由
・国土数値情報の各ファイル・データを複製しての頒布・譲渡・貸与
  禁止。ファイル形式を変換しての複製も禁止

複製とは言えないような編集・加工を行い、ファイル等の明記を行えば、国土数値情報を用いた成果物をWEBサイトに掲載したり、販売してもよいということです。

それでは、鉄道のデータをダウンロードしてみましょう。

国土数値情報ダウンロードサービスへをクリックすると、「データ項目選択]画面が現れます。たくさんの項目の中の国土骨格というにジャンルに「鉄道」があります。これを選択します。

次に「地域選択」画面が現れます。鉄道の場合は、[全国」しかありません。これを選択します。

その次は「ファイル選択」画面です。ファイル名、ファイル容量、年度、版数、データ項目、説明、備考の項目があります。鉄道の場合は、2つのファイルがあります。いずれも平成7年度のもので、違いは日本測地系か世界測地系かどうかです。今後は世界測地系が標準になるので、世界測地系を選択します。ファイル名は、N02-07L-48-01.0a.zipです。

これをダウンロードして解凍すると、「N02-07L-48-01.0a」というフォルダが作成されます。このフォルダの中には次の3つのファイルがあります。

・N02-07L-2K.txt(データ)
・KS-META-N02-07L.html(メタデータ)
・N02-07L.html(データフォーマット情報)

データの内容

N02-07L-2K.txtはテキストデータですが、各行のデータの内容は一様ではありません。

H  NLA       N02-07L-2K 21995  80
127284   35745   73809    7720    9317       0     693
N  463063     1 4696868 1125076 14630630001  2 0
N  463063     2 4696768 1125126 0            1 1463073     3
(中略)
L  463063     1463063     6     4 0               3
4696868 1125076 4696888 1125056 4696908 1125046
L  463063     4463063     5     5 0               6
4697688 1124676 4697588 1124706 4697448 1124676 4697388 1124696 4697288 1124776
4697248 1124816
L  463064     1463064     2     1 0               2
4697938 1124416 4697918 1124466
(中略)
S  624055     6624055     7       2 1  11050001     2
624055     6 0624055     7 0
S  624065    19624075    31       3 1  11050002    18
624065    19 0624065    10 0624065     3 0624065     2 0624065     1 0
624075     2 0624075    17 0624075    16 0624075    15 0624075    14 0
624075    13 0624075    12 0624075    11 0624075     4 0624075    18 0
624075     3 0624075    10 0624075    31 0
S  624075    32634014    21       4 1  11050003    39
(中略)
DP 5339450246  1西ヶ原
DP 5339460003  1有楽町
DP 5339460007  1東京
DP 5339460009  1水道橋
DP 5339460011  1御茶ノ水
(中略)
DS   13001500  1 2武豊線
DS   13002500  1 1東海道新幹線
DS   13005000  1 2高山本線
DS   13006000  1 2中央本線
DS   13006001  1 2中央本線(原野~木曽福島)
DS   13006002  1 2中央本線(坂下付近)
(以下略)

これを解釈するためには、N02-07L.html(データフォーマット情報)に記載された内容に従って、テキストデータを分析しなければなりません。

データフォーマット情報によれば、このテキストデータは大きく6つの項目に分類され、それぞれの明細データを含めれば、9種類のフォーマットが存在します。データフォーマットの名称では直感的にわかりにくいので、次のように略称、レイヤー記号、検索方法をつけてみました。

フォーマット名略称レイヤー検索方法主な内容
ヘッダデータ ヘッダデータ1行目作成情報HレイヤーがH作成機関、作成年度
ヘッダデータ2行目行数データ-レイヤーHの次の行各データの行数
ノードデータ点データNメッシュコード+ノード一連番号各点の緯度経度
リンクデータ
(線分データ)
リンクの1行目線分L起点ノード・メッシュコード+リンク一連番号構成ポイント数
リンクの2行目以降線分明細-※該当リンクデータ内の何番目のデータか線分の始点、中間点、終点の経度緯度
ラインデータ(線データ) ラインデータの1行目路線Sライン一連番号構成ラインデータ数
ラインデータの2行目以降路線明細-※該当ラインデータ内の何番目のデータか該当するリンクデータの起点ノード・メッシュコード+リンク一連番号
ノード台帳データ駅名DP属性番号=駅番号=メッシュコード(6桁)+ノード番号(4桁)駅名
ライン台帳データ路線名DS属性番号=路線コード路線名

※ 線分明細と路線明細については、その行には検索の手掛かりとなるデータが記載されていないので、その行番号を用いて、キーとなるフィールドを作り出す必要があります。その方法については、後に述べます。

データベースの利用

国土数値情報の鉄道のデータ(N02-07L)は全行数127284行の多量のデータです。しかも、9種類のデータフォーマットが混在しているため、 これを扱うのは容易ではありません。何らかのデータベースソフトの利用が欠かせません。以下は、MicrosoftのAccessで処理することを前提にして、国土数値情報の取り出し方を考えます。

データベースへのインポート

国土数値情報をデータベースにインポートする際には、そのデータ行の行番号を付加する形でインポートします。線分明細や路線明細など検索キーが行の中にないデータが存在するからです。行番号を付加すれば、そのデータを特定することが可能になります。Accessの場合は、インポートの際に検索キーを付加する設定にすれば、オートナンバーで行番号のフィールドが追加されます。

テーブル作成

インポートしたテーブルから各データのフォーマットに合致したテーブルを作ります。

レイヤーコードが振られているデータを取り出すことは簡単です。最初の1文字か2文字がそのレイヤーコードに合致するものをクエリで選び出せばいいのです。

文字列の取り出しは、Accessの場合、mid関数を使います。mid関数を使えば、行データから好きな部分を取り出すことができます。データフォーマットの記述に従って、フィールドごとに文字列の取り出しを行います。数値に変換したい場合には、Val関数を併用します。

データフォーマットに従って、フィールドをクエリに加えていきます。なお、インポート際に付加された行番号フィールドもクエリのフィールドに忘れずに加えておきましょう。完成したら選択クエリで内容を確認します。問題がなければ、これをテーブル作成クエリに変えて、作成するテーブルの名前を入力してテーブル作成を実行します。これで、レイヤー単位のテーブルができあがります。ノードデータ、リンクデータ、ラインデータ、ノード台帳データ、ラインノード台帳データの各テーブルをこうして作成していきます。

明細データテーブルの作成

線分明細と路線明細については、その行には検索の手掛かりとなるデータが記載されていないので、テーブルの作成方法はちょっと複雑になります。次のデータは起点ノードのメッシュコードが463063、リンク一連番号が5の行番号とリンクデータ(線分データ)のものです。明細データは2行、データ数は6個あります。

35756,	L  463063     4463063     5     5 0               6
35757,	4697688 1124676 4697588 1124706 4697448 1124676 4697388 1124696 4697288 1124776
35758,	4697248 1124816

これを次のような形の明細テーブルにすれば、各明細データが特定しやすくなります。

リンクデータ明細テーブル

起点ノードのメッシュコードリンク一連番号明細番号y
4630635 146976881124676
4630635 246975881124706
4630635 346974481124676
4630635 446973881124696
4630635 546972881124776
4630635 646972481124816

これは次の手順で実現しました。

リンク明細行テーブルの作成

リンクデータが存在するのは、35748行以上10957行未満の部分です。このうち、先頭文字がLでないものを選び出せば、リンク明細行だけのテーブルになります。なお、行番号フィールドも加えておきます。

親テーブルの作成

リンク明細行テーブルのレコードには、他のテーブルと組み合わせるための情報がありません。この情報を付加するために、まず事前に親であるリンクデータのレコードにそのリンクデータの明細の最後の行番号の情報を加えておきます。リンクデータ数を参照して、親の行数からその明細の最後の行数を求められます。最後の行番号は”[親の行番号]+[int(リンクデータ数/6)+1」行分となります。この情報を付加したテーブルを以下「親テーブル」と呼びましょう。

リンク明細行特定テーブルの作成

クエリのデザイン画面で、「親テーブル」と「リンク明細行テーブル」を表示します。「リンク明細行テーブル」の「行番号」フィールドに抽出条件を設定します。抽出条件は「親データ」の「行番号」より大きく、「最終行」未満。このほか、クエリのフィールドに「起点ノードのメッシュコード」、リンク一連番号、明細番号、「リンク明細行テーブル」の元データを加えます。明細番号は、「リンク明細行テーブル」の「行番号」から「親データ」の「行番号」を引いた数値です。このテーブル作成クエリを実行すれば、リンク明細を他と結び付けられるテーブルが作成されます。それは、次のようなデータになります。先頭のフィールドは行番号、次の3つのフィールドでこのレコードを特定するとともに親データとの結びつけができるようになります。

35755,463063,4,1,4696868 1125076 4696888 1125056 4696908 1125046
35757,463063,5,1,4697688 1124676 4697588 1124706 4697448 1124676 4697388 1124696 4697288 1124776
35758,463063,5,2,4697248 1124816
35760,463064,1,1,4697938 1124416 4697918 1124466

個別明細テーブルの作成

目標は1つの座標データを1つのレコードとすることです。これは、横を縦にすることです。横を縦にするためには、行内のデータ数分だけのクエリを作り、そのクエリをユニオンクエリで結合すれば実現できます。「リンク明細行特定テーブル」の1行には5つの座標が収められています。たとえば、リンク1というテーブルを作ります、このクエリは行の1番目の座標だけを取り出します。そうするとこのクエリは、次のような内容になります。

起点ノードのメッシュコードリンク一連番号明細番号y
4630635 146976881124676
4630635 646972481124816

同じように2番目の座標、3番目の座標、4番目の座標、5番目の座標を取り出すクエリを作成します。

この5つのクエリをユニオンクエリで実現します。ユニオンクエリの記述は次のような感じになります。

Select [mesh],[link#],[link##],[x],[y]
From [Ldata1];

UNION Select  [mesh],[link#],[link##],[x],[y]
From [Ldata2];

UNION Select  [mesh],[link#],[link##],[x],[y]
From [Ldata3];

UNION Select  [mesh],[link#],[link##],[x],[y]
From [Ldata4];

UNION Select  [mesh],[link#],[link##],[x],[y]
From [Ldata5];

このユニオンクエリでできたデータを用いて、テーブル作成クエリを実行すれば、「リンクデータ明細テーブル」が作成されます。

「ラインデータ明細テーブル」もこれと同じようにすれば、作成できます。

国土数値情報の活用

このようにして、次の7つのテーブルを作成しましした。

  • ノードデータ
  • リンクデータ
  • リンクデータ明細
  • ラインデータ
  • ラインデータ明細
  • ノード台帳データ
  • ラインノード台帳データ

後はこれを組み合わせて、必要な情報に加工することになります。

PR
この記事にコメントする
お名前
タイトル
メールアドレス
URL
コメント
パスワード
QRコード
忍者ブログ [PR]
Copyright (C) 2006 banayan ALL RIGHTS RESERVED.