
ちょっと前にas3flickrlibを使ってFlickrの緯度経度情報の取り方を調べた。
緯度経度情報が取れたのなら、やることはひとつ、
GoogleMaps上に表示だ。
さっそくGoogleMaps Flash API のリファレンスを見ながらしこしこ作ってみた。
以前の記事の下北GPSログの情報を流用した。
マーカーをクリックで該当箇所の画像が見られる。
地図上のラインは、KMLから緯度経度ルート情報を作成した、
外部ファイルから取得している。
リストはこんな感じ。
突貫で作ったので、今度余裕があったらコレをオサレ化してみようと思う。
Google API Key、 Flickr API Keyは伏せたソース一覧↓
*以下のファイル他、as3flickrlibにちょっと手をいれてます。
GPSPhoto.as(メイン)
ACTIONSCRIPT:
- package {
- import com.adobe.webapis.flickr.PhotoSet;
- import com.google.maps.LatLng;
- import flash.display.Sprite;
- import flash.events.Event;
- import flash.events.IOErrorEvent;
- import flash.net.URLLoader;
- import flash.net.URLRequest;
- public class GPSPhoto extends Sprite
- {
- private var csvURL:String = "shimokita.csv";
- private var setid:String = "72157620666800332";
- private var gpsLoader:URLLoader;
- private var map:Gmap;
- private var flcon:FlickerConnector;
- private var flickrImageList:Array;
- private var photoSet:PhotoSet;
- public function GPSPhoto()
- {
- // パラメータでGPSリストとPhotoSetのID取得
- if(loaderInfo.parameters.propertyIsEnumerable("csvURL")) this.csvURL = loaderInfo.parameters["csvURL"];
- if(loaderInfo.parameters.propertyIsEnumerable("setid")) this.csvURL = loaderInfo.parameters["setid"];
- stage.align = "TL";
- stage.scaleMode = "noScale";
- map = new Gmap(750,600,this.mapReadyHandler);
- map.onMarkerClick = this.onMarkerClickHandler;
- this.addChild(map);
- }
- private function mapReadyHandler(event:Event):void{
- var url:String = csvURL;
- var request:URLRequest = new URLRequest(url);
- gpsLoader = new URLLoader(request);
- gpsLoader.addEventListener(Event.COMPLETE, loadCompleteHandler);
- gpsLoader.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
- flcon = new FlickerConnector;
- flcon.onFail = this.onFlickrFailHandler;
- flcon.onGetInfo = this.onGetInfoHandler;
- flcon.onGetPhotos = this.onGetPhotosHandler;
- flcon.getInfo(setid);
- }
- private function onMarkerClickHandler(id:String):void{
- for(var i:Number = 0; this.flickrImageList.length; i++){
- var image:FlickrImage = flickrImageList[i];
- if(image.id == id){
- this.map.showPhoto(image.width_m, image.height_m, new LatLng(parseFloat(image.latitude), parseFloat(image.longitude)), image.title, image.url_m);
- break;
- }
- }
- }
- private function loadCompleteHandler(event:Event):void{
- var lineGeoCSV:String = String(gpsLoader.data);
- var geoList:Array = lineGeoCSV.split(" ");
- var pointList:Array = new Array;
- for(var i:Number=0; i
- if(String(geoList[i])=="") continue;
- var infos:Array = String(geoList[i]).split(",");
- pointList.push(new LatLng(infos[1], infos[0]));
- }
- map.drawPolyline(pointList);
- }
- private function onGetInfoHandler(photoset:PhotoSet):void {
- this.photoSet = photoSet;
- this.flcon.getPhotos(this.setid);
- }
- // 画像一覧情報ロードの完了
- private function onGetPhotosHandler(flickrImageList:Array):void {
- this.flickrImageList = flickrImageList;
- /* 次への布石
- for (var i:Number = 0; i <flickrImageList.length; i++) {
- var image:FlickrImage = flickrImageList[i];
- this.addChild(image.image);
- }*/
- map.drawMarkers(flickrImageList);
- }
- private function onFlickrFailHandler():void {
- // (^-^;;
- }
- private function ioErrorHandler(event:IOErrorEvent):void{
- // (^-^;;
- }
- }
- }
Gmap.as 地図管理用
ACTIONSCRIPT:
- package
- {
- import com.google.maps.InfoWindowOptions;
- import com.google.maps.LatLng;
- import com.google.maps.Map;
- import com.google.maps.MapEvent;
- import com.google.maps.MapMouseEvent;
- import com.google.maps.controls.MapTypeControl;
- import com.google.maps.controls.ZoomControl;
- import com.google.maps.overlays.Marker;
- import com.google.maps.overlays.MarkerOptions;
- import com.google.maps.overlays.Polyline;
- import com.google.maps.overlays.PolylineOptions;
- import com.google.maps.styles.FillStyle;
- import com.google.maps.styles.StrokeStyle;
- import flash.display.Sprite;
- import flash.geom.Point;
- import flash.text.StyleSheet;
- /**
- * ...
- * @author okm
- */
- public class Gmap extends Sprite
- {
- private var map:Map;
- private var markerList:Array;
- public var onReady:Function;
- public var onMarkerClick:Function;
- public function Gmap(width:Number,height:Number, onReady:Function)
- {
- this.onReady = onReady;
- markerList = new Array;
- map = new Map;
- map.addEventListener(MapEvent.MAP_READY, onReady);
- map.key = "Google Maps APIキー";
- map.addControl(new MapTypeControl());
- map.addControl(new ZoomControl());
- map.setSize(new Point(width, height));
- this.addChild(map);
- }
- public function drawPolyline(pointList:Array):void{
- var polyline:Polyline = new Polyline(
- pointList,
- new PolylineOptions({ strokeStyle: new StrokeStyle({
- color: 0x6481F5,
- thickness: 4,
- alpha: 0.7})
- }));
- this.map.addOverlay(polyline);
- this.map.setCenter(pointList[0],17);
- }
- public function drawMarkers(flickrImageList:Array):void{
- for(var i:Number = 0; i <flickrImageList.length; i++){
- var image:FlickrImage = flickrImageList[i];
- var marker:Marker = new Marker(new LatLng(parseFloat(image.latitude), parseFloat(image.longitude)),
- new MarkerOptions({
- strokeStyle: new StrokeStyle({color: 0x666666}),
- fillStyle: new FillStyle({color: 0x6481F5, alpha: 0.8}),
- radius: 12,
- hasShadow: true
- }));
- marker.addEventListener(MapMouseEvent.CLICK, onMarkerClickHandler, false, 1, true);
- this.markerList.push({id:image.id, marker:marker});
- this.map.addOverlay(marker);
- }
- }
- private function onMarkerClickHandler(event:MapMouseEvent):void{
- for(var i:Number = 0; i <markerList.length; i++){
- if(markerList[i].marker == event.target){
- if(this.onMarkerClick != null) this.onMarkerClick(markerList[i].id);
- continue;
- }
- }
- //map.panTo(event.target.getLatLng()); //マーカー座標へ移動
- }
- public function showPhoto(width:Number, height:Number, latlng:LatLng, title:String, imageUrl:String):void {
- var style:StyleSheet = new StyleSheet();
- var heading:Object = new Object();
- heading.fontWeight = "bold";
- heading.color = "#FF0000";
- var body:Object = new Object();
- body.fontStyle = "italic";
- body.textAlign = "center";
- style.setStyle(".heading", heading);
- style.setStyle("body", body);
- // インフォウィンドウ オープン
- map.openInfoWindow(latlng, new InfoWindowOptions( { width:width+20, height:height+35,hasCloseButton: true, contentHTML:"<span class="heading">"+title+"</span>
- <img src=""+imageUrl+"" alt="" />", contentStyleSheet:style, hasTail:false}));
- }
- }
- }
FlickerConnector.as Flickr管理用
ACTIONSCRIPT:
- package
- {
- import com.adobe.webapis.flickr.events.FlickrResultEvent;
- import com.adobe.webapis.flickr.FlickrService;
- import com.adobe.webapis.flickr.methodgroups.Photos;
- import com.adobe.webapis.flickr.methodgroups.PhotoSets;
- import com.adobe.webapis.flickr.Photo;
- import flash.display.Loader;
- import flash.display.LoaderInfo;
- import flash.display.Sprite;
- import flash.events.Event;
- import flash.events.IOErrorEvent;
- import flash.net.URLLoader;
- import flash.net.URLRequest;
- import flash.text.TextField;
- /**
- * ...
- * @author okm
- */
- public class FlickerConnector
- {
- private var fls:FlickrService;
- private var photos:Photos;
- private var photoSets:PhotoSets;
- private var photoIndex:Number = 0;
- private var _imageList:Array;
- private var _thumnailList:Object;
- private var imageLoader:Loader; // 画像ローダ
- public var onGetPhotos:Function;
- public var onGetInfo:Function;
- public var onFail:Function;
- public function FlickerConnector()
- {
- this._imageList = new Array;
- fls = new FlickrService("Flickr API キー");
- photoSets = new PhotoSets(fls);
- fls.addEventListener(FlickrResultEvent.PHOTOSETS_GET_PHOTOS, GetPhptosComplete)
- fls.addEventListener(FlickrResultEvent.PHOTOSETS_GET_INFO, GetInfoComplete)
- }
- public function getPhotos(setid:String):void{
- photoSets.getPhotosExtras(setid);
- }
- public function getInfo(setid:String):void {
- photoSets.getInfo(setid);
- }
- // 写真情報取得完了
- private function GetPhptosComplete(e:FlickrResultEvent):void {
- if (!e.success && this.onFail != null) onFail();
- //photoSetの写真のタイトルとURLを配列に格納
- for (var i:uint; i <e.data.photoSet.photos.length ; i++) {
- var flickrImage:FlickrImage = new FlickrImage(e.data.photoSet.photos[i]);
- this._imageList.push(flickrImage);
- }
- if (this.onGetPhotos != null) this.onGetPhotos(this._imageList);
- //getNextPhoto();
- }
- /* 次への布石
- private function getNextPhoto():void {
- if (this.photoIndex>= this._imageList.length) {
- // ロード完了
- if (this.onGetPhotos != null) this.onGetPhotos(this._imageList);
- return;
- }
- var image:FlickrImage = this._imageList[photoIndex];
- imageLoader = new Loader();
- var imageURLreq:URLRequest = new URLRequest(image.url_t);
- var imgInfo:LoaderInfo = imageLoader.contentLoaderInfo;
- imgInfo.addEventListener(Event.INIT, onImageInit);
- imgInfo.addEventListener(IOErrorEvent.IO_ERROR, onImageIOError);
- imageLoader.load(imageURLreq);
- }
- */
- private function onImageInit(event:Event):void{
- var image:FlickrImage = this._imageList[photoIndex];
- image.image = this.imageLoader;
- this.photoIndex++;
- //getNextPhoto();
- }
- private function onImageIOError(event:Event):void {
- if (this.onFail != null) onFail();
- }
- private function GetInfoComplete(e:FlickrResultEvent):void {
- if (!e.success && this.onFail != null) onFail();
- if (this.onGetInfo != null) this.onGetInfo(e.data.PhotoSet);
- }
- }
- }
FlickrImage.as 画像情報オブジェクト
ACTIONSCRIPT:
- package
- {
- import com.adobe.webapis.flickr.Photo;
- import flash.display.DisplayObject;
- /**
- * ...
- * @author okm
- */
- public class FlickrImage
- {
- public var id:String;
- public var title:String;
- public var latitude:String;
- public var longitude:String;
- public var url_m:String;
- public var url_t:String;
- public var width_t:Number;
- public var height_t:Number;
- public var width_m:Number;
- public var height_m:Number;
- public var image:DisplayObject;
- public function FlickrImage(photo:Photo)
- {
- this.id = photo.id;
- this.title = photo.title;
- this.longitude = photo.longitude;
- this.latitude = photo.latitude;
- this.longitude = photo.longitude;
- this.url_m = photo.url_m;
- this.url_t = photo.url_t;
- this.width_m = photo.width_m;
- this.height_m = photo.height_m;
- this.width_t = photo.width_t;
- this.height_t = photo.height_t;
- }
- }
- }
- Newer: iphone 3GS をバイクにマウントする(2)
- Older: iphone 3GS をバイクにマウントする(1) – GPSストア
Comments:0
Trackbacks:0
- Trackback URL for this entry
- http://parpue.net/web/1070/trackback
- Listed below are links to weblogs that reference
- マッシュアップ地図アルバムを作ってみる[Flickr+GoogleMaps+Flash] from parpue.net


