国土数値情報の令和2年の医療圏データの文字化けが直っていた

 以前の投稿(Shape2SQL でシェープファイルを SQL Server 2008 R2 にアップロードする)で国土数値情報ダウンロードサービスの医療圏データが文字化けしていると記述した.改めてダウンロードして SQL Server にアップロードしたところ,いつの間にか文字化けが直っていた.以前にも河川データの文字化けを指摘したことがあるが,こちらも修正されていた(国土数値情報の河川データが一部直っていた件).どうやら国土交通省に指摘すると修正してくれるらしい.

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

「政策区域」「行政地域」「医療圏」

 国土数値情報ダウンロードサービスの「政策区域」「行政地域」「医療圏」に目的のファイルがある.

「政策区域」「行政地域」「医療圏」
「政策区域」「行政地域」「医療圏」

 全国の令和2年を選ぶ.例によってアンケートがあるので意見を言いたい人は書き込んでおく.

全国の令和2年を選ぶ
全国の令和2年を選ぶ

 ダウンロードした zip ファイルを展開すると 3GB を超えるフォルダーになる.中身を覗くと3種類の Shapefile が存在することが分かる.

Shape2SQLでSQL Serverにアップロード

 あまり期待せずに Shape2SQL で SQL Server にアップロードしてみた.アップロード先は MedicalAreaDB である.

1次医療圏のシェープファイルをアップロード
一次医療圏のシェープファイルをアップロード

 SQL Server Management Studio から下記のクエリを実行してみた.

SELECT TOP (1) [ID]
      ,[A38a_001]
      ,[A38a_002]
      ,[A38a_003]
      ,[A38a_004]
      ,[A38a_005]
      ,[geog]
  FROM [MedicalAreaDB].[dbo].[A38-20_1]

 結果の一部である.

ID A38a_001 A38a_002 A38a_003 A38a_004 A38a_005 geog
1 01101 中央区 0104 札幌 1 0xE610000001040E070000806B3470B87F4540ECEFC...

 何と,文字化けしていない!続けて二次医療圏,三次医療圏のデータもアップロードしてみる.

2次医療圏のデータをアップロード
二次医療圏のシェープファイルをアップロード
3次医療圏のシェープファイルをアップロード
三次医療圏のシェープファイルをアップロード

二次医療圏,三次医療圏が多すぎる

 気になったのがファイル数である.一次医療圏が約11.8万件なのは良いとしても,二次医療圏と三次医療圏はそれぞれ約11.6万件.細かい数字に違いはあるが,二次医療圏や三次医療圏が11.6万件もあるのは明らかに多すぎる.

 二次医療圏は一次医療圏の上位に来るもので,さらに三次医療圏は二次医療圏の上位に来るものである.三次医療圏とは通常,都道府県単位で設定されるものであるから,せいぜい数十件がいいところのはずだ.二次医療圏はその間の桁数に収まるはずである.

二次医療圏ごとのデータ数を抽出

 試しに二次医療圏テーブルに対して,下記クエリを実行してみる.二次医療圏コードごとの件数を抽出するものである.

SELECT	M.A38b_003
,	M.A38b_004
,	COUNT(*)	AS CNT
  FROM [MedicalAreaDB].[dbo].[A38-20_2]	AS M
  GROUP BY	M.A38b_003, M.A38b_004
    ORDER	BY	CNT DESC

 結果は以下の通り.

(335 行処理されました)

 全体が 335 件と言う数字は妥当なものだと思う.しかし結果タブに表示されるトップの行は果たして本当なのだろうか.

A38b_003	A38b_004	CNT
0409	石巻・登米・気仙沼	7595

 得られた結果を Excel にペーストしてピボットグラフにしてみた.3分の1ほどは単一のシェープファイルからなることが分かるが,残り3分の2は離島の数を考慮しても妥当なものなのだろうか.

二次医療圏のシェープファイル数
二次医療圏のシェープファイル数

