国土数値情報の一次医療圏テーブルの文字化けを解決し,医療機関テーブルに行政区域コードを追加する

 先の記事(国土数値情報の二次医療圏テーブルの文字化けを解決する)では二次医療圏テーブルの文字化けを解決した.今回は行政区域コードで集約したポリゴンを融合した一次医療圏テーブルの文字化けを解決し,医療機関テーブルに行政区域コードを追加する.

一次医療圏テーブルの文字化けの解決法

一次医療圏のシェープファイルを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

まとめ

 一次医療圏テーブルの文字化けの解決法を示した.また,医療機関テーブルに行政区域コードを追加した.

 空間演算による結合は計算コストが高いため,国土交通省におかれては最初から医療機関テーブルに行政区域コードおよび二次医療圏コードを追加しておいていただきたい.

コメントを残す

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

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