愛車:マツダアテンザ
Webを中心とした、ビジネス&テクノロジーに関する思いつき
by F-shin
[ このサイトについて ] [ F-shinについて ] [ トップ ]
iPhoneアプリ
author:えふしん
photo_20.jpg
藤川真一について


初代モバツイ開発者
想創社再創業 / KMD博士課程
著書〜100万人から教わったウェブサービスの極意―「モバツイ」開発1268日の知恵と視点 [Kindle版]
お求めやすい夏休み特価!
AMN sponsor rolls
このカテゴリ[Web系]の最新30件
本ブログは移転しました インターネットの遊び方を身につけよう ネットでの選挙活動と投票率 Web2.0がうまくいかなかったワケ WebにおけるMVCアーキテクチャの勃興と変遷 何故、PCはブラウザ、スマホはアプリなのか。 言っとくけどスマホは退化でもあるからな。 アイコン5000円とか、Web受注(発注)価格について。 残念なWeb論の骨子 HTMLってホントよく出来てるな。 「やまもといちろう×イケダハヤト対談イベント」のログを読んで ネットサービスの成功者は「とりあえず受託」という言葉使うのやめません? 全収集型RSSリーダーの終焉とソーシャル化するWeb 頑張ると報われるプログラマーの社会とは。 Perlが○○な話 アメリカ製品のすごさと不思議とワイヤフレーム どの人件費を考えても絶対にお得!利用規約ナイトがきっかけの本が出ます。 クラウドやモバイルを、もっと仕事で活用したいけど、どうやって会社を説得したら良いかわからない! スマホアプリらしいUXとは。 インターネットの変化に対して起こるモヤモヤすることを考え、整理する活動 Facebookは見なくてもいい情報が出てくるSNS 「あなたは影響力があるから、そんなことを言っちゃいけません」の問題点 Facebookに時間を取られすぎる対策 Paypalの本人確認がむかつく件 ネット系イベントがとても主催しやすくなった件 モバイルファーストが失敗なハズはないが、今はまだ時期尚早 やりがいはソートできない…非情なデータベース社会 2012年までのふりかえりと2013年へ ブラウザという平面の限界 ブログ記事の流通の難しさ
[このカテゴリをもっと見る]
Powered by
Movable Type

November 12, 2008

スポンサーリンク

携帯GPSの緯度、経度情報から「文字の住所」を引くのが逆ジオコーディング(リバースジオコーディング)

Google Maps apiに新たに追加された逆ジオコーディングは、モバツイッターのイマココにとっては待ってました!的なサービスで、公開されたことを聞きつけたその日に組み込んだのですが、どうも取れない住所があるとのことで、多くの人の力を借りてテストしているので、ここに公開しておきます。


まずこんな感じのURLに、latとlonに緯度と経度をそれぞれ渡してGoogleに問い合わせる。



http://maps.google.com/maps/geo?output=xml&oe=utf-8&ll=${lat}%2C${lon}&key=${apikey}


すると、まぁ普通は、こんな感じのレスポンスが返ってくるわけですよ。




<kml xmlns="http://earth.google.com/kml/2.0"><Response>
<name>xx.xxxxx,xxxx.xxxxxx</name>
<Status>
<code>200</code>
<request>geocode</request>
</Status>

<Placemark id="p1">
<address>Japan東京都渋谷区宇田川町40?5</address>
<AddressDetails Accuracy="8" xmlns="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0">
<Country>
<CountryNameCode>JP</CountryNameCode>
<CountryName>Japan</CountryName>
<AdministrativeArea>
<AdministrativeAreaName>東京都</AdministrativeAreaName>
<Locality><LocalityName>渋谷区</LocalityName>
<DependentLocality>
<DependentLocalityName>宇田川町</DependentLocalityName>
</DependentLocality>
</Locality>

</AdministrativeArea></Country>
</AddressDetails>
<Point><coordinates>xx.xxx.,xxxxxx</coordinates>
</Point>
</Placemark>
<Placemark id="p2">
<address>Japanジーンズメイト・渋谷東急ハンズ前店</address>
<AddressDetails Accuracy="9" xmlns="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0">
<Country>
<CountryNameCode>JP</CountryNameCode>
<CountryName>Japan</CountryName>
</Country>
</AddressDetails>
<Point>
<coordinates>xxxx,xxx,xxxx</coordinates>
</Point>
</Placemark>




故にこんな感じの関数でさくっと住所を取ってました。



require_once "HTTP/Request.php";
$api_url ="http://maps.google.com/maps/geo?output=xml&oe=utf-8&ll=${lat}%2C${lon}&key=${apikey}";

$req =& new HTTP_Request($api_url);
if (!PEAR::isError($req->sendRequest())) {
$ret = $req->getResponseBody();
}else{
return false;
}

if (isset($ret)){
try{
$areas = new SimpleXMLElement($ret);
}catch(Exception $e){}
}

if (!isset($areas) || !$areas || $areas->Error){
return false;
}

if (isset($areas->Response->Placemark->AddressDetails->Country->AdministrativeArea->AdministrativeAreaName)){
$pref = strval($areas->Response->Placemark->AddressDetails->Country->AdministrativeArea->AdministrativeAreaName);
}else{
$pref = '';
}

if (isset($areas->Response->Placemark->AddressDetails->Country->AdministrativeArea->Locality->LocalityName)){
$city = strval($areas->Response->Placemark->AddressDetails->Country->AdministrativeArea->Locality->LocalityName);
}else{
$city = '';
}