三次医療圏ごとのデータ数を抽出

 ついでに下記クエリを実行してみよう.三次医療圏ごとのデータ数を降順で抽出するものである.

SELECT [A38c_001]
      ,[A38c_002]
      ,COUNT(*)	AS CNT
  FROM [MedicalAreaDB].[dbo].[A38-20_3]	as A
  GROUP	BY	A.A38c_001, A.A38c_002
  ORDER	BY	CNT DESC

 結果は次の通り.

(52 行処理されました)

 やはり数十件と検討をつけた桁数は正しい.トップは長崎県の 9172 件である.これは妥当な数字かもしれないが,他の府県の数百から数千の数ものシェープファイル数が本当に正しいのか,確認が必要だろう.

A38c_001	A38c_002	CNT
長崎県		9172
鹿児島県		8075
岩手県		8022
宮城県		7977
三重県		7432
東京都		5991
沖縄県		5244
愛媛県		4931
高知県		4482
和歌山県		4070
徳島県		3491
島根県		3440
山口県		2974
北海道	道央	2942
福井県		2930
北海道	道南	2797
新潟県		2653
秋田県		2444
大分県		2328
青森県		2195
兵庫県		2126
福岡県		1921
熊本県		1917
静岡県		1710
北海道	釧路・根室	1704
石川県		1675
宮崎県		1674
千葉県		1434
神奈川県		1224
愛知県		1054
京都府		958
北海道	道北	952
鳥取県		805
香川県		739
山形県		650
広島県		529
岡山県		384
佐賀県		296
茨城県		179
北海道	オホーツク	158
北海道	十勝	130
福島県		126
大阪府		53
富山県		40
埼玉県		2
栃木県		1
群馬県		1
奈良県		1
長野県		1
岐阜県		1
山梨県		1
滋賀県		1

一次医療圏のシェープファイルを流用してないか?

 一つの仮説だが,一次医療圏のシェープファイルをそのまま二次医療圏に流用したとは考えられないだろうか.しかしこれを検証するには STEquals() メソッドを全行に対して実行しなければならない.直積で 11.6 万× 11.6 万回(約 13.5 億回)とは,気の遠くなるような時間がかかると予想される.

 仮にその仮説が正しいと仮定すると,QGIS で融合(ディゾルブ)できるだろう.マルチポリゴンを許可すれば離島や飛び地も表現できるだろう.やってみる価値はありそうだ.

 しかし,である.二次医療圏テーブルは面積と人口も属性に含んでおり,これらが食い違うとデータに齟齬を来す可能性がある.下記クエリを実行して件数を確認する.

SELECT       COUNT(*)	AS CNT
  FROM [MedicalAreaDB].[dbo].[A38-20_2]	AS M
  GROUP BY	M.A38b_001, M.A38b_002, M.A38b_003, M.A38b_004, M.A38b_005,	M.A38b_006,	M.A38b_007,	M.A38b_008,	M.A38b_009,	M.A38b_010,	M.A38b_011

 結果は次の通り.

(335 行処理されました)

 問題なさそうである.属性には重複があり,異なるのは POLYGON データだけのようだ.

QGISで融合(ディゾルブ)を実行する

 国土地理院の地球地図日本ダウンロードから都道府県のポリゴンデータをQGISで作成するで述べたように,QGIS で「ベクタ」「空間演算ツール」「融合」と進むとポリゴンを融合させることができる.

 QGIS で二次医療圏のシェープファイルを開き,下図のように設定する.詳細パラメータは指定しない.

QGISで「ベクタ」「演算ツール」「融合」を選ぶ
QGISで「ベクタ」「空間演算ツール」「融合」を選ぶ

 「基準となる属性」には二次医療圏コードを示す列を指定する.

二次医療圏コードで集約する
二次医療圏コードで集約する

 実行すると属性テーブルの行数が 335 件となる.

「エクスポート」「新規ファイルに地物を保存」

 下図を参考に融合してできたレイヤを保存する.ファイル名を T_MedicalArea2 としている.

