« あちこちふらりフォトリンクとPHP | トップページ | KMLEditorのバグ修正 0.0.0.6 »

2008.04.13

flickrAPIとKMLとPHP

前回のエントリーで、PHPを使って「あちこちふらりフォトリンク」を作成することにしたという記事を書きました。
flickrでもkmzを提供してくれていますが、バルーンにオリジナルデザインを付けたい、また、 PHPのテストおよび圧倒的な省力化が目的でした。まず考えたのはKMLを作成するPHPをネットワークリンクで表示させること。
ということで最初に作ってみたフォトリンクは以下です。(撮影場所は後述の理由によりあとから入れました。)

あちこちふらりLフォト版(写真表示があちこちふらりフォトリンクよりかなり大きいです)

このフォトリンクはPHPでflickrの「Google Earth」セットに含まれる写真をダイレクトに処理してKMLを作っています。
リクエストをこんな感じでおくり、PHP5のSimpleXML関数で処理してみました。
(はみ出してしまうので途中で改行しています。)

$xml = simplexml_load_file('http://api.flickr.com/services/rest
/?method=flickr.photosets.getPhotos&api_key={key}
&photoset_id={photoset_id}&extras=geo,date_taken,tags');

{key}と{photoset_id}にはそれぞれのものを入れます。
flickr.photosets.getPhotosメソッドで緯度経度や写真の撮影日、タグの内容も追加して取得するためにextras=geo,date_taken,tagsを最後に付け加えてリクエストを送ってます。
flickr.photosets.getPhotosメソッドのリファレンスではextrasにgeoやtagsの表記がないのですが、実際やってみると、ちゃんとそれぞれの情報が帰ってきました。ラッキー。だめならflickr.photos.searchメソッドを使うしかないですが、これでは私がflickrにアップした写真の全てが対象となってしまうので、多すぎる。

で、帰ってきたXMLを次の例のように変数に置き換えて文字列内に挿入し、、foreachで次々とkmlの文字列を作成しています。

foreach($xml->photoset->photo as $photo){
$id = $photo["id"];
$title = $photo["title"];
$lat = $photo["latitude"];
$lon = $photo["longitude"];

このフォトリンクなら、flickrに一度リクエストを送るだけですむので我が家の環境では5秒以内くらいに表示されます。当初の目的のflickrに位置情報をつけた写真をアップロードするだけの手間いらず、後はPHPにお任せ!を果たせます。

しかし・・従前のあちこちふらりフォトリンクにはちゃんと説明が入れてありました。中には何にも書いてないのもあるけれど・・。常識的に考えれば、私の文章にいくらの価値も無いので正直なところ上のリンクでいいじゃん!という感じなのですが、flickrには説明を書き加えることができる、なのにそれを引っ張って来れない。以前のネットワークリンクよりスペックダウンする。というのが悔しいじゃないですか。

ということでやってみました。
大変なことでした。説明を引っ張ってくるには、flickr.photosets.getPhotosメソッドで取得したそれぞれの写真のidを元に、一枚一枚flickr.photos.getInfoのリクエストを送って、各写真の詳細情報を取得しなきゃいかんというわけなんですね。現在、180枚近くの写真がGoogle Earthセットにアップロードしてありますのでこの枚数プラス最初の1回のリクエストをflickrに送らなきゃいけないと。

この時点で最初の挫折です。直接ネットワークリンクにするのは不可能なほど表示までにまたされます。3分くらいはかかる?
作戦変更というわけで、PHPでネットワークリンク用のKMLを書き出さしてファイルとして保存させるようにしてみました。このファイルにネットワークリンクでリンクさせれば表示にかかる時間は問題なくなります。アップロードしたら書き換えれば良い話。
もともとのあちこちふらりフォトリンクとほぼ同じ構成にできるように、region locality も取得して、東京23区、東京市部、その他の県にフォルダ分けもPHPで行います。
最初のフォトリンクは、直接KMLを文字列で書き出していましたが、フォルダ分けしたいので、テンプレートとして3つの必要なフォルダ(なかは空)だけのKMLファイルを作成して、PHPでそれを読み込み、regionやlocalityの値によって振り分けてフォルダ内に要素を追加していきました。
$placemark=$kml->Document->Folder[0]->addChild('Placemark');
$placemark->addChild('name',$title);
こんな感じで必要なKMLのタグを追加していきます。

で、ようやくクリック一つでflickrのGoogle Earthセットの写真を全てKMLとしてファイル保存に成功です。
さて、実際に動かすネット上のレンタルサーバに移して実験。ん?エラー??!何度か試すけれど、ファイルが作成できません。500なんちゃらエラーです。
しかし全然動いていないというわけでもなさそうなので、一枚一枚の写真の処理のループごとにブラウザに数字を書き出させるとおおむね5割くらい行ったところですっと終わってしまいます。何度か試した後、ふと、止まるまでの時間を計るときっちり60秒。結局niftyのlacoocanはCGIの実行時間は60秒に制限していますだってさ。php.iniなどは触らせてくれないようです。
ここで第2の挫折。

ふたたび、作業場所はローカル環境に戻り、結局ローカルサーバでKMLを作成してアップロードすることにしました。いきなりファイルを書き換えてしまっても、エラーが起こればファイルが真っ白になったりすると困るから、これはこれで良いか。クリックしてアップロードするだけだわ・・・。

さて、できたネットワークリンクをにんまりして眺めていたら、妙なことに気がつきました。富士見ケ丘のグランド、杉並区なんですけど、なぜか東京市部のフォルダに???東京市部に分けられている高源院も世田谷区北烏山なんですけど・・・。Google Earth上ではまともな位置に表示されています。おかしいと思ってflickrの写真ページを見たら、なんと全部「Mitakashi, Tokyo Prefecture」と表示されてました。境界に近いと駄目なのか(しかし富士見ケ丘のグランドは三鷹市ではなく世田谷区との境目)と思いきや、環八の高井戸のところまで「Mitaka-shi」になっている!縦線入ったちびまる子の心境です。
フォルダ名を都心部、周辺部にでも分けようかとも思ったんですが、これまた悔しいじゃないですか。結局力技でタグにbasyo1東京都世田谷区、とか無理やり全部入れました。それを元にフォルダわけするようにしました。もし場所のタグを入れ忘れたときは三鷹市大好きなflickrさんの分け方に従うようになってます。

ということで、もっとも大きな挫折は余分な仕事を一つ増やしてくれた最後の部分ですが、それでも、flickrにアップロードさえすればとりあえずKMLが作れるということで今は満足です。

追記:このエントリー、超長い・・

|

« あちこちふらりフォトリンクとPHP | トップページ | KMLEditorのバグ修正 0.0.0.6 »

Google Earth TIPS」カテゴリの記事

コメント

興味深く記事を読ませていただきました。
記事から、lacoocanをお使いと思います。一つ教えて頂けないかと思い、書き込ませていただきました。
私は自前のサーバからlacoocanに引っ越しましたが、自前のサーバでは表示できたkmlファイルがlacoocanではテキストとして表示されてしまいます。自前のサーバではgoogleEarthをインストールしてあったため、kmlファイルを処理できたのかと思います。
lacoocanではgoogleEathのインストールに相当するような処理は、どのようにすればよいのか教えていただけないでしょうか。
よろしくお願いいたします。

投稿: 古宿 | 2009.01.15 06:45

こんにちは。古宿さん。

おっしゃるとおり、サーバはLacoocanを利用しています。
kmlファイルをGoogle Earthに関連付けるために、私は「.htaccess」のファイルに
AddType application/vnd.google-earth.kml+xml .kml
AddType application/vnd.google-earth.kmz .kmz
と書き込んでLacoocanの「homepage」フォルダのルートにおいています。
これでkml,kmzファイルはクリックするとGoogle Earthで開けるようになると思います。
ファイル名が拡張子のみで妙ですが、ドットを忘れないようにつけてください。
関連付けることができるのでよいのであれば、サーバにGoogle Earthをインストールする必要はないと思いますので、上記をお試しください。

投稿: Bugsから古宿さんへ | 2009.01.15 17:04

早速お答えをいただき、どうも有難うございました。うまくいきました。また、大変勉強にもなりました。
また、色々教えていただかねばならないことが発生するかもしれません。今後ともよろしくお願いいたします。
どうもありがとうございました。

投稿: 古宿 | 2009.01.16 12:41

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/170323/40869500

この記事へのトラックバック一覧です: flickrAPIとKMLとPHP:

« あちこちふらりフォトリンクとPHP | トップページ | KMLEditorのバグ修正 0.0.0.6 »