if (isset($areas->Response->Placemark->AddressDetails->Country->AdministrativeArea->Locality->DependentLocality->DependentLocalityName)){

$town = strval($areas->Response->Placemark->AddressDetails->Country->AdministrativeArea->Locality->DependentLocality->DependentLocalityName);
}else{
$town = '';
}
if (isset($areas->Response->Placemark->AddressDetails->Country->AdministrativeArea->Locality->Thoroughfare->ThoroughfareName)){
$town = strval($areas->Response->Placemark->AddressDetails->Country->AdministrativeArea->Locality->Thoroughfare->ThoroughfareName);
}else{
$town = '';
}

if (isset($areas->Response->Placemark->AddressDetails->Country->AdministrativeArea->Locality->DependentLocality->Thoroughfare->ThoroughfareName)){
$number = strval($areas->Response->Placemark->AddressDetails->Country->AdministrativeArea->Locality->DependentLocality->Thoroughfare->ThoroughfareName);
}else{
$number = '';
}

$loc_data = array(
'lat'=>$lat,
'lon'=>$lon,
'pref'=>$pref ,
'city'=>$city,
'town'=>$town,
'number'=>$number);

return $loc_data;

そしたらうまく表示されない場所があるとのこと。

そのためモバツイユーザーの方にご協力を仰いで、うまくいかない情報を教えてもらって、どんな情報が返ってきてるのか調べてみました。

まず、ダメなのはこんな感じ。

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.0">
<Response>
<name>xxxx.xxxxx,xxx.xxxx</name>
<Status>
<code>200</code>
<request>geocode</request>
</Status>
<Placemark id="p1">
<address>Japan阪神高速13号東大阪線</address>
<AddressDetails Accuracy="6" xmlns="urn:oasis:names:tc:ciqxsdschema:xAL:2.0">
<Country>
<CountryNameCode>JP</CountryNameCode>
<CountryName>Japan</CountryName>
<AddressLine>阪神高速13号東大阪線</AddressLine>
</Country>
</AddressDetails>
<ExtendedData>
<LatLonBox xmlns="http://maps.google.com/geo?output=kml">
<north>xx.xxxx</north>
<south>xx.xxxx</south>
<east>xx.xxxx</east>
<west>xx.xxxx</west>
</LatLonBox>
</ExtendedData>
<Point>
<coordinates>xx.xxxx</coordinates>
</Point>
</Placemark>
</Response>
</kml>

は、阪神高速・・・・。

高速道路が捕捉されてしまうと、道路が優先されるらしい。

更に、最悪のケースだと、

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.0">
<Response>
<name>xxxx,xxxxx</name>
<Status>
<code>200</code>
<request>geocode</request>
</Status>
<Placemark id="p1">
<address>Japan東北自動車道</address>
<AddressDetails 
Accuracy="6" xmlns="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0">
<Country>
<CountryNameCode>JP</CountryNameCode>
<CountryName>Japan</CountryName>
<AddressLine>東北自動車道</AddressLine>
</Country>
</AddressDetails>
<Point>
<coordinates>xxxx,xxxx,0</coordinates>
</Point>
</Placemark>
</Response>
</kml>

東北自動車道ってどんな長さだよ。

高速道路が取れるのはそれはそれで嬉しいケースもあるでしょうが、できれば住所の付属情報に高速道路をぶら下げて欲しいところだし、何よりイマココでは嬉しくないので、結局、こういう情報が返ってきた場合は、他のサービスに取りに行かざるを得ない状況です。

(あんたはカーナビかいな。首都高の下にある道走ってたら高速乗っちゃってるーみたいな)

逆ジオコーディングは、以前は主に個人の方がご提供されていて、モバツイッターでもinvcoderというサービスを使わせていただいていたのですが、ある時期から連続で500エラーが出まくりになって、うわーこりゃ、どこかのサービスが負荷かけまくってるんだろうなぁとか思ってたのですが、残念ながらGoogleがダメだったら、invcoderに問い合わせて、それがダメなら、シリウスラボさんの逆ジオコーディングサービスに問い合わせに行くみたいな状態に戻っちゃいました。

一番近いの緯度経度情報を抽出するロジックのコードさえあれば自分で作るんですが。。(数式見たけど、難しくて意味がわからん)


ということで、低コストに利用可能な逆ジオコーディングの決定版もない状態、なのかな?!


##ていうかドキュメントも読まずに組み込んだので実はそうならないための引数とかあったらごめんなさい。

【PR】BASE エンジニア、デザイナー、経理!一緒に仲間になってくれる人を探してます!
スポンサーリンク
■同じカテゴリ[Web系]のエントリー
<<前の記事 ロリポップ 7周年でファミコン(本物)プレゼントキャンペーン!
>>次の記事 Twitterが生き残るために、を読んだ
■このblogの書き込み最新3件
本ブログは移転しました インターネットの遊び方を身につけよう トトロが陽なら、『風立ちぬ』は陰?〜『風立ちぬ』の感想
この記事への提案、提言一覧

使いづらいには変わりないというオチですが、複数情報がとれるようですねー

検証されている方の日記がありました。

GoogleMapsAPI の逆ジオコーダー機能 ~続編~|創業日記
http://fairyware.jp/weblog/2008/11/googlemapsapi_2.html

2008/11/14 22:59 つー
この記事への提案、提言









あなたの情報を保存しますか?