2008年05月22日
Google Maps で航空写真の上に通常地図を重ねる
マスクで自由な形にくりぬいて、複数のマップを重ねることもできる。
実用性はないけど。
以下、ソース(99行)。
package { import flash.events.Event; import flash.display.Sprite; import flash.geom.*; import flash.utils.setInterval; import com.google.maps.*; import com.google.maps.controls.*; import caurina.transitions.Tweener; public class GoogleMapsLayer extends Sprite { private const WIDTH:int = 400; private const HEIGHT:int = 300; private var maps:Array = []; public function GoogleMapsLayer() { super(); stage.scaleMode = "noScale"; stage.align = "TL"; for(var i:int = 0; i < 2; i++){ initMap(i); } } private function initMap(i:int):void{ var map:Map = new Map(); map.key = "ABQIAAAA6de2NwhEAYfH7t7oAYcX3xRWPxFShKMZYAUclLzloAj2mNQgoRQZnk8BRyG0g_m2di3bWaT-Ji54Lg"; map.setSize(new Point(WIDTH, HEIGHT)); map.addEventListener(MapEvent.MAP_READY, function(event:Event):void{ map.setCenter(new LatLng(35.003759, 135.769322), 4, i != 0 ? MapType.NORMAL_MAP_TYPE : MapType.SATELLITE_MAP_TYPE); map.addEventListener("mapevent_movestep", changeHandler); map.addEventListener("mapevent_moveend", changeHandler); map.addEventListener("mapevent_zoomend", changeHandler); var topRight:ControlPosition = new ControlPosition(ControlPosition.ANCHOR_TOP_LEFT, 10, 10); var c:ZoomControl = new ZoomControl(); map.addControl(c); c.setControlPosition(topRight); }); addChild(map); maps.push(map); if(i == 1){ var m:Sprite = new Sprite(); addChild(m); map.mask = m; map.cacheAsBitmap = m.cacheAsBitmap = true; startMaskAnimation(m); } } // sync position private function changeHandler(event:Event):void{ if(maps.length != 2) return; var me:Map = event.target as Map; var other:Map = (me == maps[0] ? maps[1] : maps[0]) as Map; if(!me.getCenter().equals(other.getCenter())){ other.setCenter(me.getCenter()); } if(me.getZoom() != other.getZoom()){ other.setZoom(me.getZoom()); } } private function startMaskAnimation(m:Sprite):void{ setInterval(function():void{ var s:Sprite = new Sprite(); s.x = Math.random() * WIDTH; s.y = Math.random() * HEIGHT; m.addChild(s); var r:int = Math.random() * 300 + 50; if(Math.random() < 0.5){ s.graphics.lineStyle(20, 0, 1, false, "none"); s.graphics.drawCircle(0, 0, 5); } else{ s.graphics.lineStyle(20, 0, 1, false, "none", null, "miter"); s.graphics.drawRect(-5, -5, 10, 10); s.graphics.endFill(); } s.rotation = Math.random() * 180; Tweener.addTween(s, { time: 5, _scale: Math.random() * 40 + 10, alpha: 0, rotation: Math.random() * 180, onComplete: function():void{ m.removeChild(s); } }); }, 500); } } }