#author("2020-07-07T03:15:46+09:00","default:nobuoki","nobuoki")
* 「地名の最後の一文字」を取りそこねていたので訂正 [#z07ab7ae]

#author("2020-07-27T13:14:24+09:00","default:nobuoki","nobuoki")
[[Stories/2020-07-06]] の元ネタは国土地理院データでしたが、これだと一部抜け漏れが出ていました
例)茨城県だと、桜川市、石岡市、水戸市、茨木町、のデータが掛ける(←それ以外もあるけど・・・)
#ref(./01.PNG,35%)

国土地理院データ以外でどうにかして「とある市区町村に属する町字名を取得」する方法が無いかと探した結果、
[[API | HeartRails Geo API | 郵便番号/住所/緯度経度データ変換サービス>http://geoapi.heartrails.com/api.html]] の使い勝手が良さそうなので新たな手順を考えてみました

** 手順 [#c55e4018]
ざっくり解説
- とある都道府県に属する市区町村一覧を取得する
- 個々の市区町村について、そこに属する町域情報(町字名)を取得する
- 町域情報をいい感じに加工して、緯度、経度、地名の最後の一文字、を取得する

+ 市区町村一覧を取得する関数を定義しておく
#prism(bash){{{
# 関数定義
getCities ()
{
    curl -s "http://geoapi.heartrails.com/api/json?method=getCities&prefecture=$1" | jq -r '.response.location[]|.city'
}

# 実行例
export pref=茨城県 # あとあと都道府県名を使うので環境変数に格納しておく

getCities $pref | head -n3
水戸市
日立市
土浦市
}}}
#br
+ 町域情報を取得する関数を定義しておく
#prism(bash){{{
# 関数定義
getTowns ()
{
    case "$#" in
        1)
            curl -s "http://geoapi.heartrails.com/api/json?method=getTowns&city=$1" | jq -r '.response.location[]|[.x, .y, .city, .town] | @csv'
        ;;
        2)
            curl -s "http://geoapi.heartrails.com/api/json?method=getTowns&city=$1&prefecture=$2" | jq -r '.response.location[]|[.x, .y, .city, .town] | @csv'
        ;;
    esac
}

# 実行例1: 市区町村名のみ指定
getTowns 大宮 | head -n3
"139.626988","35.903223","さいたま市大宮区","下町一丁目"
"139.628315","35.903642","さいたま市大宮区","下町二丁目"
"139.630028","35.904032","さいたま市大宮区","下町三丁目"

# 実行例2: 市区町村名と都道府県名を指定
getTowns 大宮 $pref | head -n3
"140.427461","36.541261","常陸大宮市","宇留野"
"140.408893","36.563089","常陸大宮市","姥賀町"
"140.418712","36.542245","常陸大宮市","栄町"
}}}
#br
+ 2つの関数を使い、ある都道府県に含まれる町域を取得する
#prism(bash){{{
export pref=茨城県; for c in $(getCities $pref); do getTowns $c $pref; done | tee $pref-ichiran-plain.csv
}}}
#br
+ 町域情報をいい感じに加工して、緯度、経度、地名の最後の一文字、を取得する
#prism(bash){{{
# 前述の手順で作成したファイルを入力
cat $pref-ichiran-plain.csv | \
# ダブルクォーテーションを削除
tr -d \" | \
# awkでいい感じに編集
awk -F, -v OFS=, '
{
  # 町域レベル住所を加工するために変数に格納
  # ただし /(その他)/ にマッチした場合は市区町村レベルの住所を利用する
  if($NF~/(その他)/) a=$(NF-1); else a=$NF
  # 「最後の一文字」に相応しくない文字を消す
  # 例:山本町南五丁目町 -> 「本」より後ろを削除
  # 例:豊田町           -> 「田」より後ろを削除
  # 例:中村             -> 「中」より後ろを削除
  # 例:中村南一丁目     -> 「村」より後ろを削除/いかんともしがたい
  sub(/(町?[東西南北]?[〇一二三四五六七八九十百]+丁目|[市区町村])$/, "", a)
  # 緯度、経度、町域レベル住所、最後の一文字 を出力
  print $0,substr(a,length(a))
}' >$pref-ichiran.csv # 結果をファイルにリダイレクト
}}}
#br
+ QGISに $pref-ichiran.csv を取り込んで表示
#ref(./02.PNG,35%)

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS