<?xml version="1.0" encoding="utf-8"?> <!-- ぱわーすぽったーで占ったみんなのパワースポットを表示します。 (Twitterにポストされたものだけ) アイコンクリック→噴出しの文字クリックでその人のツイートが見れます。 ぱわーすぽったー http://flash-scope.com/powerspotter/ --> <!-- forked from mash's Google Maps API for Flash Example --> <!-- Copyright 2008 Google Inc. Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 --> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> <maps:Map xmlns:maps="com.google.maps.*" id="map" mapevent_mapready="initAll(event)" width="100%" height="100%" /> <mx:Script> <![CDATA[ import jp.progression.commands.net.LoadBitmapData; import jp.progression.commands.lists.SerialList; import org.libspark.betweenas3.BetweenAS3; import org.libspark.betweenas3.easing.*; import com.google.maps.Map; import com.google.maps.MapEvent; import com.google.maps.LatLng; import com.google.maps.MapMouseEvent; import com.google.maps.overlays.Marker; import com.google.maps.overlays.MarkerOptions; import com.google.maps.controls.PositionControl; import com.google.maps.controls.ZoomControl; import com.google.maps.InfoWindowOptions; import flash.display.Bitmap; import flash.display.Sprite; import flash.display.DisplayObject; import flash.events.Event; import flash.events.IOErrorEvent; import flash.geom.Point; import flash.net.URLRequest; import flash.net.URLLoader; import flash.system.LoaderContext; private var _twCompleteFlg:Boolean = false, _gmCompleteFlg:Boolean = false; //API待ち用 private var _sList:SerialList; private var _memberNum:int = 0; //人数 private var _latArr:Array = [], _lngArr:Array = [], _userArr:Array = [], _urlArr:Array = []; public function initAll(e:Event):void { initList(); addEventListener(Event.ENTER_FRAME, waitAPI); initTwit(); initMap(); } //TwitterとGoogleMapの準備ができるのを待つ private function waitAPI(e:Event):void { if (_twCompleteFlg && _gmCompleteFlg) { removeEventListener(Event.ENTER_FRAME, waitAPI); _memberNum = 0; _sList.execute();//Twitterの画像を一気に読み込む } } private function initList():void { _sList = new SerialList(); //_sList.onComplete = function():void { //}; } //======================================================================================= // Twitter // Twitterの検索: http://wonderfl.net/c/fuPg //======================================================================================= private function initTwit():void { var myURLLoader:URLLoader = new URLLoader(); myURLLoader.addEventListener(Event.COMPLETE, onCompleteXML); myURLLoader.addEventListener(IOErrorEvent.IO_ERROR, onIoError); var xmlURL:String = "http://search.twitter.com/search.atom?q=%23powerspotter&a="+Math.random()*99999; myURLLoader.load(new URLRequest(xmlURL)); } public function onIoError(e:IOErrorEvent):void { trace(e.type); } private function onCompleteXML(e:Event):void { e.currentTarget.removeEventListener(Event.COMPLETE, onCompleteXML); var myXML:XML = new XML(e.currentTarget.data); default xml namespace = new Namespace("http://www.w3.org/2005/Atom"); var itemLength:int = myXML.entry.length(); for (var i:int = 0; i < itemLength; i++) { //xmlからlink,authorName,titleの各値を取得 var link:String = myXML.entry[i].link[0].@href; var authorName:String = myXML.entry[i].author.name; var title:String = myXML.entry[i].title; //アイコン画像のURLを取得 var imgURL:String = myXML.entry[i].link[1].@href; //bmpフォーマットのアイコン画像を使っている人も少なくないため、Flashで使えるファイルの拡張子かどうかを判別 var extention:String = imgURL.substr( -4); extention = extention.toLowerCase(); if (extention != ".jpg" && extention != ".gif" && extention != ".png") { //Flashで使える画像の拡張子ではなかった場合にはデフォルトアイコンを指定 imgURL = "http://a1.twimg.com/profile_images/991413660/potter_mini.png"; } //画像のファイル名が日本語などの規定外の文字である場合を考慮しエンコードする imgURL = encodeURI(imgURL); //*3 //小さい画像で十分なので、名前を差し替える imgURL = imgURL.replace(/_normal\./, "_mini\."); var pos:Array = findPos(title); var posflg:Boolean = !(pos[0] == -1 || pos[1] == -1 || pos[2] == -1); //(,)の位置検索が成功しているか調べる if(posflg){ var lat:String = title.substring( pos[0] + 1, pos[1] ); var lng:String = title.substring( pos[1] + 1, pos[2] ); if (!isNaN(parseFloat(lat)) && !isNaN(parseFloat(lng))) { _latArr[_memberNum] = lat; _lngArr[_memberNum] = lng; _userArr[_memberNum] = authorName; _urlArr[_memberNum++] = link; //画像を読み込むコマンドを追加 _sList.addCommand( new LoadBitmapData(new URLRequest(imgURL), { context:new LoaderContext(true) } ), function():void { var icon:Bitmap = new Bitmap(this.latestData); addMarkers(Number(_latArr[_memberNum]), Number(_lngArr[_memberNum]), icon, _userArr[_memberNum], _urlArr[_memberNum++]); icon.scaleY = 0; BetweenAS3.delay(BetweenAS3.tween(icon, { scaleY:1, y: -12 }, null, 0.5, Back.easeOutWith(20)), 0.2 * _memberNum).play(); } ); } } } _twCompleteFlg = true; } private function findPos(str:String):Array { const len:int = str.length - 1; var result:Array = [ -1, -1, -1]; for (var i:int = 0; i <= len; i++) { if (str.charAt(i)=="(" && i != len && !isNaN(parseInt(str.charAt(i + 1)))) { //"("の次の文字が数値だったら result[0] = i; } else if (str.charAt(i)=="," && i != len && i != 0 && !isNaN(parseInt(str.charAt(i + 1)))) { //","の前と次の文字が数値だったら result[1] = i; } else if (str.charAt(i)==")" && i != 0 && !isNaN(parseInt(str.charAt(i - 1)))) { //")"の前の文字が数値だったら result[2] = i; } } if (result[0] < result[1] && result[1] < result[2] && result[0] < result[2]) return result; else return [ -1, -1, -1 ]; } //======================================================================================= // GoogleMaps //======================================================================================= private function initMap():void { this.map.setCenter(new LatLng(37.92253448828909, 137.6586914), 5); this.map.addControl(new ZoomControl); this.map.addControl(new PositionControl); _gmCompleteFlg = true; } //http://blog.alt-scape.com/archives/231 private function addMarkers(lat:Number, lng:Number, twicon:DisplayObject, user:String=null, url:String=null):void { //マーカー設定 var marker:Marker = new Marker( new LatLng(lat, lng), new MarkerOptions({ iconAlignment: MarkerOptions.ALIGN_HORIZONTAL_CENTER | MarkerOptions.ALIGN_VERTICAL_CENTER, icon: twicon, hasShadow:false })); this.map.addOverlay(marker); marker.addEventListener(MapMouseEvent.CLICK, function(e:MapMouseEvent):void { marker.openInfoWindow(new InfoWindowOptions({ contentHTML:"<a href='" + url + "' target='_blank'>" + user + "</a>", width:250, height:10, padding:10 })); }, false, 1, true); } ]]> </mx:Script> </mx:Application> みんなのパワースポット