以前の投稿(Shape2SQL でシェープファイルを SQL Server 2008 R2 にアップロードする)で国土数値情報ダウンロードサービスの医療圏データが文字化けしていると記述した.改めてダウンロードして SQL Server にアップロードしたところ,いつの間にか文字化けが直っていた.以前にも河川データの文字化けを指摘したことがあるが,こちらも修正されていた(国土数値情報の河川データが一部直っていた件).どうやら国土交通省に指摘すると修正してくれるらしい.
国土数値情報ダウンロードサービス
「政策区域」「行政地域」「医療圏」
国土数値情報ダウンロードサービスの「政策区域」「行政地域」「医療圏」に目的のファイルがある.
全国の令和2年を選ぶ.例によってアンケートがあるので意見を言いたい人は書き込んでおく.
ダウンロードした zip ファイルを展開すると 3GB を超えるフォルダーになる.中身を覗くと3種類の Shapefile が存在することが分かる.
Shape2SQLでSQL Serverにアップロード
あまり期待せずに Shape2SQL で SQL Server にアップロードしてみた.アップロード先は MedicalAreaDB である.
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...
何と,文字化けしていない!続けて二次医療圏,三次医療圏のデータもアップロードしてみる.
二次医療圏,三次医療圏が多すぎる
気になったのがファイル数である.一次医療圏が約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 で二次医療圏のシェープファイルを開き,下図のように設定する.詳細パラメータは指定しない.
「基準となる属性」には二次医療圏コードを示す列を指定する.
実行すると属性テーブルの行数が 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 をテキストストリームにするなど工夫がいる.
しかし,SQL Server のウィザードで下図のようなエラーが発生した.
構わずに進めていく.
最終的にアップロードできた行は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件の返信