今年、年明けに思い立って、Yahooカテゴリ用に作成した1月1日サイト。

ヤフカテならずで今年のMA6にも応募した。

そのとき、自分のアイディアにプラスしてこうしたらいいんじゃん?っていうアドバイスをいただき、地図から世界各地の日の出を算出するプログラムを作成。

しかし、ネットママ友から

「送信ボタンを押すと、ページがリロードする」

「送信ボタンを押すと、マーカーがもとの戻っていて、自分で選んだ地点がデータに入ってるのか不安」

という厳しいお言葉を頂いた。。。

 

そして年末、またとあるコンテストに応募&ヤフカテ再々挑戦ということで、今日、1日かけて各所を修正・・・

その際、必要になってくるのが、経度緯度から住所を算出する逆ジオコーディング。

日本だけのものならFind.jpとか、使いやすいものがいくつかあったのだが、こちらは世界が対象なので・・・

仕方なく、google mapsの逆ジオコーディングと格闘するハメに・・・

マニュアルはこちらにあるのだが、情報が少ない。

なんといってもレスポンスの部分が。。。

サンプルで

http://maps.google.com/maps/api/geocode/xml?latlng=40.714224,-73.961452&sensor=true

を表示させると、

OK street_address 279-281 ベッドフォード・アベニュー, ブルックリン, ニューヨーク 11211, アメリカ合衆国 279-281 279-281 street_number ベッドフォード・アベニュー ベッドフォード・アベニュー route ブルックリン ブルックリン sublocality political ニューヨーク ニューヨーク locality political ブルックリン ブルックリン administrative_area_level_2 political ニューヨーク NY administrative_area_level_1 political アメリカ合衆国 US country political 11211 11211 postal_code 40.7142215 -73.9614454 RANGE_INTERPOLATED 40.7110552 -73.9646313 40.7173505 -73.9583361 40.7139010 -73.9616800 40.7145047 -73.9612874 neighborhood political ウィリアムズバーグ, ニューヨーク, アメリカ合衆国 ウィリアムズバーグ ウィリアムズバーグ neighborhood political ニューヨーク ニューヨーク locality political ブルックリン ブルックリン administrative_area_level_2 political ニューヨーク NY administrative_area_level_1 political アメリカ合衆国 US country political 40.7064461 -73.9536163 APPROXIMATE 40.6979330 -73.9698451 40.7182050 -73.9202810 40.6979330 -73.9698451 40.7182050 -73.9202810 postal_code ニューヨーク, 11211, アメリカ合衆国 11211 11211 postal_code ブルックリン ブルックリン sublocality political ニューヨーク ニューヨーク locality political ニューヨーク NY administrative_area_level_1 political アメリカ合衆国 US country political 40.7118873 -73.9582633 APPROXIMATE 40.6976359 -73.9761669 40.7261370 -73.9230429 40.6976359 -73.9761669 40.7261370 -73.9230429 sublocality political ブルックリン, ニューヨーク, アメリカ合衆国 ブルックリン ブルックリン sublocality political ニューヨーク ニューヨーク locality political ブルックリン ブルックリン administrative_area_level_2 political ニューヨーク NY administrative_area_level_1 political アメリカ合衆国 US country political 40.6500000 -73.9500000 APPROXIMATE 40.5510419 -74.0566300 40.7394460 -73.8333650 40.5510419 -74.0566300 40.7394460 -73.8333650 administrative_area_level_2 political ブルックリン, ニューヨーク, アメリカ合衆国 ブルックリン ブルックリン administrative_area_level_2 political ニューヨーク NY administrative_area_level_1 political アメリカ合衆国 US country political 40.6528762 -73.9594940 APPROXIMATE 40.5510419 -74.0566300 40.7394460 -73.8333650 40.5510419 -74.0566300 40.7394460 -73.8333650 locality political ニューヨーク, アメリカ合衆国 ニューヨーク ニューヨーク locality political ニューヨーク ニューヨーク administrative_area_level_2 political ニューヨーク NY administrative_area_level_1 political アメリカ合衆国 US country political 40.7143528 -74.0059731 APPROXIMATE 40.4773990 -74.2590900 40.9175770 -73.7002720 40.4773990 -74.2590900 40.9175770 -73.7002720 administrative_area_level_1 political ニューヨーク, アメリカ合衆国 ニューヨーク NY administrative_area_level_1 political アメリカ合衆国 US country political 43.2994285 -74.2179326 APPROXIMATE 40.4773990 -79.7625900 45.0158650 -71.7774910 40.4773990 -79.7625900 45.0158650 -71.7774910 country political アメリカ合衆国 アメリカ合衆国 US country political 37.0902400 -95.7128910 APPROXIMATE 18.7763000 170.5957000 71.5388000 -66.8850749 18.7763000 170.5957000 71.5388000 -66.8850749

 

と表示されて、階層が全くわからない・・・

困った・・・

サンプルのjsonとかほかのページを参照にしながら、なんとか

$data=$xml->result

$data->formatted_addressで住所が表示されるようになった!

 

ワーーイ!

と喜ぶのもつかの間、日本の緯度経度だと、これだけのレスポンスだと

住所がさっきのアメリカのサンプルのように、ずらーーと出てきてしまう状況に・・・

しばらく格闘して、やっとtypeを取得、typeを指定して一番最初の住所を取り出してみたら、なんと、国ごとにタイプの設定が違うようで、タイプを設定したらほかの国はやはり表示されない状況に・・・・

考えた挙句、最初の1要素だけ取り出せば良いことに気づき、その最初のひとつの要素を取り出すコードを四苦八苦して解明、やっとのぞみの表示が出来上がった。

$url="http://maps.google.com/maps/api/geocode/xml?latlng=$lat,$lng&sensor=true";

$xml=simplexml_load_file ($url);
 
$datas=$xml->result;
foreach($datas as $data){
$i=1;
if ($i==1){
echo '選択された地点は'.h($data->formatted_address).'です。';
break;
}
}

(jsonは公式ページにあるようにresults,typesのようですが、xmlはsがいらないようです。)

ふうーー死ぬかと思ったぜよ・・・

しかしグローバル関数(?つーのかな?)の$i=1;とか自分ではじめて考えて使ってみた。そしてできたので、今度別なのに使ってみたい。

次なる目標は、一度選んだマーカーの位置を、フォーム送信後も維持すること。

これは・・・来年かな・・・爆

今日は、こちらの本を何度かひらいてプログラムを組みました。初心者に必要な情報も豊富で使いやすいです!

楽天市場:PHP逆引きレシピ

セブンネットショッピング:PHP逆引きレシピ すぐに美味しいサンプル&テクニック261