全国には避難施設が約 12 万箇所ある.それらの位置データを SQL Server にアップロードしたい.何度か試行錯誤の結果アップロードに成功したので備忘録として公開する.
国土数値情報の避難施設データ
例によって,国土数値情報ダウンロードサービスからダウンロードしたてのシェープファイルを Shape2SQL で直接 SQL Server にアップロードするとエラーが発生してアップロードが止まる.また文字化けが発生して日本語が表示されない.属性名に日本語が使われているとエラーが発生するようである.
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に拡張している.
テーブル構造の変更
テーブルに 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バイト文字で記述していただきたい.また都道府県別ファイルも良いが,可能なら「全国」の避難施設をまとめたファイルを公開していただきたい.