全国には避難施設が約 12 万箇所ある.それらの位置データを SQL Server にアップロードしたい.何度か試行錯誤の結果アップロードに成功したので備忘録として公開する.
国土数値情報の避難施設データ
例によって,国土数値情報ダウンロードサービスからダウンロードしたてのシェープファイルを Shape2SQL で直接 SQL Server にアップロードするとエラーが発生してアップロードが止まる.また文字化けが発生して日本語が表示されない.属性名に日本語が使われているとエラーが発生するようである.
![Shape2SQLで発生するエラーと文字化け](https://i0.wp.com/www.muscle-hypertrophy.com/wp-content/uploads/2022/10/06-4.png?resize=374%2C453&ssl=1)
Shape2SQL はアップデートがなされておらず,現状のまま使い続けるほかない.早々に WKT 表現付きの csv ファイルをインポートする方針に切り替えた.
QGISでの作業
まずベクタレイヤのマージ
避難施設のデータは都道府県別に 47 個ある.これらをQGISで開き,レイヤをマージして一つのレイヤにする.
![「ベクタ」「データ管理ツール」「ベクタレイヤをマージ」](https://i0.wp.com/www.muscle-hypertrophy.com/wp-content/uploads/2022/10/00-6.png?resize=381%2C224&ssl=1)
![「ベクタレイヤをマージ」ダイアログ初期状態](https://i0.wp.com/www.muscle-hypertrophy.com/wp-content/uploads/2022/10/01-6.png?resize=525%2C422&ssl=1)
![「入力レイヤ」で「すべて選択」](https://i0.wp.com/www.muscle-hypertrophy.com/wp-content/uploads/2022/10/02-6.png?resize=525%2C422&ssl=1)
![「変換先の座標参照系」と「出力レイヤ」を指定](https://i0.wp.com/www.muscle-hypertrophy.com/wp-content/uploads/2022/10/03-4.png?resize=525%2C422&ssl=1)
![「出力レイヤ」に「ファイルに保存」を選んだ場合](https://i0.wp.com/www.muscle-hypertrophy.com/wp-content/uploads/2022/10/04-4.png?resize=525%2C296&ssl=1)
![「ベクタレイヤをマージ」で全てのパラメータを設定したところ](https://i0.wp.com/www.muscle-hypertrophy.com/wp-content/uploads/2022/10/05-5.png?resize=525%2C422&ssl=1)
結果は下図の通り.全てのポイントデータが一つのレイヤにマージされる.
![全てのポイントデータが一つのレイヤにマージされる](https://i0.wp.com/www.muscle-hypertrophy.com/wp-content/uploads/2022/10/09-2.png?resize=525%2C495&ssl=1)
この後,出力されたシェープファイルをShape2SQLでアップロードしようとしたが,先程と同様のエラーに見舞われて失敗した.
「エクスポート」「新規ファイルに地物を保存」
さて,方針を変更してcsvファイルに出力する.注意点を列記する.
- 「形式」を「カンマで区切られた値[CSV]」に変更する
- 「座標参照系」をEPSG:4326に変更する
- 文字コードはShift_JISのままとする
- 「エクスポートするフィールドとエクスポートオプションの選択」でlayerとpathのチェックを外す
- 「ジオメトリ型」を点Pointに変更する
- 「レイヤオプション」の GEOMETRY を AS_WKT に変更する
- LINEFORMAT を CRLF に変更する
- SEPARATOR を TAB に変更する
- STRING_QUOTING を IF_NEEDED に変更する
![名前をつけてベクタレイヤを保存](https://i0.wp.com/www.muscle-hypertrophy.com/wp-content/uploads/2022/10/20.png?resize=525%2C887&ssl=1)
メモ帳での作業
メモ帳での作業は重要である.
csvファイルの拡張子をtxtに変更する
csvファイルをtxtファイルに変更し,メモ帳で開けるようにする.
ダブルクォーテーションマークを一括置換で削除
置換機能でダブルクォーテーションマークを削除する.
SQL Serverでの作業
ウィザードを使ってインポート
下図のようにウィザードを使ってインポートする.細かい記述は省略するが,データ長が50 だと切り捨てエラーが至るところで発生するため,一律で255に拡張している.
![SQL Serverにウィザードを使ってインポート](https://i0.wp.com/www.muscle-hypertrophy.com/wp-content/uploads/2022/10/21.png?resize=525%2C614&ssl=1)
テーブル構造の変更
テーブルに 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バイト文字で記述していただきたい.また都道府県別ファイルも良いが,可能なら「全国」の避難施設をまとめたファイルを公開していただきたい.