Open-Meteoの地名検索で「札幌」が0件になる理由と、国土地理院APIへの切り替え

執筆・制作:何でも自作する人(運営者について)

個人開発 / Webアプリ / API / トラブル対応


洗濯物をいつ干すとよく乾くかを天気予報から出す、自分用のWebアプリを作りました。天気は無料の Open-Meteo を使い、場所を選ぶ地名検索も同じ Open-Meteo の Geocoding API で作りました。

最初に「渋谷」で試すと結果が出たので、動いていると思っていました。ところが「札幌」と入れると0件でした。

主要都市を並べて試した結果

1語で試しただけでは分からないので、主要都市をまとめて投げました。language=ja を付けて、2026年10月14日に確認した結果です。

入力件数先頭の結果
札幌0件―
那覇0件―
大阪0件―
さっぽろ0件―
横浜4件横浜(青森県)
福岡8件福岡(埼玉県)
渋谷3件渋谷(東京都)
名古屋2件名古屋市(愛知県)
札幌市1件札幌市(北海道)
Sapporo2件札幌市(北海道)

「札幌市」や英語の「Sapporo」なら出るのに、「札幌」では出ません。 「横浜」は青森県上北郡の横浜町が先頭で、横浜市は4件の中にありませんでした。「福岡」も先頭は埼玉県の地名です。

「名古屋」は名古屋市が出るので、都市ごとに当たり外れがあります。最初に試した1語がたまたま当たりだと、問題に気づけません。

原因の見当

Open-Meteo の Geocoding は GeoNames というオープンな地名データベースを元にしています。GeoNames の地名には各言語の別名が登録されていて、日本語の検索はその別名に一致したものだけが返ってくるようです。

「札幌市」という別名はあっても「札幌」はない、という登録のされ方なのだと考えています。データの中身までは確かめていないので、ここは推測です。

国内は国土地理院の地名検索に切り替える

国内の地名は、国土地理院の地名検索に切り替えました。APIキーが不要で、ブラウザから直接呼び出せます。

https://msearch.gsi.go.jp/address-search/AddressSearch?q=札幌

同じ日に同じ語で試すと、件数はまったく違います。

入力件数そのままの先頭
札幌599件北海道札幌市
那覇152件沖縄県那覇市
横浜782件青森県横浜
大阪1023件福島県二本松市大坂
福岡773件岩手県二戸市福岡

今度は0件にはなりません。ただし、返ってくる順番のままでは「横浜」の先頭が青森、「大阪」の先頭が福島の「大坂」です。件数が多い分、並び順を自分で直す必要があります。

「入力+市・区」を先頭に並べ替える

アプリでは、返ってきた地名を次の順で並べ直しています。

  1. 入力した語のすぐ後ろが「市」か「区」で終わるもの(横浜市、大阪市)
  2. 入力した語のすぐ後ろが「町」か「村」で終わるもの(横浜町)
  3. それ以外で「市・区・町・村」で終わるもの
  4. 残り(山・湖・字名など)

同じ順位の中では、国土地理院が返した順番を保ちます。

const muni = new RegExp(`(${escaped})(市|区|町|村)$`);
const rank = t =>
  muni.test(t) && /(市|区)$/.test(t) ? 0 :
  muni.test(t) ? 1 :
  /(市|区|町|村)$/.test(t) ? 2 : 3;

並べ替えたあとの先頭は次のとおりです。

入力並べ替え後の先頭
横浜神奈川県横浜市
大阪大阪府大阪市
福岡福岡県福岡市
札幌北海道札幌市

海外とひらがなは残る課題

国土地理院の地名検索は国内だけで、「Sapporo」のようなローマ字は0件です。そこで、国土地理院で0件のときだけ Open-Meteo Geocoding に回して、海外の地名を探すようにしました。

ひらがなの「さっぽろ」は、国土地理院でも先頭が「さっぽろ湖」で、札幌市は上位に出ません。並べ替えのルールが漢字の市区町村名を前提にしているためです。ここはまだ直していません。

地名検索APIを試すときは主要都市をまとめて投げる

今回いちばんの反省は、「渋谷」1語で動作確認を済ませたことです。地名検索は、語によって結果が大きく変わります。

確認するときは、次のような語をまとめて投げると問題がすぐ見えます。

APIの説明を読むより、10語ほど並べて結果の表を作るほうが早く判断できました。