「エクスポート」「新規ファイルに地物を保存」
「エクスポート」「新規ファイルに地物を保存」

SQL Server にアップロード

 Shape2SQL で SQL Server にアップロードしてみる.アップロードには異様に時間がかかる.

NumRings() メソッドでジオメトリのリング数を確認する

 NumRings() メソッドは geography 型の Polygon のリングの総数を求めたい時に使う.外部リングと内部リングを区別しない.テーブル A38-20_2 とテーブル T_MedicalArea2 とに対してそれぞれ下記クエリを実行する.

SELECT	SUM(A.geog.NumRings())
  FROM	dbo.[A38-20_2]	AS A
SELECT	SUM(T.geog.NumRings())
  FROM	dbo.[T_MedicalArea2]	AS T

 結果は次の通り.

(1 行処理されました)
警告: NULL 値は集計またはその他の SET 演算で削除されました。
(1 行処理されました)
(列名なし)
116408
(列名なし)
135

 両者の結果は等しいと予想していたが,予想外の結果となった.テーブル T_MedicalArea2 ではほとんどの行で NumRings() メソッドの返り値が NULL となり,また属性が文字化けした.後でわかったのだが,NumRIngs() メソッドはマルチポリゴンに適用されると NULL を返す仕様となっている.それでもテーブル A38-20_2 ではリングの総数 (116408) は全行数 (116365) より若干少なくなった.

平成26年の医療圏のデータをダウンロードする

 次の方針も立たないため,平成26年の医療圏のデータをダウンロードして SQL Server にアップロードしてみた.こちらの属性は文字化けしていた.どうやらこのブログで指摘したデータだけを修正しているようである.何というか,残念である.

 とりあえず,テーブルの全行数は分かるので掲載しておく.

  平成26年 令和2年
一次医療圏 73041 118119
二次医療圏 71308 116365
三次医療圏 70983 116037

 下表は NumRIng() メソッドの結果の合計である.

  平成26年 令和2年
一次医療圏 73175 118282
二次医療圏 71331 116408
三次医療圏 70985 116056

csvファイルでSQL Serverにインポートしてみる

 シェープファイルが駄目なら csv ファイルはどうだろうか.下図の設定で融合した335件のマルチポリゴンを csv ファイルにエクスポートし,SQL Server にインポートしてみた.

  • 「形式」を「カンマで区切られた値」とする
  • 「座標参照系」をEPSG: 4326 とする
  • 「文字コード」をShift_JIS とする
  • 「ジオメトリ」をポリゴンとし,「マルチタイプにする」をチェックする
  • レイヤオプションで GEOMETRY を AS_WKT とする
  • LINEFORMAT を CRLF とする
  • SEPASRATOR を TAB とする
  • STRING_QUOTED を ALWAYS とする(後にメモ帳で削除する)
名前をつけてベクタレイヤを保存
名前をつけてベクタレイヤを保存

 SQL Server のウィザードでは WKT のDataType をテキストストリームにするなど工夫がいる.

WKTのDataTypeをテキストストリームにする
WKTのDataTypeをテキストストリームにする

 しかし,SQL Server のウィザードで下図のようなエラーが発生した.

指定したヘッダーまたはデータの行区切り記号"{CR}{LF}"が見つかりません.
指定したヘッダーまたはデータの行区切り記号”{CR}{LF}”が見つかりません.

 構わずに進めていく.

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

 最終的にアップロードできた行は7行だけであった.

最終的に転送できたのは7行のみ
最終的に転送できたのは7行のみ

 確認の意味で下記クエリを実行する.

SELECT	LEN([WKT])
      ,[A38b_001]
      ,[A38b_002]
      ,[A38b_003]
      ,[A38b_004]
      ,[A38b_005]
      ,[A38b_006]
      ,[A38b_007]
      ,[A38b_008]
      ,[A38b_009]
      ,[A38b_010]
      ,[A38b_011]
  FROM [MedicalAreaDB].[dbo].[T_MEDICALAREA2]

 結果は以下の通り.全滅と言っていい結果である.

