あいまいな店名で地図を引くと、日本の真ん中の静岡が返る:チェーン名を並べず、Google 自身の答えで判定した
トレカダッシュ 開発の記録 / 2026年8月
iOS アプリ「トレカダッシュ」には、店の位置を地図に出して、近い順に並べる機能があります。「位置情報が、静岡になる」という報告が来ました。店の位置は、店の名前を Google の地図の検索(Places API)に渡して、座標を取っています。
原因は、あいまいな店名で問い合わせると、Google が、日本全体の真ん中(静岡と愛知)を返すことでした。この記事は、その実測と、「チェーン名を並べない」直し方の記録です。
この記事は、2026 年 8 月 25 日の作業の記録から書いています。
実測:あいまいな名前の答えは、静岡と愛知
検索には、「日本全体の矩形」を、位置の手がかり(locationbias)として渡しています。名前があいまいで、決め手が無いと、Google は、その矩形の真ん中を返します。それが、静岡と愛知です。API で実測しました。
| 問い合わせた名前 | Google の答え |
|---|---|
| ヤマダデンキ | ヤマダデンキ テックランド浜松本店(静岡県) |
| サンエー | ㈱サンエー化研 掛川工場(静岡県) |
| ホビーステーション | トレカステーション豊橋店(愛知県) |
| ブックオフ | BOOKOFF 掛川店(静岡県) |
| 晴れる屋 | 晴れる屋 静岡店(静岡県) |
| おむすび | お米とおむすび むらせ 浜松広沢店(静岡県) |
「サンエー」は、小売のチェーンのことでしたが、答えは、同じ名前の、別の会社の工場でした。
直し方:チェーン名を並べず、Google 自身の答えで判定する
「あいまいなチェーン名の一覧」を作る方式は、採りませんでした。新しいチェーンが増えるたびに、再発します。代わりに、Google が返した答え自身で、信用できるかを判定する関数(geocodeMatchIsTrustworthy)を作りました。
- 問い合わせた名前が、返ってきた店名の頭でしかなく、残りが支店名なら、不採用。(ヤマダデンキ → …テックランド浜松本店)「店」が付いただけなら、同じ店。
- 店名に、支店の手がかり(〇〇店、館、モール…)があれば、従来どおり採用。
- 返ってきた店名が、問い合わせた名前と同じ、または、その一部なら採用。(カードショップクラクラ、ゲームショップ プラスアルファ)逆向きは採用しない。(サンエー ⊂ ㈱サンエー化研は、別の会社。)
- それ以外は、店名と住所が 2 文字以上重なっているかで判定。(池袋、戸塚、札幌、高田馬場などを名前に持つ店は、ここで通る。)
実データの 25 パターンで確かめると、誤り 9 件は全部不採用、正しい 16 件は全部採用でした。取りこぼしは、ローマ字表記の 1 件だけでした。
すでに、間違った位置が焼き付いていた記事 30 件と、店の位置のキャッシュ 22 件は、消して、解決し直しました。キャッシュを消すと、1 店につき 1 回だけ、API を呼び直します。
同じ日に見つけた、似た話:通知の店名が「ライヴポケット」
「通知の店名が、ライヴポケットになる」という報告もありました。店名が取れなかったときに、最後の受け皿として、カテゴリ(「ライヴポケット」)が通知に出ていました。ライヴポケットは、応募を受け付ける場であって、店ではありません。そこで、分からないときは、null を返すようにしました。呼び出し側は、店名が無ければ記事の題名を使います。ライヴポケットの題名は、「キデイランド ららぽーと富士見店 …」のように、店名から始まるので、そのほうが正しく伝わります。
分かったこと
外部の答えは、答え自身で、信用できるかを確かめる。
- 決め手が無いとき、外部サービスは「もっともらしい答え」を返す。日本の真ん中、静岡と愛知です。
- チェーン名の一覧を作らない。新しいチェーンが増えるたびに、再発します。
- 逆向きの包含は採用しない。サンエーは、サンエー化研の一部ではありません。
- 焼き付いた値は、消して解決し直す。キャッシュも一緒に。
- 分からないときは、null。間違った名前より、名前なしのほうが、まし。
この話に出てくるもの
- トレカダッシュ — トレカの抽選・予約・先着の情報を集める iPhone アプリ
- 「同じ応募ページ」なら「同じ店」と決めつけていた — 店名と位置の別の問題
- 英語表記とカタカナ表記は、1 文字も重ならない — 関門と判定の別の話
- 自分で作った仕組みが、自分を傷つけた 4 つの記録 — 自分の変更の失敗
ほかの記録
- 「1 ページ = 1 案件」ではなかった:1 つのフォームで 6 商品を受け付ける店の記事が、リンクが同じというだけで消されていた — リンクだけで重複と決めるジョブが、1 つの Google フォームで 6 商品を受け付ける店の記事 5 件を消していた。「リンク + 商品」に直した。サーバが作った「応募枠」をアプリが一度も読んでいなかったことも見つかった。
- 英語表記とカタカナ表記は、1 文字も重ならない:正しい照合 42 件を、指紋の関門が却下していた — 相場の紐付け率が 39% に低下。相場のサイトに商品はあったが、自社の英語表記とカタカナ表記では指紋が一致せず、26 時間で 42 件が却下されていた。関門は弱めず、この照合だけに狭い 2 つ目の判定を足した。
- タイムアウトを 3 回直しても止まらなかった:真犯人は、同じ鍵の中で動いていた 2 つ目の処理だった — 楽天ブックスの在庫チェックが 1 日 17 回タイムアウトした。取得の上限、1 件ぶんの上限と 2 回直しても止まらず、3 回目で、同じ鍵の中の別の処理(全件を取り直し、上限なし)が真犯人と分かった。
コメント
感想や、記事の間違いの指摘は、ここへ。書くには、GitHub のアカウントが要ります。
押すと、giscus(giscus.app)と GitHub に接続します。押さなければ、接続しません。詳しくはあつかいに書いています。