ModestMapsSample
これはBSDライセンスです。
*
* Modest Mapsという(新)BSDライセンスの地図APIのデモ
* http://modestmaps.com/
*
* ソースに同梱されているSampleほぼそのまま。
* wonderfl用にパッケージを解いてちょっといじったくらい。
* 右上のメニューから地図画像を選択できる。
* 一部(AC Transit,Daily Planet)がうまく動かないけど、
* たぶん、地図が用意されていないから。
*
/*
* これはBSDライセンスです。
*
* Modest Mapsという(新)BSDライセンスの地図APIのデモ
* http://modestmaps.com/
*
* ソースに同梱されているSampleほぼそのまま。
* wonderfl用にパッケージを解いてちょっといじったくらい。
* 右上のメニューから地図画像を選択できる。
* 一部(AC Transit,Daily Planet)がうまく動かないけど、
* たぶん、地図が用意されていないから。
* */
package {
//import com.adobe.viewsource.ViewSource;
import com.modestmaps.Map;
import com.modestmaps.TweenMap;
import com.modestmaps.core.MapExtent;
import com.modestmaps.events.MapEvent;
import com.modestmaps.events.MarkerEvent;
import com.modestmaps.extras.MapControls;
import com.modestmaps.extras.MapCopyright;
import com.modestmaps.extras.ZoomBox;
import com.modestmaps.extras.ZoomSlider;
import com.modestmaps.geo.Location;
import com.modestmaps.mapproviders.*;
import com.modestmaps.mapproviders.microsoft.*;
import com.modestmaps.mapproviders.yahoo.*;
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.geom.Point;
import flash.text.TextField;
import flash.text.TextFormat;
/**
* Pure Actionscript 3 Flex Builder project,
* based on ModestMapsSample.fla by David Knape.
*
* This demonstration app shows the basics of:
* - creating a map
* - setting/changing map providers
* - adding markers
* - listening for map and marker events
*
* @author David Knape
*/
[SWF(backgroundColor="#000000", frameRate="30")]
public class Main extends Sprite
{
// Our modest map
private var map:Map;
// a tooltip/flag that appears on marker rollover
private var tooltip:Tooltip;
// status text field at bottom of screen
private var status:TextField;
// our map provier button holder
private var mapButtons:Sprite;
// padding around map in pixels
private const PADDING:int = 20;
/**
* This constructor is called automatically when the SWF starts
*/
public function Main()
{
// be the web, as best we can
//ViewSource.addMenuItem(this, 'srcview/index.html', true);
// setup stage
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
// create child components
createChildren();
// place the markers
placeMarkers();
// adjust sizes for things if the window changes
stage.addEventListener(Event.RESIZE, onResize);
// init size by forcing call to stage resize handler
onResize();
}
/**
* Creates child componets
* - map
* - status text field
* - buttons
*/
private function createChildren():void
{
// create map
map = new TweenMap(stage.stageWidth - 2 * PADDING, stage.stageHeight - 2 * PADDING,
true,
new MicrosoftRoadMapProvider(),
new MapExtent(35.70503,35.68551,-220.31546,-220.28285));
//new MapExtent(37.829853, 37.700121, -122.212601, -122.514725));
map.addEventListener(MouseEvent.DOUBLE_CLICK, map.onDoubleClick);
map.x = map.y = PADDING;
//map.addChild(map.grid.debugField);
// listen for map events
map.addEventListener(MapEvent.ZOOMED_BY, onZoomed);
map.addEventListener(MapEvent.STOP_ZOOMING, onStopZoom);
map.addEventListener(MapEvent.PANNED, onPanned);
map.addEventListener(MapEvent.STOP_PANNING, onStopPan);
map.addEventListener(MapEvent.RESIZED, onResized);
// listen for marker events
map.addEventListener(MarkerEvent.MARKER_CLICK, onMarkerClick);
map.addEventListener(MarkerEvent.MARKER_ROLL_OVER, onMarkerRollOver);
map.addEventListener(MarkerEvent.MARKER_ROLL_OUT, onMarkerRollOut);
// add some controls using the MapControls extra
// we're adding them as children of map so they move with the map
map.addChild(new MapControls(map));
map.addChild(new ZoomSlider(map));
map.addChild(new ZoomBox(map));
// add a default copyright handler to the map
//map.addChild(new MapCopyright(map));
// create tooltip
tooltip = new Tooltip();
// create text field to hold status text
status = new TextField();
status.defaultTextFormat = new TextFormat('Verdana', 10, 0xeeeeee);
status.selectable = false;
status.text = 'Welcome to Modest Maps...';
status.width = 600;
status.height = 20;
// create some provider buttons
mapButtons = new Sprite();
mapButtons.addChild(new MapProviderButton('MS Road', map.getMapProvider(), true));
mapButtons.addChild(new MapProviderButton('MS Aerial', new MicrosoftAerialMapProvider()));
mapButtons.addChild(new MapProviderButton('MS Hybrid', new MicrosoftHybridMapProvider()));
mapButtons.addChild(new MapProviderButton('Yahoo Road', new YahooRoadMapProvider()));
mapButtons.addChild(new MapProviderButton('Yahoo Aerial', new YahooAerialMapProvider()));
mapButtons.addChild(new MapProviderButton('Yahoo Hybrid', new YahooHybridMapProvider()));
mapButtons.addChild(new MapProviderButton('Open Street Map', new OpenStreetMapProvider()));
mapButtons.addChild(new MapProviderButton('AC Transit', new ACTransitMapProvider()));
mapButtons.addChild(new MapProviderButton('Daily Planet', new DailyPlanetProvider()));
// arrange buttons 22px apart
for( var n:int = 0; n < mapButtons.numChildren; n++) {
mapButtons.getChildAt(n).y = n * 22;
}
// listen for map provider button clicks
mapButtons.addEventListener(MouseEvent.CLICK, onProviderButtonClick);
map.addChild(map.grid.debugField);
// add children to the display list
addChild(map);
addChild(status);
addChild(mapButtons);
addChild(tooltip);
}
/**
* Places sample markers on our map
*/
private function placeMarkers():void
{
// Some sample data
// In most cases, we would have loaded this from XML, or a web service.
var markerpoints:Array = [
{ title:'mztm.jp', loc:"35.70295, -220.29511"},
{ title:'Rochdale', loc:"37.865571, -122.259679"},
{ title:'Parker Ave.', loc:"37.780492, -122.453731"},
{ title:'Pepper Dr.', loc:"37.623443, -122.426577"},
{ title:'3rd St.', loc:"37.779297, -122.392877"},
{ title:'Divisadero St.', loc:"37.771919, -122.437413"},
{ title:'Market St.', loc:"37.812734, -122.280064"},
{ title:'17th St. is a long street with a short name, but we want to test the tooltip with a long title.', loc:"37.804274, -122.262940"}
];
var o:Object;
// Now, we just loop through our data set, and place the markers
for each (o in markerpoints) {
// step 1 - create a marker
var marker:SampleMarker = new SampleMarker();
// step 2 - give it any custom app-specific data it might need
marker.title = o.title;
// step 3 - create a location object
//
// if you have lat and long...
// var loc:Location = new Location (lat, long);
//
// but, we have a comma-separated lat/long pair, so...
var loc:Location = Location.fromString( o.loc );
// step 4 - put the marker on the map
map.putMarker( loc, marker);
}
}
/**
* Stage Resize handler
*/
private function onResize(event:Event = null):void
{
var w:Number = stage.stageWidth - 2 * PADDING;
var h:Number = stage.stageHeight - 2 * PADDING;
// position and size the map
map.x = map.y = PADDING;
map.setSize(w, h);
// align the buttons to the right
mapButtons.x = map.x + w - 120;
mapButtons.y = map.y + 10;
// place status just below the map on the left
status.width = w;
status.x = map.x + 2;
status.y = map.y + h;
}
/**
* Change map provider when provider buttons are clicked
*/
private function onProviderButtonClick(event:Event):void
{
var button:MapProviderButton = event.target as MapProviderButton;
map.setMapProvider(button.mapProvider);
button.selected = true;
for (var i:int = 0; i < mapButtons.numChildren; i++) {
var other:MapProviderButton = mapButtons.getChildAt(i) as MapProviderButton;
if (other != button) {
other.selected = false;
}
}
}
/**
* Marker Click
*/
private function onMarkerClick(event:MarkerEvent):void
{
var marker:SampleMarker = event.marker as SampleMarker;
status.text = "Marker Clicked: " + marker.title + " " + event.location;
}
/**
* Marker Roll Over
*/
private function onMarkerRollOver(event:MarkerEvent):void
{
//trace('Roll Over ' + event.marker + event.location);
var marker:SampleMarker = event.marker as SampleMarker;
// show tooltip
var pt:Point = map.locationPoint( event.location, this );
tooltip.x = pt.x;
tooltip.y = pt.y;
tooltip.label = marker.title;
tooltip.visible = true;
}
/**
* Marker Roll Out
*/
private function onMarkerRollOut(event:MarkerEvent):void
{
// hide the tooltip
tooltip.visible = false;
}
//---------------------
// Map Event Handlers
//---------------------
private function onPanned(event:MapEvent):void
{
status.text = 'Panned by ' + event.panDelta.toString() + ', top left: ' + map.getExtent().northWest.toString() + ', bottom right: ' + map.getExtent().southEast.toString();
}
private function onStopPan(event:MapEvent):void
{
status.text = 'Stopped panning, top left: ' + map.getExtent().northWest.toString() + ', center: ' + map.getCenterZoom()[0].toString() + ', bottom right: ' + map.getExtent().southEast.toString() + ', zoom: ' + map.getCenterZoom()[1];
}
private function onZoomed(event:MapEvent):void
{
status.text = 'Zoomed by ' + event.zoomDelta.toFixed(3) + ', top left: ' + map.getExtent().northWest.toString() + ', bottom right: ' + map.getExtent().southEast.toString();
}
private function onStopZoom(event:MapEvent):void
{
status.text = 'Stopped zooming, top left: ' + map.getExtent().northWest.toString() + ', center: ' + map.getCenterZoom()[0].toString() + ', bottom right: ' + map.getExtent().southEast.toString() + ', zoom: ' + map.getCenterZoom()[1];
}
private function onResized(event:MapEvent):void
{
status.text = 'Resized to: ' + event.newSize[0] + ' x ' + event.newSize[1];
}
}
}
//MapProviderButton.as
import com.modestmaps.mapproviders.IMapProvider;
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.filters.DropShadowFilter;
import flash.geom.ColorTransform;
import flash.text.TextField;
import flash.text.TextFormat;
/**
* Button for use in ModestMaps Sample
*
* @author David Knape
*/
class MapProviderButton extends Sprite {
private var label:TextField;
public var mapProvider:IMapProvider;
private var overTransform:ColorTransform = new ColorTransform(1,1,1);
private var outTransform:ColorTransform = new ColorTransform(1,.9,.6);
private var normalFormat:TextFormat = new TextFormat( 'Verdana', 10, 0x000000, false);
private var selectedFormat:TextFormat = new TextFormat( 'Verdana', 10, 0x000000, true);
private var _selected:Boolean = false;
public function MapProviderButton( label_text:String, map_provider:IMapProvider, selected:Boolean=false ) {
useHandCursor = true;
mouseChildren = false;
buttonMode = true;
addEventListener(MouseEvent.MOUSE_OVER, onMouseOver);
addEventListener(MouseEvent.MOUSE_OUT, onMouseOut);
mapProvider = map_provider;
filters = [ new DropShadowFilter(1,45,0,1,3,3,.7,2) ];
transform.colorTransform = outTransform;
// create label
label = new TextField();
label.selectable = false;
label.defaultTextFormat = normalFormat;
label.text = label_text;
label.width = label.textWidth + 8;
label.height = 18;
label.x = label.y=1;
addChild( label );
this.selected = selected;
// create background
graphics.clear();
graphics.beginFill(0xdddddd);
graphics.drawRoundRect(0, 0, 110, 18, 9, 9);
graphics.beginFill(0xffffff);
graphics.drawRoundRect(0, 0, 108, 16, 9, 9);
graphics.beginFill(0xbbbbbb);
graphics.drawRoundRect(2, 2, 108, 16, 9, 9);
graphics.beginFill(0xdddddd);
graphics.drawRoundRect(1, 1, 108, 16, 9, 9);
}
public function onMouseOver(event:MouseEvent=null):void
{
transform.colorTransform = overTransform;
}
public function onMouseOut(event:MouseEvent=null):void
{
transform.colorTransform = outTransform;
}
public function set selected(s:Boolean):void
{
_selected = s;
label.setTextFormat(s ? selectedFormat : normalFormat);
}
public function get selected():Boolean
{
return _selected;
}
}
//SampleMarker.as
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.filters.BevelFilter;
/**
* Sample Marker
* @author David Knape
*/
class SampleMarker extends Sprite {
private var _title : String;
public function SampleMarker() {
buttonMode = true;
mouseChildren = false;
tabEnabled = false;
//cacheAsBitmap = true;
mouseEnabled = true;
// David's Flash example draws the marker
// in the Flash environment
// but need to draw something:
// first a zero-alpha circle so the filter's bitmap cache doesn't mess things up
graphics.beginFill(0xff0000,0);
graphics.drawCircle(0, 0, 11);
graphics.endFill();
// now a red circle
graphics.beginFill(0x4465d7);
graphics.drawCircle(0, 0, 10);
graphics.endFill();
filters = [ new BevelFilter(1,45,0xffffff,0.35,0x000000,0.35,2,2,1,1) ];
addEventListener( MouseEvent.MOUSE_OVER, mouseOver );
}
public function get title () : String {
return _title;
}
public function set title (s:String) : void {
_title = s;
}
protected function mouseOver(e:MouseEvent) : void {
parent.swapChildrenAt(parent.getChildIndex(this), parent.numChildren - 1);
}
override public function toString() : String {
return '[SampleMarker] ' + title;
}
}
//Tooltip.as
import flash.display.Shape;
import flash.display.Sprite;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
import flash.text.TextFormat;
/**
* @author David Knape
*/
class Tooltip extends Sprite {
public var background:Shape;
public var label_txt:TextField;
public function Tooltip() {
background = new Shape();
background.graphics.beginFill(0xffffff);
background.graphics.drawRect(0,0,100,20);
background.graphics.endFill();
addChild(background);
label_txt = new TextField();
label_txt.selectable = false;
label_txt.defaultTextFormat = new TextFormat( 'Verdana', 10, 0x000000 );
addChild(label_txt);
visible = false;
mouseEnabled = false;
}
public function set label ( s: String ) : void {
label_txt.autoSize = TextFieldAutoSize.LEFT;
label_txt.width = 200;
label_txt.multiline = label_txt.wordWrap = true;
label_txt.text = s;
background.width = Math.max( 100, label_txt.textWidth + 10);
background.height = label_txt.textHeight + 18;
background.y = Math.round( -background.height - 16 );
background.x = 1;
label_txt.y = background.y + 2;
graphics.clear();
graphics.lineStyle(0,0x000000);
graphics.beginFill(0xffffff);
graphics.moveTo(0,0);
graphics.lineTo(background.x-1,background.y+background.height+1);
graphics.lineTo(background.x-1,background.y-1);
graphics.lineTo(background.x+background.width+1,background.y-1);
graphics.lineTo(background.x+background.width+1,background.y+background.height+1);
graphics.lineTo(background.x+10,background.y+background.height+1);
graphics.lineTo(0,0);
}
}