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


モバツイの中の人
人の良いジョンカビラと言われます。ソフト哲学者を目指します。
AMN sponsor rolls
ツイッターやるなら
for iPhone App
Google Friend Connect
このカテゴリ[Web系]の最新30件
そろそろモバツイがEC2に移転した話でも書くとするか。 とりあえずやってみて、ダメならすぐ手を変える体制重要 メールって盗聴されますか? 「正しい反論を得る」ことは重要なネットリテラシーの一つ 人は同じことを繰り返す。けど、残念なのかよくわからない。 楽天アフィリエイトが儲かる理由 「ブレイクするっていうのはバカに見つかるってこと」はプルメディアであるネットで成り立つのか。 RT:日本のネットが「残念」なのは、ハイブロウな人たちの頑張りが足りないから RSSと引越しとパーマリンク ツイッターは一期一会の精神で楽しむ なんだこの楽天叩き。 記事未満〜エンジニアの未来サミットとか。 ネット世論を殺すのは簡単。 Web身の回り告知系 個別アーカイブの記事に記事の文字数、行数表示をつけた。 DH時代のFlashがインデックスされてるのを見つけた。 それドロップシッピングを語る業者に騙された、だけでしょ? はてブの関連エントリーはスゴイ。 ニコニコ動画がiPhoneアプリで登場! Doblogサービスが終わりだそうで。 Web2.0は死んだとか言うbuzzwordに影響されてる開発者は、自分の開発手法が当たり前のようにWeb2.0化していることに気がつくべき。 オレ様最適で炎上対象になると、全体最適の的外れレスがつきやすい モバツイでのDonation体験談 イケてないモバイル広告 経営者にとってのサーバサイド技術選び はてブがMac OperaでBad Requestになる件について 言論の質、blogの質 XMLが描いた世界は実現するのか。 年収とイキイキ評価とのギャップ 日本人にとってのTweetってはてブじゃないのかなぁ。
[このカテゴリをもっと見る]
F's Garage関連
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に問い合わせて、それがダメなら、シリウスラボさんの逆ジオコーディングサービスに問い合わせに行くみたいな状態に戻っちゃいました。

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


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


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

■同じカテゴリ[Web系]のエントリー
<<前の記事 ロリポップ 7周年でファミコン(本物)プレゼントキャンペーン!
>>次の記事 Twitterが生き残るために、を読んだ
■このblogの書き込み最新3件
そろそろモバツイがEC2に移転した話でも書くとするか。 とりあえずやってみて、ダメならすぐ手を変える体制重要 メールって盗聴されますか?
この記事への提案、提言一覧

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

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

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

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









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