国土数値情報の避難施設のポイントデータをSQL Serverにアップロードする

 全国には避難施設が約 12 万箇所ある.それらの位置データを SQL Server にアップロードしたい.何度か試行錯誤の結果アップロードに成功したので備忘録として公開する.

国土数値情報の避難施設データ

 例によって,国土数値情報ダウンロードサービスからダウンロードしたてのシェープファイルを Shape2SQL で直接 SQL Server にアップロードするとエラーが発生してアップロードが止まる.また文字化けが発生して日本語が表示されない.属性名に日本語が使われているとエラーが発生するようである.

Shape2SQLで発生するエラーと文字化け
Shape2SQLで発生するエラーと文字化け

 Shape2SQL はアップデートがなされておらず,現状のまま使い続けるほかない.早々に WKT 表現付きの csv ファイルをインポートする方針に切り替えた.

QGISでの作業

まずベクタレイヤのマージ

 避難施設のデータは都道府県別に 47 個ある.これらをQGISで開き,レイヤをマージして一つのレイヤにする.

「ベクタ」「データ管理ツール」「ベクタレイヤをマージ」
「ベクタ」「データ管理ツール」「ベクタレイヤをマージ」
「ベクタレイヤをマージ」ダイアログ初期状態
「ベクタレイヤをマージ」ダイアログ初期状態
「入力レイヤ」で「すべて選択」
「入力レイヤ」で「すべて選択」
「変換先の座標参照系」と「出力レイヤ」を指定
「変換先の座標参照系」と「出力レイヤ」を指定
「出力レイヤ」に「ファイルに保存」を選んだ場合
「出力レイヤ」に「ファイルに保存」を選んだ場合
「ベクタレイヤをマージ」で全てのパラメータを設定したところ
「ベクタレイヤをマージ」で全てのパラメータを設定したところ

 結果は下図の通り.全てのポイントデータが一つのレイヤにマージされる.

全てのポイントデータが一つのレイヤにマージされる
全てのポイントデータが一つのレイヤにマージされる

 この後,出力されたシェープファイルをShape2SQLでアップロードしようとしたが,先程と同様のエラーに見舞われて失敗した.

「エクスポート」「新規ファイルに地物を保存」

 さて,方針を変更してcsvファイルに出力する.注意点を列記する.

  • 「形式」を「カンマで区切られた値[CSV]」に変更する
  • 「座標参照系」をEPSG:4326に変更する
  • 文字コードはShift_JISのままとする
  • 「エクスポートするフィールドとエクスポートオプションの選択」でlayerとpathのチェックを外す
  • 「ジオメトリ型」を点Pointに変更する
  • 「レイヤオプション」の GEOMETRY を AS_WKT に変更する
  • LINEFORMAT を CRLF に変更する
  • SEPARATOR を TAB に変更する
  • STRING_QUOTING を IF_NEEDED に変更する
名前をつけてベクタレイヤを保存
名前をつけてベクタレイヤを保存

メモ帳での作業

 メモ帳での作業は重要である.

csvファイルの拡張子をtxtに変更する

 csvファイルをtxtファイルに変更し,メモ帳で開けるようにする.

ダブルクォーテーションマークを一括置換で削除

 置換機能でダブルクォーテーションマークを削除する.

SQL Serverでの作業

ウィザードを使ってインポート

 下図のようにウィザードを使ってインポートする.細かい記述は省略するが,データ長が50 だと切り捨てエラーが至るところで発生するため,一律で255に拡張している.

SQL Serverにウィザードを使ってインポート
SQL Serverにウィザードを使ってインポート

テーブル構造の変更

 テーブルに Location 列を追加しデータ型を geography とする.

クエリでテーブルの Location 列を更新

 クエリでテーブルを更新する前に,しておかなければならないことがある.WKT列にWKT表現以外の行が紛れ込んでいないか確認する必要がある.

SELECT	*
FROM	dbo.T_Shelter
WHERE	LEFT(WKT, 5) <> 'POINT'

 結果は以下の通り.

(5 行処理されました)

 これらの行を削除する.

DELETE	
FROM	dbo.T_Shelter
WHERE	LEFT(WKT, 5) <> 'POINT'
(5 行処理されました)

 然る後,下記クエリを実行する.

UPDATE	dbo.T_Shelter
SET	Location = geography::STPointFromText(WKT, 4326)
(125927 行処理されました)

メタデータ

shp属性 属性名 説明
P20_001 行政区域コード 都道府県コードと市区町村コードからなる,避難施設の所在する行政区を特定するためのコード,コードリスト「行政区域コード
P20_002 名称 避難施設の名称
P20_003 住所 避難施設の住所
P20_004 施設の種類 避難施設の種類
P20_005 収容人数 避難施設の形態ごとの収容可能人数
P20_006 施設規模 避難施設の形態ごとの面積(平方メートル)
P20_007 地震災害  
P20_008 津波災害  
P20_009 水害  
P20_010 火山災害  
P20_011 その他  
P20_012 指定なし  
レベル レベル

レベル1:国土数値情報と位置が一致

レベル2:GISデータが整備されている自治体の施設と一が一致

レベル3:防災マップ,ハザードマップまたはWEB地図と位置が一致

レベル4:国土数値情報と位置が異なりレベル3と位置が一致

備考 備考  
緯度 緯度  
経度 経度  
No No  

まとめ

 国土数値情報の避難施設データを SQL Server にアップロードした.属性名が日本語のため Shape2SQL にエラーが発生した.そのため QGIS を用いて csv ファイルにエクスポートし,メモ帳で加工した上で SQL Server のウィザードを使ってインポートし,SQL Server の機能を使って空間データに変換する必要があった.

 シェープファイルのフィールド名はその規格において2バイト文字は5文字まで,1バイト文字はと決まっている.アップロードが失敗するのは Shape2SQL が日本語のフィールド名に対応していないためと思われる.国土交通省におかれては,フィールド名を1バイト文字で記述していただきたい.また都道府県別ファイルも良いが,可能なら「全国」の避難施設をまとめたファイルを公開していただきたい.

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください