それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

iPhoto で写真を扱う - GPS情報を取り出す

iPhoto から写真を取り出して、GPS情報を抜き出します。

var app = Application("iPhoto")
var albums = app.albums //全アルバム取得

iPhotoの構成は

iPhoto Application -> Album -> Photo

のようになっています。

写真を一枚取り出し、情報を取得します。

まず、写真を一枚取り出します。

var app = Application("iPhoto")
var albums = app.albums //全アルバム取得
var photo = albums[0].photos[0]

写真の情報を色々取ってみます。

  photo.name()  //=> "IMG_0041"
  photo.originalPath() //=> "/Users/(略)/IMG_0041.JPG"
  photo.height() //=> 2448
  photo.width() //=> 3264
  photo.latitude()  //=> 34.xxxx8329999994
  photo.longitude() //=> 13x.xxxx3000000002
  photo.altitude()  //=> 24
  photo.date()      //=> Wed Dec 25 2013 18:33:11 GMT+0900 (JST)
  photo.rating()    //=> 0

指定したアルバムを取得します。

アルバムにある写真を全て取得します。

var app = Application("iPhoto")
var albums = app.albums
var photos = app.albums["コストコ"].photos

GPS 情報にして、JSON化し、ファイルに書き出しします。

次に、これらから、GPS情報を取得して、JSONファイルに書き出しします。

//写真取得
var app = Application("iPhoto")
var albums = app.albums
var photos = app.albums["コストコ"].photos
//GPS情報にする
list = Array.apply(null, photos)
list = list.filter(function(e){  return e.longitude() })
list = list.map(function(e){ return [e.latitude(),e.longitude()] })

//JSON書き出し
app = Application("Script Editor")
app.includeStandardAdditions=true
var str = JSON.stringify(list)
app.doShellScript( 'echo "'+str+'" > /Users/takuya/Desktop/test1.json')

最後に、コレをHTMLに出力します。

<!DOCTYPE html "-//W3C//DTD XHTML 1.0 Strict//EN" 
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8"/>
<title>Google Maps v3 JavaScript API サンプル</title>
<style>
body{
  margin:0px;
  padding:0px;

}
</style>
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>
<script type="text/javascript">
    var locations = [] // ここに、作ったGPSの配列を埋める、若しくはScriptタグで埋める
    var map;
    function initialize() {
      var latlng = new google.maps.LatLng(34.704753329999996, 136.998505);
      var opts = {
        zoom: 7 ,
        center: latlng,
        mapTypeId: google.maps.MapTypeId.ROADMAP
      };
      map = new google.maps.Map
        (document.getElementById("map_canvas"), opts);
    }
    function add_pin( latitude,logitude ){
      var marker = new google.maps.Marker({
        position: new google.maps.LatLng(latitude,logitude),
        title:"Hello World!"
      });
      marker.setMap(map)
    }
    document.addEventListener( "DOMContentLoaded", function(){
        initialize();
        locations.forEach(function(e){
          console.log(e)
          add_pin(e[0],e[1])
        })

    } )
</script>
</head>
<body>
<div id="map_canvas" style="width:100%; height:100%"><div>
</body>
</html>

これをブラウザで見ると次のようになります。

撮影地一覧

iPhotoの地図は便利だけど

iPhotoの地図は、近隣撮影地をまとめてしまうので、かえって不便なことがあります。てかApple Mapになってから、表示のもたつき感が増加しちゃって、使いづらい。

GPS を取得して、一覧することで便利

位置情報を活用することで、結構楽しめました。

写真の枚数が多いと結構もたつきます

iPhotoに1万枚ほど、写真があるのですが、これを全部見ているとかなりの時間がかかります。。。。

そこは、Automationの限界でしょうか。タイムアウトすることがあります。

そのときは、xargs と組合せて戦うほうがいいかもしれませんね。 ⇛参考資料

工夫次第で結構楽しい

マーカーにinfoWindow をつけた

JavaScript for OSX Automation の一覧

Javascrript for OSX Automation アドベントカレンダー - それマグで!