dx-junkyard / OpenData-Bridge-DataNorm

1 stars 0 forks source link

【自治体標準オープンデータセット】ジオコーディング #18

Closed yamamoto-ryuzo closed 10 months ago

yamamoto-ryuzo commented 11 months ago

こちらでジオコーディングに関する打ち合わせが出来ればと思います。

https://www.digital.go.jp/policies/data_strategy_government_interoperability_framework/ にも image でアドレスベースレジストリを使えと書いてますので。 それに準じたCSVからのジオコーディングが良いと思われます。

アドレスベースレジストリの詳細はこちらから https://www.digital.go.jp/policies/base_registry_address

【住居データの整備について】 今回はこちらのみ実施! 目黒区 https://drive.google.com/drive/folders/1Ap3LdjcRhbvniyGIc43rLsK-OuiomXoD 北九州 https://drive.google.com/drive/folders/1UZZhHvuGBqIK8Ahlqee0eq3B4LJW6O7S

【番地データの整備について】・・・こちらは整備保留! 北九州を例に法務局からの公開データ属性は https://drive.google.com/file/d/1Y4Ap3UUP72Z5xA2N_mzKC--NALKJaeTr/view?usp=drive_link の感じがいいと思います。 座標は番地の重心座標です。

yamamoto-ryuzo commented 11 months ago

あ!GIFにご作法が乗ってました・・・ 内容は、また、確認しようと思いますが、忘れたらいけないので投げておきます。

https://github.com/JDA-DM/GIF/blob/main/430_%E3%82%B3%E3%82%A2%E3%83%87%E3%83%BC%E3%82%BF%E3%83%A2%E3%83%87%E3%83%AB/docx/433_%E3%82%B3%E3%82%A2%E3%83%87%E3%83%BC%E3%82%BF%E3%83%A2%E3%83%87%E3%83%AB%E8%A7%A3%E8%AA%AC%E6%9B%B8_%E4%BD%8F%E6%89%80.docx

yamamoto-ryuzo commented 11 months ago

本日よりGIF対応版?ジオコーディングの属性定義を整理開始しました。

https://docs.google.com/spreadsheets/d/1l8S14Xgz-KPD3W_BZucWMadeJINk1vSx/edit?usp=drive_link&ouid=110098866251138022891&rtpof=true&sd=true

Mitsuo-Koikawa commented 11 months ago

ジオコーディングのデータそのものではなく、それを作成した過程を共有していただく事は可能でしょうか?位置座標データ作成過程をシステム化できればと思います。

fukumoto19981020 commented 11 months ago

