Community Geocoderで実在の住所が「不明」になる問題

フォームの住所入力で実在しない住所を入れたら「不明」ですとエラーが出るアプリケーションを作っていたときの問題。

Community Geocoderを使い入力した住所が実在するかどうか判断していたのですが実在する住所を入れても「不明」ですとエラーが出て困っていました。

Community Geocoderの中どうなってる?

以前以下の記事で「Community Geocoder」の使い方を書きました。

Geocording APIを使わなくても無料で住所から緯度経度が取得出来る
2点間の距離・時間・ルートなどを計算するにはその地点の緯度経度が必要です。 googleのAPIで取得する事が出来ます。 「Geocording API」がそれなのですが有料です。利用回数によって課金されます。 アクセスが膨大...

getLatLng()関数を使います。参考コード

getLatLng(destination, (latlng) => {
 console.log(JSON.stringify(latlng))
 result = latlng.lat+' / '+latlng.lng

 //latlng.lat、latlng.lngがnullだったらreturnする。(不明な住所だとnullになる。
 if(latlng.lat == null || latlng.lng == null){
   alert('不明な住所です、やり直してください。')
   return false
}

コールバック関数の中で得られるlatlngの中身です。
「兵庫県神戸市北区有馬町」と入れた場合

{
"pref":"兵庫県",
"city":"神戸市北区",
"town":"有馬町",
"addr":"",
"lat":34.789225,
"lng":135.255196,
"level":3
}

緯度経度が取得出来ています。
pref”:”兵庫県”,
“city”:”神戸市北区”,
“town”:”有馬町”
三つ階層が特定出来ていて”level”:3となっています。

 

しかし「兵庫県神戸市北区有馬」と実在しない住所入れた場合

{
"pref":"兵庫県",
"city":"神戸市北区",
"town":"",
"addr":"有馬",
"lat":null,
"lng":null,
"level":2
}

pref”:”兵庫県”,
“city”:”神戸市北区”,
“town”:””
“addr”:”有馬”,

townが取れていなくて番地に相当するaddrに”有馬”が入ってしまっています。
特定出来ている階層は2つなので”level”:2となっています。

“level”:2だと緯度経度はnullになるみたいです。

こんな感じで不明な住所を判断させていました。

特殊な住所がある

偶然見つけたのですが、実在する住所なのにいくらやっても不明になる住所がありました。

「兵庫県伊丹市昆陽池3-1」
これです。

入力フォームで市区町村「伊丹市昆陽池」を入れたタイミングで処理を発動させて「兵庫県伊丹市昆陽池」を対象に判断させると常に「不明」になっていました。

コールバック関数の中で得られるlatlngの中身を見ると

pref”:”兵庫県”,
“city”:”伊丹市”,
“town”:””,
“addr”:”昆陽池”,
“lat”:null,
“lng”:null,
“level”:2

市区町村までの入力だとtownが空でaddrに昆陽池が入っています。結果特定出来たのは2階層(level2)までなので緯度lat 経度lngは取れません。

期待するのは
pref”:”兵庫県”,
“city”:”伊丹市”,
“town”:”昆陽池”,
なのですがtownが空になります。

この問題の原因は?

「入力フォームで市区町村「伊丹市昆陽池」を入れたタイミングで処理を発動」
一旦これをoffにして
「入力フォームで番地「3-1」を入れたタイミングで処理を発動」
つまり対象が「兵庫県伊丹市昆陽池3-1」住所全部です。

その時のlatlngの中身を見ると

“pref”:”兵庫県”,
“city”:”伊丹市”,
“town”:”昆陽池三丁目”,
“addr”:”1″,
“lat”:34.789017,
“lng”:135.393924,
“level”:3

注目はtownです。”昆陽池三丁目”となっています。階層3つ(level3)まで特定出来ているので緯度経度は取れています。

番地である「3-1」が分解されて「三丁目」となりさらに「昆陽池」と連結して「昆陽池三丁目」になる。
そしてその「昆陽池三丁目」がtownに入る。番地には残りの「1」が入る。
こんな結果になりました。

推測ですが兵庫県伊丹市昆陽池は市区町村(town)に「三丁目」部分まで含んで登録されているみたいですね。
市区町村(town)は「昆陽池」では不明で
「昆陽池三丁目」までが必要という事です。

これ偶然見つけたのですが他にあるみたいです。

東京都目黒区下目黒
東京都目黒区中目黒
東京都目黒区上目黒

これ全部nullになり緯度経度取れません。

東京都目黒区下目黒3
これでもだめで、
東京都目黒区下目黒3-
ここまで入れと緯度経度が取れます。

なんか例外ではなく普通にある現象だという事のようです。

この事を踏まえてアプリケーションのロジックを作っていかなくちゃダメですね。