国土数値情報の医療機関のPointデータをダウンロードしQGIS経由でSQL Serverにアップロードする

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

国土数値情報ダウンロードサービス

「地域」「施設」「医療機関」

 データはここになる.下図のように医療機関をクリックする.

国土数値情報ダウンロードサービスの「地域」「施設」「医療機関」
国土数値情報ダウンロードサービスの「地域」「施設」「医療機関」

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

ダウンロード画面
ダウンロード画面

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

zipファイルを右クリックして展開する
zipファイルを右クリックして展開する

ダウンロードしたてのデータを直接アップロードすると文字化けする

 あらかじめ MedicalAreaDB というデータベースを作成しておく.Shape2SQL で下図のようにアップロードする.

Shape2SQL で SQL Server にアップロードする
Shape2SQL で SQL Server にアップロードする

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

属性が文字化けしている
属性が文字化けしている

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 インポートおよびエクスポートウィザードが起動する.

SQL Server インポートおよびエクスポートウィザードを起動する
SQL Server インポートおよびエクスポートウィザードを起動する

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

「データソースの選択」の詳細設定でOutputColumnWidthを拡張
「データソースの選択」の詳細設定でOutputColumnWidthを拡張

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

列マッピング
列マッピング

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

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

SQL Server Management Studio でテーブルの構造を変更する

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

テーブルを右クリックして「デザイン」
テーブルを右クリックして「デザイン」

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

「列名」に Location と入力し「データ型」はgeography を選択する
「列名」に 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 型に戻すという手間が必要であった.

 国土交通省には改善を要望したい.

コメントを残す

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

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