地図XML（2024年度）で地番区域（町字）ごとのファイル数・筆数（と公共座標割合）を調べる


# はじめに
地図XMLでは公共座標系と任意座標系のものが混在しています。ファイル数や座標系のリスト方法は過去の記事で書いていますが、今回は町字（地番区域）ごとに、公共座標の割合（ファイル数ベース、筆数ベース）を数えてみようと思います。
『●●市A町X丁目：　ファイル数 N、筆数M,公共座標率　Z%』　というようなリストを作ることを目標にします。

# 手順

## STEP 1. 方法の検討
地図XMLはG空間情報センターからのダウンロード時、各市区町村のデータが１つのZIPファイルにまとまっていますが、その中に複数のXMLが再度ZIP圧縮されています。1段階目のZIPファイルの直下には当該市区町村の地番一覧であるサーチリストが入っています。（下図赤枠）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/86adf7ae-6519-d87f-daa3-65224a1ca069.png)

サーチリストを眺めると、ファイル名、出力年月日、地番地区、地番　等が入っています。これはよい材料ヒントになりそうです。ここから、地番区域ごとのファイル数、ポリゴン数（≒筆数）などがわかります。なお、このリストはUTF8でなくてSJISだと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/d215afb5-a5f5-89ce-80f9-d9c2320e7552.png)

地図XMLの仕様１．１．１（下図）によれば、一つのファイルは一つの座標系です。サーチリストを見ていると、地番地区については１つのXMLに複数の地番区域が入っているケースもありました。各ファイルで地番区域の筆数を数える必要がありそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/61e7cee4-2e78-66d8-bd9e-77db824e9052.png)

つまり、「地図XMLファイル名」には一つの「座標系」と複数の「地番区域」ごとにポリゴン（=筆数）がカウントできるのではないかと想像しています。各XMLファイルの座標系は先日の記事（[こちら](https://qiita.com/T-ubu/items/3a279d84d2bee134a9c7)）でリストできますので、今回は各XMLファイルと地番区域名の関係を中心にしてリストを作ります。



# STEP 2. サーチリストを処理
各ZIPファイルから抜き出したサーチリストをフォルダにまとめます。ここではsrcフォルダに入れておきます。一覧リストの取得にはすべてのZIPファイルの解凍が必要ですが、その方法は先日の記事（[こちら](https://qiita.com/T-ubu/items/3a279d84d2bee134a9c7)）のSTEP2を行うと出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/9e18dcb1-a012-e719-acc4-d34c16375110.png)

そして、各ＸＭＬファイル中の地番ごとのポリゴン数のリストを作るためRで以下のコマンドを実施しました。

```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)

  #ＸＭＬファイル（ＸＭＬファイルのＺＩＰファイル）ごとに処理するため一覧を取得
  if(exists("files")){rm(files)}
  files <- unique(searchList[,1])

  # 各ＸＭＬファイルごとに統計を取る。
  for(j in 1:length(files)){
    if(exists("subList")){rm(subList)}
    subList <- filter(searchList, ZIPファイル名==files[j])

    #各ＸＭＬファイル中の地番区域ごとに筆数を調べる
    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桁目までと同じ）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/9d53ad67-463c-44b1-550b-180c29e1b1c7.png)


# STEP 3. 投影法情報を追加
次に、Step2で作ったリストのファイル名を利用して、投影法情報を追加します。そして、そのあとに各町字ごとの関係ファイル数（地図XML）とその公共座標率、また各町字のポリゴン数とその公共座標率を計算します。STEP２と同じ作業フォルダで以下のRスクリプトを実行しました。

準備した投影法リストは下図のような感じです。作り方は以前の記事にあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/83507636-20f6-1750-9972-274d6d1a34b4.png)


作った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)
}
```

こうして以下の図のようなファイルができました。ファイル数ベースでの割合も筆数（ポリゴン数）ベースでの割合もわかるので便利です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/40bcf7c6-5b68-317c-7477-fc4f55a87a8a.png)

表記揺れはあるでしょうが、このリストをデジ庁の町字マスタの町字IDとつなげるといろいろと便利そうですが、今回はそこまではやりません。

# 結果
今回、地図XML2024年度版の各地番地区ごとのファイル数、筆数（ポリゴン数）とその公共座標率をリストできました。
[こちらのGitHubページ](https://github.com/ubukawa/chizuXML-chikuFude/blob/main/2024-chizuXML%E5%85%AC%E5%85%B1%E5%BA%A7%E6%A8%99%E7%8E%87.csv)で結果を見られます。

# その他
地図XMLを公開してくれている法務省とG空間情報センターに感謝します。
この解析は間違っている可能性もあります。間違っているときにはコメント欄で教えてください。結果の利用については各自の判断でお願いします。結果の利用で生じた損害について当方は責任を負いませんので、その点ご理解の上ご参照ください。

# 参考ページ

https://qiita.com/T-ubu/items/3a279d84d2bee134a9c7

https://front.geospatial.jp/

https://github.com/ubukawa/chizuXML-chikuFude