(列名なし)	A38b_001	A38b_002	A38b_003	A38b_004	A38b_005	A38b_006	A38b_007	A38b_008	A38b_009	A38b_010	A38b_011
863462	30201,30202,30304	和歌山市,海南市,紀美野町	3001	和歌山	438.24000000000	438.25000000000	425220	425900	49352	243383	133165
769402	30205,30381,30382,30383,30390,30392	御坊市,美浜町,日高町,由良町,印南町,日高川町	3005	御坊	579.02000000000	579.02000000000	63603	61675	7088	33859	20728
950155	30204,30361,30362,30366	有田市,湯浅町,広川町,有田川町	3004	有田	474.86000000000	474.79000000000	74255	72830	8353	40242	24235
115824	30203,30341,30343,30344	橋本市,かつらぎ町,九度山町,高野町	3003	橋本	463.42000000000	463.42000000000	88342	86150	9271	47182	29697
92423	30208,30209	紀の川市,岩出市	3002	那賀	266.72000000000	266.72000000000	116068	115807	14392	69103	32312
296071	05204,05209,05303	大館市,鹿角市,小坂町	0501	大館・鹿角	1822.00000000000	1822.44000000000	111552	106969	10261	54953	41755
5300406											

二次医療圏のメタデータ

shp属性名 属性名 説明
A38b_001 行政区域コード 当該二次医療圏を構成する市区町村の行政区域コード
A38b_002 市区町村名 当該二次医療圏を構成する市区町村の名称
A38b_003 二次医療圏コード 当該二次医療圏を示す一意のコード
A38b_004 二次医療圏名 当該二次医療圏の名称
A38b_005 面積(医療計画) 都道府県が定めた地域保健医療計画に掲載されている面積(㎡)
A38b_006 面積(国土地理院) 国土地理院が「全国都道府県市区町村別面積調」として公表している市区町村別の面積を、構成する市区町村について合計した面積(㎡)
A38b_007 人口(医療計画) 都道府県が定めた地域保健医療計画に掲載されている人口(人)
A38b_008 総人口(住民基本台帳 総務省が「住民基本台帳に基づく人口、人口動態及び世帯数」として公表している市区町村別・年齢別の総人口を、構成する市区町村について合計したもの(人)
A38b_009 人口(15才未満)(住民基本台帳) 総務省が「住民基本台帳に基づく人口、人口動態及び世帯数」として公表している市区町村別・年齢別の15才未満人口を、構成する市区町村について合計したもの(人)
A38b_010 人口(15才以上65才未満)(住民基本台帳) 総務省が「住民基本台帳に基づく人口、人口動態及び世帯数」として公表している市区町村別・年齢別の15才以上65才未満人口を、構成する市区町村について合計したもの(人)
A38b_011 人口(65才以上)(住民基本台帳) 総務省が「住民基本台帳に基づく人口、人口動態及び世帯数」として公表している市区町村別・年齢別の65才以上人口を、構成する市区町村について合計したもの(人)

まとめ

 令和2年(2020年)および平成25年(2014年)の医療圏のデータをダウンロードして SQL Server にアップロードした.

 令和2年の属性の文字化けは直っていたが,平成26年の属性の文字化けは直っていなかった.

 二次医療圏および三次医療圏の行数は明らかに多すぎると思われた.二次医療圏の属性には重複があり,異なるのはポリゴンデータであった.そのため二次医療圏は 335 行に,三次医療権は 52 行に集約できそうだったため,QGIS でポリゴンを融合した.しかしその結果,属性が文字化けし,ポリゴンの数を数える NumRing() メソッドの返り値が NULL になるなど悪影響が見られた.

“国土数値情報の令和2年の医療圏データの文字化けが直っていた” への1件の返信

コメントを残す

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

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