国土数値情報ダウンロードサービスには医療機関や医療圏の位置情報もある.今回は医療機関の Point データをダウンロードし,SQL Server にアップロードする方法を見つけたので備忘録として記載する.
国土数値情報ダウンロードサービス
「地域」「施設」「医療機関」
データはここになる.下図のように医療機関をクリックする.

平成26年と令和2年のデータがあり,新しい方をクリックする.アンケートが開くので必要なら記載して「ダウンロードに進む」ボタンを押下するとダウンロードが始まる.

ダウンロードされるのは圧縮されたzip ファイルであり,右クリックして展開する.

ダウンロードしたてのデータを直接アップロードすると文字化けする
あらかじめ MedicalAreaDB というデータベースを作成しておく.Shape2SQL で下図のようにアップロードする.

しかし,アップロードしたテーブルからデータを選択すると,属性が文字化けしている.

QGIS 経由でデータを再作成する
文字化けしていたのでは使い物にならない.一旦このテーブルは削除する.
ダウンロードしたデータは QGIS なら文字化けせずに開ける.しかし,詳細は省略するが Shapefile にエクスポートするとやはり属性が文字化けする.どうしたものだろうか.位置情報の精度は落ちるが,csv ファイルに書き出したほうが良いかもしれないと思いついた.
位置情報を WKT で置換して csv ファイルにエクスポート
QGIS で開いたレイヤーをレイヤを右クリックして「エクスポート」「新規ファイルに地物を保存」と進む.

「名前をつけてベクタレイヤを保存」ダイアログに遷移する.変更点は以下である.
- 「形式」を「カンマで区切られた値」とする
- 「ファイル名」をフルパスで指定する(ファイル名がテーブル名になる)
- 「座標参照系」を SQL Server に対応した EPSG: 4326 に変更する
- 「文字コード」は Shift_JIS とする
- 「ジオメトリ型」を「点 (Point)」とする
- GEOMETRY を AS_WKT に変更する
- STRING_QUOTING を IF_NEEDED に変更する

メモ帳でデータを覗いてみる
メモ帳で件の csv ファイルを開いてみると,下記のようにデータがダブルクオーテーションで囲まれている.これはSQL Server での処理に邪魔になる.置換で取り除いておく.
WKT,P04_001,P04_002,P04_003,P04_004,P04_005,P04_006,P04_007,P04_008,P04_009,P04_010 "POINT (144.9270714 43.54427951)","1",医療法人樹恵会石田病院,標津郡中標津町りんどう町5番地6,内 リハ,,,"4","60","9","9"
SQL Server インポートおよびエクスポートウィザードで SQL Server にインポートする
目的のデータベースを右クリックして「タスク」「データのインポート」と進むと,SQL Server インポートおよびエクスポートウィザードが起動する.

「データソースの選択」の詳細設定で OutputColimnWidth の値を50から255に拡張しておく.インポートの際に切り捨てが発生するのを防ぐためである.

列マッピングは下図の通り.冗長ではあるがやむを得ない.

操作が正常に実行される.

SQL Server Management Studio でテーブルの構造を変更する
テーブルの構造を変更して Location 列を追加したい.そのためには SQL Server Management Studio のオブジェクトエクスプローラーで,該当するデータベースの該当するテーブルを右クリックして「デザイン」を選択する.

「列名」に Location と入力し「データ型」は geography を選択する.クエリウィンドウを閉じると保存するか促されるので「はい」をクリックする.

構造の壊れた行のため WKT を Point に変換する STPointFromText() メソッドが失敗する
テーブルの構造が公表通りなら,次のクエリは成功するはずである.
UPDATE dbo.T_Medical_Institution SET Location = geography::STPointFromText(WKT, 4326)
しかし実際には下記のエラーが発生する.
メッセージ 6522、レベル 16、状態 1、行 3 ユーザー定義のルーチンまたは集計 "geography" を実行中に .NET Framework エラーが発生しました: System.FormatException: 24142: 位置 1 には "POINT" が必要です。""POIN" が入力されています。 System.FormatException: 場所 Microsoft.SqlServer.Types.WellKnownTextReader.RecognizeToken(String token) 場所 Microsoft.SqlServer.Types.WellKnownTextReader.ParseTaggedText(OpenGisType type) 場所 Microsoft.SqlServer.Types.WellKnownTextReader.Read(OpenGisType type, Int32 srid) 場所 Microsoft.SqlServer.Types.SqlGeography.ParseText(OpenGisType type, SqlChars taggedText, Int32 srid) 場所 Microsoft.SqlServer.Types.SqlGeography.GeographyFromText(OpenGisType type, SqlChars taggedText, Int32 srid) 。 ステートメントは終了されました。
どういうことだろうか?本来 WKT 構文が存在しなければならない列に他のデータが紛れ込んでいるようだ.下記のクエリを実行して検査してみる.
SELECT * FROM dbo.T_Medical_Institution WHERE LEFT(WKT, 5) <> 'POINT'
結果は以下である.
(39 行処理されました)
壊れた行を削除する
結果タブを見ると,データ構造が壊れていることがわかる.この 39 行のデータは救いようがない.諦めて削除することにする.
DELETE FROM dbo.T_Medical_Institution WHERE LEFT(WKT, 5) <> 'POINT'
(39 行処理されました)
再び STPointFromText() メソッド
再度,STPointFromText() メソッドを実行する.
UPDATE dbo.T_Medical_Institution SET Location = geography::STPointFromText(WKT, 4326)
(181316 行処理されました)
医療機関テーブルのメタデータ
shp属性名 | 属性名 | 説明 |
---|---|---|
P04_001 | 医療機関分類 | 医療機関の分類.コードリスト「医療機関分類コード」 |
P04_002 | 施設名称 | 医療施設の名称 |
P04_003 | 所在地 | 医療機関の所在地の住所 |
P04_004 | 診療科目1 | 当該施設が有する診療科目 |
P04_005 | 診療科目2 | 当該施設が有する診療科目(「診療科目1」が全角127文字を超える場合使用) |
P04_006 | 診療科目3 | 当該施設が有する診療科目(「診療科目2」が全角127文字を超える場合使用) |
P04_007 | 開設者分類 |
当該施設(病院のみ)を開設した組織または個人の分類.コードリスト「開設者分類コード」 |
P04_008 | 病床数 | 当該施設が有する病床総数 |
P04_009 | 救急告示病院 | 医療機関が「救急病院等を定める省令」(昭和39年2月20日厚生省令第8号)に基づき告示されているかを示す値」 |
P04_010 | 災害拠点病院 | 医療機関の「災害時における医療体制の充実強化について」(平成24年3月21日医政発0321第2号厚生労働省医政局)に基づく分類 |
まとめ
国土数値情報ダウンロードサービスの医療機関の位置情報を SQL Server にインポートした.
39行のデータが壊れており,やむを得ず削除した.しかし,ウィザードでインポートした行数と最後に STPointFromText() メソッドで処理した行数とが一致しており,NULL となっている列の存在を疑わせるが,実際に検索してみてもそのような行は存在しない.この原因は分からない.
Shape2SQL を使ってアップロードすると文字化けする.そのため,位置情報を WKT 表現に置換した上で csv ファイルにエクスポートし,SQL Server のインポートおよびエクスポートウィザードでインポートし,さらに STPointFromText() メソッドで WKT 表現を geography 型に戻すという手間が必要であった.
国土交通省には改善を要望したい.