はじめに
地図XMLでは公共座標系と任意座標系のものが混在しています。ファイル数や座標系のリスト方法は過去の記事で書いていますが、今回は町字(地番区域)ごとに、公共座標の割合(ファイル数ベース、筆数ベース)を数えてみようと思います。
『●●市A町X丁目: ファイル数 N、筆数M,公共座標率 Z%』 というようなリストを作ることを目標にします。
手順
STEP 1. 方法の検討
地図XMLはG空間情報センターからのダウンロード時、各市区町村のデータが1つのZIPファイルにまとまっていますが、その中に複数のXMLが再度ZIP圧縮されています。1段階目のZIPファイルの直下には当該市区町村の地番一覧であるサーチリストが入っています。(下図赤枠)
サーチリストを眺めると、ファイル名、出力年月日、地番地区、地番 等が入っています。これはよい材料ヒントになりそうです。ここから、地番区域ごとのファイル数、ポリゴン数(≒筆数)などがわかります。なお、このリストはUTF8でなくてSJISだと思います。
地図XMLの仕様1.1.1(下図)によれば、一つのファイルは一つの座標系です。サーチリストを見ていると、地番地区については1つのXMLに複数の地番区域が入っているケースもありました。各ファイルで地番区域の筆数を数える必要がありそうです。
つまり、「地図XMLファイル名」には一つの「座標系」と複数の「地番区域」ごとにポリゴン(=筆数)がカウントできるのではないかと想像しています。各XMLファイルの座標系は先日の記事(こちら)でリストできますので、今回は各XMLファイルと地番区域名の関係を中心にしてリストを作ります。
STEP 2. サーチリストを処理
各ZIPファイルから抜き出したサーチリストをフォルダにまとめます。ここではsrcフォルダに入れておきます。一覧リストの取得にはすべてのZIPファイルの解凍が必要ですが、その方法は先日の記事(こちら)のSTEP2を行うと出てきます。
そして、各XMLファイル中の地番ごとのポリゴン数のリストを作るためRで以下のコマンドを実施しました。
#ライブラリのインストール
library("dplyr") #データベースの操作をするためのパッケージ(filterなど)
library("stringr") #文字列処理のパッケージ
#対象ファイルリストの読み込み
listDataPath <- 'src'
dataList <- list.files(listDataPath, pattern="search-list.csv")
#各リストをターゲットとして、統計をだす処理をする。
for (i in 1:length(dataList)){
if(exists("target")){rm(target)}
target <- dataList[i]
if(exists("searchList")){rm(searchList)}
searchList <- read.csv(paste(listDataPath,"/",target,sep=""),fileEncoding="cp932",header=TRUE,colClasses=rep("character",6))
searchList <- select(searchList,1,3)
#XMLファイル(XMLファイルのZIPファイル)ごとに処理するため一覧を取得
if(exists("files")){rm(files)}
files <- unique(searchList[,1])
# 各XMLファイルごとに統計を取る。
for(j in 1:length(files)){
if(exists("subList")){rm(subList)}
subList <- filter(searchList, ZIPファイル名==files[j])
#各XMLファイル中の地番区域ごとに筆数を調べる
if(exists("stat1")){rm(stat1)}
stat1 <-
subList %>%
group_by(地番区域) %>%
summarise(n=n())
for (k in 1:nrow(stat1)){
write(paste(substr(searchList[j,1],1,5),",",files[j],",",stat1[k,1],",",stat1[k,2],sep=""),"result20241004.csv",append=TRUE)
}
}
}
市区町村コード、ファイル名、地番地区、その行数の一覧がどんどん出てきます。1,143,586行あるので、処理にも数時間かかったように思います(昼間はほったらかしにしておりました。)。市区町村コードは地図XMLのファイル名から抽出できます。全国地方公共団体コード6桁ではなくて法務省で使っている5桁のコードです(全国地方公共団体コードの5桁目までと同じ)。
STEP 3. 投影法情報を追加
次に、Step2で作ったリストのファイル名を利用して、投影法情報を追加します。そして、そのあとに各町字ごとの関係ファイル数(地図XML)とその公共座標率、また各町字のポリゴン数とその公共座標率を計算します。STEP2と同じ作業フォルダで以下のRスクリプトを実行しました。
準備した投影法リストは下図のような感じです。作り方は以前の記事にあります。
作ったRスクリプトは以下の感じです。
#ライブラリのインストール
library("dplyr") #データベースの操作をするためのパッケージ(filterなど)
library("stringr") #文字列処理のパッケージ
#対象ファイルリストの読み込み
zahyo <- read.csv("projection-list-edit.csv",fileEncoding="cp932",header=FALSE,colClasses=rep("character",2)) #投影法リスト
kekka <- read.csv("result20241004.csv",fileEncoding="utf8",header=FALSE,colClasses=c(rep("character",3),"numeric")) #前のステップの結果
#文字列の調整
zahyo[,1] <- sub(".xml",".zip",zahyo[,1]) #投影法リストのファイル名をZIPにして今回のリストに合わせます
zahyo[,2] <- gsub(" ","",zahyo[,2]) #前回作ったときにスペースを入れてしまったので削除しておく。
#今後の解析処理用に結果・地番地区名を調整(府中市(東京都と広島県)、伊達市(北海道と福島県)のように同名の市区町村があるので市区町村コードと地番地区をつなげる文字列にする。
kekka[,5] <- paste(kekka[,1],"-",kekka[,3],sep="")
#座標をjoin(ベースは解析結果)
joinTable <- left_join(kekka,zahyo,by=c("V2"="V1"))
#書き出し処理に向けて地番地区(町字)リストmachiListを作成
machiList <- unique(joinTable[,c(1,3,5)]) #東京と広島の府中市、北海道と福島の伊達市に注意
#一行目はタイトル
write(paste("市区町村コード","地番区域","ファイル数","公共座標ファイル数","公共座標ファイル割合(%)","筆数(ポリゴン数)","公共座標筆数(ポリゴン数)","公共座標筆(ポリゴン数)割合(%)",sep=","),"2024-chizuXML公共座標率.csv",append=TRUE)
#各市区町村・地番地区(町字について処理)
for(i in 1:nrow(machiList)){
#全体から当該地番地区を抽出
if(exists("target")){rm(target)}
target <- filter(joinTable, V5 == machiList[i,3] )
##地番地区の関係ファイル数での数、割合
if(exists("stat1")){rm(stat1)}
if(exists("niniFileN")){rm(niniFileN)}
if(exists("kokyoFileN")){rm(kokyoFileN)}
if(exists("fileN")){rm(fileN)}
stat1 <-
target %>%
group_by(V2.y) %>%
summarise(fileN=n())
if(nrow(filter(stat1,V2.y=="任意座標系"))==1){
niniFileN <- filter(stat1,V2.y=="任意座標系")[1,2]
}else{
niniFileN <- 0
}
fileN <- sum(stat1[,2])
kokyoFileN <- fileN - niniFileN
##筆数(ポリゴン数)での数、割合
if(exists("stat2")){rm(stat2)}
if(exists("niniFudeN")){rm(niniFudeN)}
if(exists("kokyoFudeN")){rm(kokyoFudeN)}
if(exists("fudeN")){rm(fudeN)}
stat2 <-
target %>%
group_by(V2.y) %>%
summarise(fudeN=sum(V4))
if(nrow(filter(stat2,V2.y=="任意座標系"))==1){
niniFudeN <- filter(stat2,V2.y=="任意座標系")[1,2]
}else{
niniFudeN <- 0
}
fudeN <- sum(stat2[,2])
kokyoFudeN <- fudeN -niniFudeN
#書き出し
write(paste(machiList[i,1],machiList[i,2],fileN,kokyoFileN,round(kokyoFileN/fileN*100,1),fudeN,kokyoFudeN,round(kokyoFudeN/fudeN*100,1),sep=","),"2024-chizuXML公共座標率.csv",append=TRUE)
}
こうして以下の図のようなファイルができました。ファイル数ベースでの割合も筆数(ポリゴン数)ベースでの割合もわかるので便利です。
表記揺れはあるでしょうが、このリストをデジ庁の町字マスタの町字IDとつなげるといろいろと便利そうですが、今回はそこまではやりません。
結果
今回、地図XML2024年度版の各地番地区ごとのファイル数、筆数(ポリゴン数)とその公共座標率をリストできました。
こちらのGitHubページで結果を見られます。
その他
地図XMLを公開してくれている法務省とG空間情報センターに感謝します。
この解析は間違っている可能性もあります。間違っているときにはコメント欄で教えてください。結果の利用については各自の判断でお願いします。結果の利用で生じた損害について当方は責任を負いませんので、その点ご理解の上ご参照ください。
参考ページ