先の記事(国土数値情報の二次医療圏テーブルの文字化けを解決する)では二次医療圏テーブルの文字化けを解決した.今回は行政区域コードで集約したポリゴンを融合した一次医療圏テーブルの文字化けを解決し,医療機関テーブルに行政区域コードを追加する.
一次医療圏テーブルの文字化けの解決法
一次医療圏のシェープファイルをQGISで融合する
基本的にはQGISで融合(ディゾルブ)を実行するに従う.融合の手順の前にジオメトリの修復が必要である.
- A38-20_1.shp ファイルを QGIS で開く
- プロセシングツールボックスから「ジオメトリを修復」を行う
- 二次医療圏コード (A38b_003) を集約キーとして融合(dissolve)する
「エクスポート」「新規ファイルに地物を保存」
- 形式を ESRI Shapefile とする
- ファイル名をフルパスで指定する(ここでは T_MedicalArea1_Dissolved とする)
- 座標参照系を EPSG:4326 に変更する
- ジオメトリをポリゴンとし,マルチタイプにするをチェックする
属性テーブルのエクスポート
- 形式をカンマで区切られた値[CSV]とする
- ファイル名をフルパスで指定する(ここでは T_MedicalArea1_TEXT としている)
- 座標参照系を EPSG:4326 とする
- 文字コードを Shift_JIS とする
- ジオメトリを「ジオメトリなし」とする
- レイヤオプションで LINEFORMAT を CRLF とする
- SEPARATPR を TAB とする
- STRING_QUOTED を IF_NEEDED にする
ウィザードを使ってSQL Serverに属性テーブルをインポート
- T_MedicalArea1_TEXTをメモ帳で開き,ダブルクォーテーションマークを一括置換で削除する
- T_MedicalArea1_TEXTの拡張子をtxtに変更する
- SQL Server のウィザードを使って属性テーブルからエクスポートしたテキストファイル (T_MedicalArea1_TEXT) をインポートする
Shape2SQLでSQL Serverにアップロード
- Geography を選択する
- Set SRID をチェックして 4326 を指定する
UPDATE SET FROM JOIN ステートメントでテーブルを更新する
UPDATE D SET D.A38a_001 = T.A38a_001 , D.A38a_002 = T.A38a_002 , D.A38a_003 = T.A38a_003 , D.A38a_004 = T.A38a_004 , D.A38a_005 = T.A38a_005 FROM [MedicalAreaDB].[dbo].[T_MedicalArea1_Dissolved] AS D INNER JOIN dbo.T_MedicalArea1_TEXT AS T ON D.A38a_001 = T.A38a_001
(1896 行処理されました)
結果
下記クエリを実行してみる.
SELECT TOP 10 D.A38a_001 , D.A38a_002 , D.A38a_003 , D.A38a_004 , D.A38a_005 , D.geog.STNumPoints() AS NumPoints FROM [MedicalAreaDB].[dbo].[T_MedicalArea1_Dissolved] AS D ORDER BY NumPoints DESC
結果は以下の通り.文字化けは解決した.
A38a_001 A38a_002 A38a_003 A38a_004 A38a_005 NumPoints 38203 宇和島市 3806 宇和島 1 357042 04202 石巻市 0409 石巻・登米・気仙沼 1 247920 13421 小笠原村 1313 島しょ 1 216572 03202 宮古市 0307 宮古 2 171549 24472 南伊勢町 2403 南勢志摩 1 168543 42202 佐世保市 4202 佐世保県北 1 144720 42201 長崎市 4201 長崎 1 140887 24215 志摩市 2403 南勢志摩 1 134213 42209 対馬市 4209 対馬 1 132132 42210 壱岐市 4208 壱岐 1 130836
試しに次のクエリを実行し,結果をExcelにコピペして散布図に示す.行政区域コードごとの融合する前のポリゴンと融合後のポリゴンのポイント数を比較するものである.
SELECT D.A38a_001 , D.geog.STNumPoints() AS NumPoints , SUM(A.geog.STNumPoints()) AS SumPoints FROM dbo.T_MedicalArea1_Dissolved AS D INNER JOIN dbo.[A38-20_1] AS A ON D.A38a_001 = A.A38a_001 GROUP BY D.A38a_001, D.geog.STNumPoints()
散布図を示す.一次医療圏テーブルの融合前後でのポイント数の分布はほぼ一直線上に乗っているが,一箇所だけ異なるポイントがある.宇和島町である.ジオメトリの重複が疑われる.
医療機関テーブルに行政区域コードを追加する方法
続けて医療機関テーブルに行政区域コードを追加する方法を解説する.
医療機関テーブルに行政区域コード列を追加する
- 医療機関テーブルである T_Medical_Institute に対し,SQL Server Management Studio のオブジェクトエクスプローラー上で右クリックし,「デザイン」を選ぶ.
- 列名に AdministrativeAreaCode とタイプし,データ型を nchar(5) とする.
- 下記クエリを実行する.実行には1分30秒ほどかかったのみである.
USE MedicalAreaDB GO UPDATE I SET AdministrativeAreaCode = M.A38a_001 FROM dbo.[T_Medical_Institution] AS I INNER JOIN dbo.T_MedicalArea1_Dissolved AS M ON I.Location.STWithin(M.geog) = 1
(181309 行処理されました)
結果
下記クエリを実行すると実行には2秒かかった.結合条件に空間演算を用いるのは計算コストが高いことがわかる.
SELECT I.* , D.A38a_001 FROM dbo.T_Medical_Institution AS I INNER JOIN dbo.T_MedicalArea1_Dissolved AS D ON I.AdministrativeAreaCode = D.A38a_001
まとめ
一次医療圏テーブルの文字化けの解決法を示した.また,医療機関テーブルに行政区域コードを追加した.
空間演算による結合は計算コストが高いため,国土交通省におかれては最初から医療機関テーブルに行政区域コードおよび二次医療圏コードを追加しておいていただきたい.