以前、こんな記事をまとめたら、結構アクセスしていただいている。
この緯度経度情報は、国土地理院にて公開されているオープンデータを、
- 公開されている【度分秒】の緯度経度を、十進法にも変換して使いやすく
- ワンクリックでコピペして使いやすく
という意図で書いたものであった。
ただ、このソースの国土地理院のページを改めて閲覧してみたところ、一覧は削除され、「地理院地図で調べられるよ」というPDFに情報が置き換わっていた。
それはそうだけど、一覧にしてQGISなどで地図上にすべて表示…というようなことがしたい場合もあるであろう。
そういうときに、最新の情報を一覧で取得する方法を考えてみた。
いきなり結果:最終的なソースコードはこちら
下記ページの、「都道府県コード及び市区町村コード」というExcelファイルをPCに保存。

- 【必須】「利用するアプリケーション名と、メールアドレス」を記入(①の箇所)
- 【必須】総務省エクセルを保存した、ファイルパスを記入(②の箇所)
- シート名は総務省エクセルの現状のものが入れてあります。政令指定都市の場合は、「R6.1.1政令指定都市」です!(③の箇所)
- 出力ファイル名は、必要だったらパス名とファイル名を入力してください(④の箇所)。
*1700以上の市区町村+都道府県の庁舎を検索するのでそれなりに時間がかかります。
# === 設定 ===
HEADERS = {
"User-Agent": "application-name (your-email@example.com)"
} #①必ず適切な名前・連絡先に変更!
input_excel = "file_path" #②入力ファイル名(エクセルのファイルパス)
sheet_name = "R6.1.1現在の団体" #③シート名(必要なら変更)
output_excel = "output.xlsx" #④出力ファイル名(必要なら変更)
import pandas as pd
import requests
import time
# === 度分秒(DMS)変換関数 ===
def decimal_to_dms(decimal_str):
try:
decimal = float(decimal_str)
degrees = int(decimal)
minutes_float = abs(decimal - degrees) * 60
minutes = int(minutes_float)
seconds = round((minutes_float - minutes) * 60, 2)
return f"{degrees}°{minutes}′{seconds}″"
except:
return ""
# === Excel 読み込み ===
df = pd.read_excel(input_excel, sheet_name=sheet_name)
results = []
# === 各行を処理 ===
for idx, row in df.iterrows():
# 都道府県と市区町村の取得(列番号または列名で対応)
prefecture = str(row['B']) if 'B' in row else str(row.iloc[1])
city = str(row['C']) if 'C' in row else str(row.iloc[2])
# 市区町村名が空かチェック
if pd.isna(city) or str(city).strip().lower() == "nan" or str(city).strip() == "":
search_names = [f"{prefecture}庁"]
city_display = "" # 表示用
else:
base = f"{prefecture}{city}"
search_names = [f"{base}役所", f"{base}役場"]
city_display = city
lat = lon = ""
found_name = ""
# 検索処理(役所→役場→庁)
for name in search_names:
url = "https://nominatim.openstreetmap.org/search"
params = {
"q": name,
"format": "json",
"limit": 1
}
try:
response = requests.get(url, params=params, headers={"User-Agent": user_agent})
data = response.json()
if data:
lat = data[0]["lat"]
lon = data[0]["lon"]
found_name = name
break
except Exception as e:
print(f"エラー ({name}): {e}")
lat = lon = "エラー"
found_name = name
break
time.sleep(1) # 念のためAPI過負荷防止
# DMS変換
lat_dms = decimal_to_dms(lat)
lon_dms = decimal_to_dms(lon)
print(f"{found_name or '検索失敗'}: {lat}, {lon}, {lat_dms}, {lon_dms}")
results.append({
"都道府県": prefecture,
"市区町村": city_display,
"検索名": found_name,
"緯度(10進)": lat,
"経度(10進)": lon,
"緯度(度分秒)": lat_dms,
"経度(度分秒)": lon_dms
})
time.sleep(1)
# === 出力 ===
output_df = pd.DataFrame(results)
output_df.to_excel(output_excel, index=False)
print(f"\n 完了!'{output_excel}' に保存しました。")
方法:Nominatimを使って、OpenStreetMapで検索・緯度経度を取得しよう
どうやって行なっているのか、以下、注意点も交えて解説する。
まず、都道府県と市区町村の一覧については、下記ページでエクセル公開されている。

