// ModestWMS.as // hacked together by brentp package { import flash.display.Sprite; import flash.display.StageAlign; import flash.display.StageScaleMode; import flash.events.Event; import com.modestmaps.core.MapExtent; import com.modestmaps.extras.MapControls; import com.modestmaps.Map; import com.modestmaps.mapproviders.yahoo.YahooHybridMapProvider; public class ModestWMS extends Sprite { private var map:Map; private const PADDING:int = 20; public function ModestWMS() { // setup stage stage.align = StageAlign.TOP_LEFT; stage.scaleMode = StageScaleMode.NO_SCALE; stage.addEventListener(Event.RESIZE, onResize); // create child components createChildren(); onResize(); } private function createChildren():void { var url:String = "http://128.32.8.100/SOD/sod.wms?REQUEST=getmap&VERSION=1.1.1&LAYERS=ca_parks&WIDTH=256&HEIGHT=256&STYLES=&FORMAT=image/png&SRS=EPSG:900913&BBOX=" map = new Map(stage.stageWidth - 2 * PADDING , stage.stageHeight - 2 * PADDING , true , new YahooHybridMapProvider(url) ); // simple, working WMS code (over commerical mapproviders) map.x = map.y = PADDING; addChild(map); map.addChild(new MapControls(map)); map.setExtent(new MapExtent(37.829853, 37.700121, -122.212601, -122.514725)); } private function onResize(event:Event = null):void { var w:Number = stage.stageWidth - 2 * PADDING; var h:Number = stage.stageHeight - 2 * PADDING; map.x = map.y = PADDING; map.setSize(w, h); } } } /*888888888888888888888888888888888888888888888888888888888888888888888888888888888*/ // YahooHybridMapProvider.as package com.modestmaps.mapproviders.yahoo { import com.modestmaps.core.Coordinate; import com.modestmaps.io.MapProviderPaintThrottledRequest; import com.modestmaps.events.*; import com.modestmaps.geo.Location import com.modestmaps.geo.Transformation; import com.modestmaps.geo.MercatorProjection; import com.modestmaps.mapproviders.IMapProvider; import com.modestmaps.mapproviders.yahoo.AbstractYahooMapProvider; import flash.display.Sprite; /** * @author darren * $Id: YahooHybridMapProvider.as 447 2008-01-25 00:54:38Z tom $ */ public class YahooHybridMapProvider extends AbstractYahooMapProvider implements IMapProvider { private var __url:String = ""; public function YahooHybridMapProvider(url:String=""){ super(); __url = url; } override public function toString():String { return "YAHOO_HYBRID"; } /** * Yahoo sprites are 258x258 to deal with Flash pixel fudge, we mask and offset them by * one pixel so they show up correctly. */ override public function paint(sprite:Sprite, coord:Coordinate):void { var bg:Sprite = new Sprite(); bg.name = "bg"; sprite.addChild(bg); var overlay:Sprite = new Sprite(); overlay.name = "overlay"; sprite.addChild(overlay); var request:MapProviderPaintThrottledRequest = new MapProviderPaintThrottledRequest(bg, getBGTileUrl( coord ), coord ); request.addEventListener(ThrottledRequestEvent.REQUEST_ERROR, onRequestError); request.addEventListener(ThrottledRequestEvent.RESPONSE_COMPLETE, onResponseComplete); request.addEventListener(ThrottledRequestEvent.RESPONSE_ERROR, onResponseError); request.send(); request = new MapProviderPaintThrottledRequest(overlay, getOverlayTileUrl( coord ), coord ); request.addEventListener(ThrottledRequestEvent.REQUEST_ERROR, onRequestError); request.addEventListener(ThrottledRequestEvent.RESPONSE_COMPLETE, onResponseComplete); request.addEventListener(ThrottledRequestEvent.RESPONSE_ERROR, onResponseError); request.send(); if(__url != ''){ var wms:Sprite = new Sprite(); wms.name = "wms"; sprite.addChild(wms); request = new MapProviderPaintThrottledRequest(wms, getWMSTileUrl( coord ), coord ); request.addEventListener(ThrottledRequestEvent.REQUEST_ERROR, onRequestError); request.addEventListener(ThrottledRequestEvent.RESPONSE_COMPLETE, onResponseComplete); request.addEventListener(ThrottledRequestEvent.RESPONSE_ERROR, onResponseError); request.send(); wms.x = wms.y = -.5; } bg.x = bg.y = -.5; overlay.x = overlay.y = -.5; createMask( sprite ); } private function getBGTileUrl(coord:Coordinate):String { return "http://us.maps3.yimg.com/aerial.maps.yimg.com/tile?v=1.7&t=a" + getZoomString(sourceCoordinate(coord)); } private function getOverlayTileUrl(coord:Coordinate):String { return "http://us.maps3.yimg.com/aerial.maps.yimg.com/png?v=2.2&t=h" + getZoomString(sourceCoordinate(coord)); } /* take a lat/lon location, and return a new location in mercator meters. suitable for use with projections: EPSG:54004 http://spatialreference.org/ref/epsg/54004/ EPSG:900913 http://spatialreference.org/ref/epsg/900913/ math is copied from here: http://search.cpan.org/src/DARNOLD/Geo-Mercator-1.01/lib/Geo/Mercator.pm and john deck's blog. */ private function toMercator(loc:Location):Location { var sma:Number = 6378137.0; var ecc:Number = 0.0818191913108718138; var x:Number = loc.lon * sma * Math.PI / 180.; var y:Number = loc.lat > 89.5 ? 89.5 : (loc.lat < -89.5 ? -89.5 : loc.lat) y *= Math.PI / 180.; var l:Number = ecc * Math.sin(y); y = sma * Math.log(Math.tan((y + Math.PI / 2 ) / 2) * Math.pow( ((1 - l) / (1 + l)) , (ecc/2))); return new Location(y, x); } private function getWMSTileUrl(coord:Coordinate):String { var row:int = coord.row; var up_left:Location = toMercator(coordinateLocation(sourceCoordinate(new Coordinate(row, coord.column, coord.zoom)))); var down_right:Location = toMercator(coordinateLocation(sourceCoordinate(new Coordinate(row + 1, coord.column + 1, coord.zoom)))); return __url + up_left.lon.toString() + "," + down_right.lat.toString() + "," + down_right.lon.toString() + "," + up_left.lat.toString(); } private function getZoomString( coord:Coordinate ):String { var row:Number = ( Math.pow( 2, coord.zoom ) /2 ) - coord.row - 1; return "&x=" + coord.column + "&y=" + row + "&z=" + (18 - coord.zoom); } // Event Handlers override protected function onResponseComplete(event:ThrottledRequestEvent):void { } } }