読者です 読者をやめる 読者になる 読者になる

GPSと動画を組み合わせたサンプル

Android の myTracks で現在位置と時間を記録したものとAndroidの動画撮影機能とを組み合わせてみました。

こんな感じ
http://moeten.info/flex/20101229_mapMovieTest/bin-release/Main.html
AndroidのmyTracksはいろいろな形式で書き出しが可能ですが、今回は比較的扱いやすそうなGPX形式でトライしてみました。
ドライブレコーダーとして遊びたいですね〜。あとは船とか旅行とかで。
ソースはこちら

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
                xmlns:controls="com.google.maps.controls.*"
                minWidth="955" minHeight="600" layout="absolute">
    <mx:Script>
        <![CDATA[
            import com.google.maps.LatLng;
            import com.google.maps.MapMouseEvent;
            import com.google.maps.controls.ZoomControl;
            import com.google.maps.overlays.Marker;
            import com.google.maps.overlays.Polyline;
            import com.google.maps.overlays.PolylineOptions;
            import com.google.maps.styles.StrokeStyle;
            import mx.collections.ArrayCollection;
            import mx.rpc.events.ResultEvent;
            private function onMapReady(e:Event ):void{
                var zoom:ZoomControl = new ZoomControl();
                map.addControl( zoom );
                hts.send();
            }
            private var time_arr:Array = new Array();
            protected function hts_resultHandler(event:ResultEvent):void
            {
                namespace ns = "http://www.topografix.com/GPX/1/0";
                use namespace ns;
                var cnt:int = 0;
                var center:LatLng;
                var old_latlng:LatLng;
                for each (var item:XML in hts.lastResult.ns::["trk"]["trkseg"]["trkpt"] ) {
                    if( cnt == 0  ){
                        center = new LatLng( item.attribute("lat" ) ,  item.attribute("lon" ) );
                    }
                    var ymd:String = (String(item.time).split("T"))[0];
                    var hms:String = (String(item.time).split("T"))[1].replace("Z" , "" );
                    var ymd_arr:Array = ymd.split("-");
                    var hms_arr:Array = hms.split(":");
                    var date:Date = new Date( int( ymd_arr[0] ) , int( ymd_arr[1] ) -1 , int( ymd_arr[2] ) , int( hms_arr[0] ) , int( hms_arr[1] ) , int( hms_arr[2] ) );
                    time_arr[cnt] = date.time;
                    var latlng:LatLng = new LatLng( item.attribute("lat" ) ,  item.attribute("lon" ) );
                    setMarker( cnt , latlng  );
                    if( cnt != 0 ){
                        var polyline:Polyline = new Polyline( [ old_latlng, latlng ],
                            new PolylineOptions({
                                strokeStyle: new StrokeStyle({
                                    color: 0xFF0000,
                                    thickness: 4,
                                    alpha: 0.7
                                })
                            })
                        );
                        map.addOverlay( polyline );
                    }
                    old_latlng = new LatLng( item.attribute("lat" ) ,  item.attribute("lon" ) );
                    cnt ++;
                }
                map.setCenter( center , 18 );
            }
            //アイコンの作成
            private function setMarker( myid:int , latlng:LatLng ):void{
                var marker:Marker = new Marker( latlng );
                marker.addEventListener(MapMouseEvent.CLICK , function():void{
                    vd.playheadTime = vd.totalTime * ( time_arr[myid] -  time_arr[0] )/ ( time_arr[ time_arr.length-1 ] - time_arr[0] ) ;
                    vd.play();
                });
                map.addOverlay(marker);
            }
        ]]>
    </mx:Script>
    <mx:HTTPService id="hts" resultFormat="e4x" url="assets/gps.gpx" result="hts_resultHandler(event)"/>
    <maps:Map xmlns:maps="com.google.maps.*" id="map" mapevent_mapready="onMapReady(event)" width="100%" height="100%"
              key="ABQIAAAAqo7EY3mBNBkyzrKst6uulRTmk3SD0QkswU8g_oWSt8kZIhRxRxRqF4ut6YiIpGulomMoyJuSg6kvJQ" sensor="false"/>
    <mx:VideoDisplay id="vd" x="10" y="10" width="218" height="116" source="assets/movie_6.f4v"/>
    <mx:TextArea id="myLog" x="10" y="138" text="{vd.playheadTime}"/>
</mx:Application>

参考になるページ

GPX - Wikipedia
GPX形式について
e4x の落とし穴 | エントリー | _level0.KAYAC | flash ActionScript blog
namespace付きの場合の処理。以外とめんどいので知っておきたい。
QName クラスの続き - akihiro kamijo
namespaceの扱いや要素へのアクセス。
Google Maps API for Flash オーバーレイ - Google Maps API for Flash - Google Code
Google Map Flash
Google Maps API for Flash イベント - Google Maps API for Flash - Google Code
Google Map にラインを引く
Date - ActionScript 3.0 コンポーネントリファレンスガイド
日付クラス。monthだけマイナス1になるのに注意する。
VideoDisplay覚え書き (godagoda.net)
ビデオを指定した時間から再生する。