こちらを使って、
- 市区町村名がない場合→「都道府県名+庁」として検索して緯度経度取得
- 市区町村名がある場合→「役所」もしくは「役場」として緯度経度取得
…というシンプルなものです。
結果:うまくいった!
こんな感じのエクセルに出力。ちなみに、度分秒にも変換して出しています。
いい感じ!!

「役所」だけだと、かなり「該当なし」になってしまったのですが、「役所で該当場所がなかったら役場にして」というコードにしたらめっちゃ該当箇所が上がりました。
ひとつチェックしてみましょう。
宮城県多賀城市役所 38.2940201 141.0042286
と出ているが、地理院地図で確認してみると…。

やった!
ただ、下記の市区町村は「該当なし」となりました。役場第一庁舎とか、特殊な名前なのかな?
こちらは、冒頭の地理院地図でしらべるなりなんなりするしかない。十六箇所だから許して!!!
手作業で地理院地図等で調べた結果を掲載しておきます!(親切!)
- 福島県 玉川村 玉川村役場*地理院地図 37.21072720 140.40902942 37°12′38.62″N 140°24′32.51″E
- 長野県 小海町 小海町役場*地理院地図 36.09511544 138.48349560 36°5′42.42″N 138°29′0.58″E
- 長野県 軽井沢町 軽井沢町役場*地理院地図 36.34833302 138.59694853 36°20′53.99″N 138°35′49.02″E
- 長野県 御代田町 御代田町役場*地理院地図 36.32274865 138.50649898 36°19′21.90″N 138°30′23.40″E
- 長野県 立科町 立科町役場*地理院地図 36.27205300 138.31607100 36°16′19.39″N 138°18′57.86″E
- 長野県 上松町 上松町役場*地理院地図 35.78218650 137.69323516 35°46′55.87″N 137°41′35.65″E
- 長野県 大桑村 大桑村役場*地理院地図 35.68931997 137.67156835 35°41′21.55″N 137°40′17.65″E
- 長野県 麻績村 麻績村役場*地理院地図 36.45611049 138.04528142 36°27′22.00″N 138°2′43.01″E
- 長野県 生坂村 生坂村役場*地理院地図 36.42521509 137.92758328 36°25′30.77″N 137°55′39.30″E
- 長野県 飯綱町 飯綱町役場*地理院地図 36.75447800 138.23544300 36°45′16.12″N 138°14′7.59″E
- 高知県 梼原町 梼原町役場*地理院地図 33.39222067 132.92696336 33°23′31.99″N 132°55′37.07″E
下記市区町村は、「北方領土に日本の施政権は及んでおらず、法令上のみ存在する村となっている。」とのことです。
- 北海道 色丹村
- 北海道 留夜別村
- 北海道 留別村
- 北海道 紗那村
- 北海道 蘂取村
注意点:規約にある注意事項など
ただ、NominatimのAPIは自前のサーバー構築していない場合、商用利用が推奨されていないらしい(検索をアプリに実装する場合なのかな…結果を使用するのはいいのかも。よくわからん。)。
あと、規約に「同一IPアドレスからのアクセスは、1秒に1リクエスト以下を厳守」とあるので、念の為、1件検索したら、1秒待機…という内容にしました。こちらもご注意を。
あと(多いな。笑)、User-Agentを指定する必要があり、「利用するアプリケーション名と、メールアドレス」を記入しておく必要があります。
詳しくは、下記を参照のこと。
コメント