1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Last updated at Posted at 2024-10-11

はじめに

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

手順

STEP 1. 方法の検討

地図XMLはG空間情報センターからのダウンロード時、各市区町村のデータが1つのZIPファイルにまとまっていますが、その中に複数のXMLが再度ZIP圧縮されています。1段階目のZIPファイルの直下には当該市区町村の地番一覧であるサーチリストが入っています。(下図赤枠)
image.png

サーチリストを眺めると、ファイル名、出力年月日、地番地区、地番 等が入っています。これはよい材料ヒントになりそうです。ここから、地番区域ごとのファイル数、ポリゴン数(≒筆数)などがわかります。なお、このリストはUTF8でなくてSJISだと思います。
image.png

地図XMLの仕様1.1.1(下図)によれば、一つのファイルは一つの座標系です。サーチリストを見ていると、地番地区については1つのXMLに複数の地番区域が入っているケースもありました。各ファイルで地番区域の筆数を数える必要がありそうです。
image.png

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

STEP 2. サーチリストを処理

各ZIPファイルから抜き出したサーチリストをフォルダにまとめます。ここではsrcフォルダに入れておきます。一覧リストの取得にはすべてのZIPファイルの解凍が必要ですが、その方法は先日の記事(こちら)のSTEP2を行うと出てきます。
image.png

そして、各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桁目までと同じ)。
image.png

STEP 3. 投影法情報を追加

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

準備した投影法リストは下図のような感じです。作り方は以前の記事にあります。
image.png

作った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

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

結果

今回、地図XML2024年度版の各地番地区ごとのファイル数、筆数(ポリゴン数)とその公共座標率をリストできました。
こちらのGitHubページで結果を見られます。

その他

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

参考ページ

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?