azure mapsを使ってジオコーディング結果 日本だと市区町村レベルまでしか入力できないみたい(https://learn.microsoft.com/ja-jp/azure/azure-maps/geocoding-coverage#asia-pacific

入力1:日本東京千代田市 出力1:{'summary': {'query': '日 本 东 京 千 代 田 市', 'queryType': 'NON_NEAR', 'queryTime': 60, 'numResults': 1, 'offset': 0, 'totalResults': 1, 'fuzzyLevel': 2}, 'results': [{'type': 'Geography', 'id': 'ct4l5cvfxjS5r5lWQsVTkA', 'score': 8.2069892883, 'entityType': 'MunicipalitySubdivision', 'matchConfidence': {'score': 0.29142195913622027}, 'address': {'municipalitySubdivision': '千葉', 'municipality': '東京', 'countrySubdivision': 'Kanto', 'countrySubdivisionName': 'Kanto', 'countryCode': 'JP', 'country': '日本', 'countryCodeISO3': 'JPN', 'freeformAddress': '東京 千葉, Kanto'}, 'position': {'lat': 35.58038, 'lon': 140.11346}, 'viewport': {'topLeftPoint': {'lat': 35.64492, 'lon': 140.07999}, 'btmRightPoint': {'lat': 35.56562, 'lon': 140.14694}}, 'boundingBox': {'topLeftPoint': {'lat': 35.64492, 'lon': 140.07999}, 'btmRightPoint': {'lat': 35.56562, 'lon': 140.14694}}, 'dataSources': {'geometry': {'id': '00004153-3200-3c00-0000-000065a03f04'}}}]}

入力2:日本東京都千代田区丸の内一丁目 出力2:{'summary': {'query': '日 本 东 京 都 千 代 田 区 丸 の 内 一 丁 目', 'queryType': 'NON_NEAR', 'queryTime': 95, 'numResults': 0, 'offset': 0, 'totalResults': 0, 'fuzzyLevel': 2}, 'results': []}

yamamoto-ryuzo commented 11 months ago

国が進めているのは、アドレス・ベースレジストリの整備です。 その範疇内でジオコーディングの場合は、 https://drive.google.com/file/d/1Y4Ap3UUP72Z5xA2N_mzKC--NALKJaeTr/view?usp=drive_link こんな感じのデータを作るので、そこを検索してもらう感じになると思います。

どうしても、座標を取得したいというのなら有料サービスになるかと思います。 デジ庁案件を考えるのなら、どちらかは、戀川さんに確認してもらう必要があると思います。

明日は、こちらのアドレス・ベースレジストリの情報を充実させようかと思います。 北九州と目黒区を作成予定です。

yamamoto-ryuzo commented 11 months ago

目黒区のデータはこちらに整理いします。 住居表示:整備済み(再加工が必要)

https://catalog.registries.digital.go.jp/rc/dataset/ 必要なデータセットは 市区町村名 住居表示-住居マスター位置参照拡張 データセット 市区町村名 住居表示-街区マスター位置参照拡張 データセット

目黒区の場合は https://catalog.registries.digital.go.jp/rc/dataset/?q=%E7%9B%AE%E9%BB%92%E5%8C%BA&sort=score+desc%2C+metadata_modified+desc

東京都 目黒区 住居表示-住居マスター位置参照拡張 データセット 【課題】街区までの日本語表示がない image

【課題】街区までしかデータがないため役に立たない 東京都 目黒区 住居表示-街区マスター位置参照拡張 データセット image

【住居データの整備について】 この二つをミックスして利用!できるようにするとこうなる! 目黒区 https://drive.google.com/drive/folders/1Ap3LdjcRhbvniyGIc43rLsK-OuiomXoD

yamamoto-ryuzo commented 11 months ago

北九州市のデータはこちらに整理いします。 住居表示:整備済み(再加工が必要) https://catalog.registries.digital.go.jp/rc/dataset/?q=%E5%8C%97%E4%B9%9D%E5%B7%9E&sort=score+desc%2C+metadata_modified+desc

詳細はジオコーディングデータ作成方法(python編)参照

【住居データの整備について】 北九州 https://drive.google.com/drive/folders/1UZZhHvuGBqIK8Ahlqee0eq3B4LJW6O7S

目黒区のように全域とはいかないものの、さすが北九州おおむねの人口は網羅出来てるっぽい感じ!?たぶん??? image

yamamoto-ryuzo commented 11 months ago

image

【番地データの整備について】 とりあえずベースレジストリとしては未整備となっており、今回は我々も未整備で処理でいいですかね~~~ 逆に、自治体がデータ持ってる場合は、その時に対応ということで! 課税の関係で整備している自治体も多いでしょうから。 image アドレス・ベース・レジストリ データ解説書 <2022年4月 試験公開版> 抜粋

yamamoto-ryuzo commented 11 months ago

デジタル庁のアドレスベースレジストリとジオコーディングに対する考えについて

どうも、下記の通り入札が行われ、別途検証が行われているようです。たぶん???タイトルからして。。 我々が、これ以上時間かけてもたぶん、別途検証と重複するだけなので、今回は、上の案、程度で検索にかからなかったものは「NULL」でよいかと思います。

https://www2.njss.info/offers/view/27132132 ↑ 無料では閲覧に回数制限あります。

yamamoto-ryuzo commented 11 months ago

ジオコーディングデータ作成方法 居住マスタと街区マスタをリレーションしてあげるだけ・・・ リレーションが得意なのはリレーショナルデータベース、なので、今回はデータベース機能も有しているQGISで作成の例を明示

1.CSVデータの読み込み

今回読み込むデータはこの2つ image 下記操作を2つのファイルで実施 image image

2.CSVデータのリレーション(結合)

フィールド計算機で「町字+街区」のIDを2つのファイルで作成 image 「町字+街区」のIDをキーに結合 image

3.データの確認

image image 雰囲気あっているっぽい!

4.データのエクスポート

image 今回はあえてEPSGコードの変更は行わなず、元のデータを尊重する。 参考までに現在はJDG2011、整備データはJGD2000と古い。 image

5.CSVデータの確認

期待通り! image

yamamoto-ryuzo commented 10 months ago

ジオコーディングデータ作成方法(ChatGPT4を主に使う編)

 結局、Pythonで書いた方が早かったので中止!  中止理由は、データ収集とかしてくれなかった・・・残念。

  1. CSVデータの収集
    収集対象ファイルは以下の2サイト
    (住居マスター)
    https://catalog.registries.digital.go.jp/rc/dataset/?q=北九州市&06_rc_type=住居表示-住居マスター位置参照拡張(市区町村)&sort=score+desc%2C+metadata_modified+desc
    (街区マスター)
    https://catalog.registries.digital.go.jp/rc/dataset/?q=北九州市&06_rc_type=住居表示-街区マスター位置参照拡張(市区町村)&sort=score+desc%2C+metadata_modified+desc

  2. データファイルの結合

  3. CSVデータのリレーション(結合)

  4. データの確認

yamamoto-ryuzo commented 10 months ago

ジオコーディングデータ作成方法(python編)

コード等はこちら https://drive.google.com/drive/folders/1UZZhHvuGBqIK8Ahlqee0eq3B4LJW6O7S

ver2023-12-23 とりあえずファイル一覧からファイルをダウンロードして一つのファイルにまとめるところまで ver2023-12-24 とりあえず完成のは

image

##########################
######## 使いかた #########
##########################
### 入力
#市区町村名 住居表示-街区マスター位置参照拡張 データセット
#"gaiku_url_list.txt にURLを入力
#市区町村名 住居表示-住居マスター位置参照拡張 データセット
#"jyuukyo_url_list.txt"にURLを入力
### 出力
# 二つのデータセットを統合し、住居データとして出力
#'merged_jyuukyo.csv' ファイルが出力されます
# workフォルダには作業の状況が残ります
# ただし、work/extracted_filesフォルダ内は最後に作用した状況のみです

##################################################################
######### モジュール(module)やパッケージ(package)の読み込み #########
##################################################################
#Webページやデータを取得
import requests
#ZIPの圧縮・解凍
import zipfile
#OS依存機能を利用
import os
#データ分析作業を支援するためのモジュール
import pandas as pd
import shutil

###########################
######### 関数定義 #########
###########################
### ファイルのダウンロード
def download_file(url, local_filename):
    # URLからファイルをダウンロードし、特定のローカルファイルパスに保存する
    with requests.get(url, stream=True) as r:
        r.raise_for_status()
        with open(local_filename, 'wb') as f:
            for chunk in r.iter_content(chunk_size=8192):
                f.write(chunk)
    return local_filename
### 住居表示ファイルの取得及び結合
def address_download(file_name,combined_data_file):
    ### work/extracted_files フォルダのクリーニング
    ### ※注意! フォルダ内全ての一括処理があるため必ずその都度クリーニングを行うこと
    extracted_folder_path = 'work/extracted_files'
    if os.path.exists(extracted_folder_path):
        shutil.rmtree(extracted_folder_path)
    os.makedirs(extracted_folder_path)
    print(f"work/extracted_filesフォルダのクリーニングが完了しました。")
    ### 指定ファイル内のファイル一覧を読み込む
    # ファイルを読み込みモードで開く
    with open(file_name, "r") as file:
        # ファイルから行を1行ずつ読み込む
        file_list = file.readlines()
    # 各行の末尾の改行文字を削除
    file_list = [line.strip() for line in file_list]
    ### 読み込んだファイル一覧を順次処理
    for file_path in file_list:
        print(file_path)
        ### ファイルのダウンロード
        url = file_path
        local_filename = 'work/download.zip'
        download_file(url, local_filename)
        ### ダウンロードしてZIPファイルを読み込みモードで開き解凍
        with zipfile.ZipFile(local_filename, 'r') as my_zip:
            # ZIPファイル内のファイル一覧を表示
            file_list = my_zip.namelist()
            print("ZIPファイル内のファイル一覧:")
            for file_name in file_list:
                print(file_name)
            # ZIPファイル内の全てのファイルを解凍
            my_zip.extractall('work/extracted_files')
            ### 所定のフォルダ内のすべてのCSVファイルを結合
            ### 最初のファイルの属性行を取得しそれ以降のファイルの属性行は無視
            # CSVファイルが保存されているディレクトリを指定
            csv_directory = 'work/extracted_files'
            # 最初のCSVファイルから列名を取得
            first_file = os.listdir(csv_directory)[0]
            first_file_path = os.path.join(csv_directory, first_file)
            first_df = pd.read_csv(first_file_path)
            column_names = first_df.columns.tolist()
            # 結合するための空のDataFrameを作成
            combined_data = pd.DataFrame(columns=column_names)
            # 指定したディレクトリ内のCSVファイルを結合
            for filename in os.listdir(csv_directory):
                if filename.endswith(".csv"):
                    file_path = os.path.join(csv_directory, filename)
                if file_path == first_file_path:
                    # 最初のファイルはスキップして、列名を引き継ぐ
                    continue
                df = pd.read_csv(file_path)
                # 列名を引き継いで結合
                combined_data = pd.concat([combined_data, df], ignore_index=True)
                # 結合したデータを1つのCSVファイルに保存
                combined_data.to_csv(combined_data_file, index=False)
            print(f"CSVファイルの結合が完了しました。")
    ### CSVファイルを文字列として読み込む
    df = pd.read_csv(combined_data_file,dtype=str)
    # 結合したい文字列の属性を選択し、新しい文字列の属性を作成する
    df['街区ユニークid'] = df['全国地方公共団体コード'] + df['町字id'] + df['街区id']
    # 新しいCSVファイルに保存する
    df.to_csv(combined_data_file, index=False)
    print(f"街区ユニークidを追加しました。")
    return

#########################
######## メイン #########
########################
try:
    ### work フォルダのクリーニング
    work_folder_path = 'work'
    if os.path.exists(work_folder_path):
        shutil.rmtree(work_folder_path)
    os.makedirs(work_folder_path)
    print(f"workフォルダのクリーニングが完了しました。")
    ### 住居表示ファイルの取得及び結合
    # address_download("住居表示ファイル名一覧ファイル名を指定",'結合住居表示ファイル名')
    #市区町村名 住居表示-街区マスター位置参照拡張 データセット
    address_download("gaiku_url_list.txt",'work/combined_gaiku.csv')
    print(f"市区町村名 住居表示-街区マスターが作成されました。")
    #市区町村名 住居表示-住居マスター位置参照拡張 データセット
    address_download("jyuukyo_url_list.txt",'work/combined_jyuukyo.csv')
    print(f"市区町村名 住居表示-住居マスターが作成されました。")
    ### 住居マスターに街区マスターを結合する
    # 1つ目のCSVファイルを読み込む
    df1 = pd.read_csv('work/combined_jyuukyo.csv')
    # 2つ目のCSVファイルを読み込む
    df2 = pd.read_csv('work/combined_gaiku.csv')
    # 属性をキーにして結合
    # 結合方式はleftのすべての行が保持
    # 同じ属性が重複する場合は街区データ側に接尾辞を追加
    merged_df = pd.merge(df1, df2, on='街区ユニークid', how='left', suffixes=('', '_街区'))
    # 結合結果を新しいCSVファイルとして保存
    merged_df.to_csv('merged_jyuukyo.csv', index=False)
    print(f"居住データベースが作成されました。")
# エラー処理
except FileNotFoundError:
    print(f"ファイルが見つかりません。")
except Exception as e:
    print(f"エラーが発生しました: {e}")
yamamoto-ryuzo commented 10 months ago

GPT4先生にデータを検索してもらった https://chat.openai.com/share/45d15d1d-4b89-4150-ac8d-56d1f18197ac image QGISでのデータ表示 image 小数点が勝手に切られているが、ちゃんと検索してくれていると思われる(たぶん)。 が、すごく遅い。。。実務では使えない。

yamamoto-ryuzo commented 10 months ago

https://datanorm.azurewebsites.net/api/geocode?city_block_id=3&residence_id=28&address=赤岩町

APIにも無事実装されれ多様なので、このスレッドはクローズです。

つづきは https://github.com/dx-junkyard/OpenData-Bridge-DataNorm/issues/19

image