zoukankan      html  css  js  c++  java
  • FGMap学习之三维地图

    你是否想让自己的地图以三维的形式展示出来呢?在三维下查看QQ地图、Bing地图、MapABC地图或者自己的地图是否有不一样的感觉呢?今天我们就来看看如果使用FGMap API来实现这个功能。

    上次我们做了一个天气预报的示例,今天我们在三维地图上查看,运行界面如下:

    看起来好像还不错,当然我们也可以飞行来查看这些天气变化的情况,请点击“飞行浏览”按钮。

    再来看看我们的代码:

    <?xml version="1.0" encoding="utf-8"?>
    
    <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
    			   xmlns:s="library://ns.adobe.com/flex/spark" 
    			   xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="800" minHeight="600"
    			   xmlns:maps="com.fgmap.maps.*">
    	<fx:Declarations>
    
    	</fx:Declarations>
    
    	<fx:Style>
    	    TitleWindow
            {
                roundedBottomCorners: false;
    			borderAlpha: 0.7;
                backgroundAlpha: 0.7;
                dropShadowEnabled: true;
                borderColor: #9CA299;
            }		
    	</fx:Style>
    	
    	<fx:Script>
    		<![CDATA[
    			import com.fgmap.demo.CityData;
    			import com.fgmap.maps.InfoWindowOptions;
    			import com.fgmap.maps.LatLng;
    			import com.fgmap.maps.LatLngBounds;
    			import com.fgmap.maps.Map;
    			import com.fgmap.maps.MapEvent;
    			import com.fgmap.maps.MapMouseEvent;
    			import com.fgmap.maps.MapMoveEvent;
    			import com.fgmap.maps.MapOptions;
    			import com.fgmap.maps.MapType;
    			import com.fgmap.maps.View;
    			import com.fgmap.maps.controls.MapTypeControl;
    			import com.fgmap.maps.controls.NavigationControl;
    			import com.fgmap.maps.geom.Attitude;
    			import com.fgmap.maps.interfaces.ICamera;
    			import com.fgmap.maps.interfaces.IMapType;
    			import com.fgmap.maps.overlays.Marker;
    			import com.fgmap.maps.overlays.MarkerOptions;
    			import com.fgmap.maps.styles.FillStyle;
    			import com.fgmap.model.CityDataVo;
    			
    			import local.wx.*;
    			
    			import mx.collections.ArrayCollection;
    			import mx.containers.Canvas;
    			import mx.events.FlexEvent;
    			import mx.printing.*;
    
    			[Bindable]
    			private var mapTypes:Array;
    			private var currentMapType:Number;
          		private var myICamera : ICamera;
          		private var marker : Marker; 
    			
    			[Bindable]
    			private var MapColours:ArrayCollection = new ArrayCollection([{label:"Grayscale"},{label:"Colour"}]);
    			
    			private function map_onMapPreInitialize() : void 
    			{
    				map.setInitOptions(new MapOptions({
    					viewMode : View.VIEWMODE_PERSPECTIVE,
    					attitude : new Attitude(0, 0, 0)
    				})); 
    			}			
    			
    			private function map_onMapReady() : void 
    			{
    				intMapType();
    				
    				map.addEventListener(MapEvent.TILES_LOADED_PENDING, tilesLoading);
    				map.addEventListener(MapEvent.TILES_LOADED, tilesLoaded);
    				
    				map.enableScrollWheelZoom();
    				map.enableContinuousZoom();
    				
    				doBWMap(map, false);
    
    				map.setCenter(new LatLng(30.35,114.17), 5);
    				map.addControl(new NavigationControl());
    				map.addControl(new MapTypeControl());
    
    				for each(var cityVo:CityDataVo in CityData.Capital) {
    					var weatherType:String = CityData.WeatherType[int(Math.random() * 11)]
    					createWXMarker(cityVo.latlng,weatherType);
    				}
    	          	
    	          	map.flyTo(new LatLng(30.35,114.17), 5, new Attitude(35, 45, 0), 3);	
    	        } 
    	        
    	        private function tilesLoading(event:MapEvent):void
    	        {	        
    	        	lblLoading.setStyle("color", "0xFF0000");
    	        	lblLoading.text = "Mapping tiles are loading...";
    	        	lblLoading.validateNow();
    	        }
    	        
    	        private function tilesLoaded(event:MapEvent):void
    	        {
    	        	lblLoading.setStyle("color", "0x00FF00");
    	        	lblLoading.text = "Mapping tiles are loaded";
    	        	lblLoading.validateNow();		
    	        }
    	        
    		    public function createWXMarker(latlng:LatLng, type:String): void 
    		    {
    		    	var options:MarkerOptions;
    		    	
    		    	if (type == "Cloudy")
    		    	{
    		    		options = new MarkerOptions({icon: new local.wx.Cloudy(), 
    		    									 draggable: false,
    		    									 clickable: false, 
    		    									 gravity: 2, 
    		    									 distanceScaling: true, 
    		    									 iconAlignment:MarkerOptions.ALIGN_HORIZONTAL_CENTER + MarkerOptions.ALIGN_VERTICAL_CENTER});	
    		    	}
    		    	else if (type == "Partly Cloudy")
    		    	{
        				options = new MarkerOptions({icon: new local.wx.PartlyCloudy(), 
    		    									 draggable: false,
    		    									 clickable: false,  
    		    									 gravity: 2, 
    		    									 distanceScaling: true, 
    		    									 iconAlignment:MarkerOptions.ALIGN_HORIZONTAL_CENTER + MarkerOptions.ALIGN_VERTICAL_CENTER});
    		    	}
    		    	else if (type == "Fog Black")
    		    	{
        				options = new MarkerOptions({icon: new local.wx.FogBlack(), 
    		    									 draggable: false,
    		    									 clickable: false, 
    		    									 gravity: 2, 
    		    									 distanceScaling: true, 
    		    									 iconAlignment:MarkerOptions.ALIGN_HORIZONTAL_CENTER + MarkerOptions.ALIGN_VERTICAL_CENTER});
    		    	}
    		    	else if (type == "Fog White")
    		    	{
        				options = new MarkerOptions({icon: new local.wx.FogWhite(), 
    		    									 draggable: false,
    		    									 clickable: false,  
    		    									 gravity: 2, 
    		    									 distanceScaling: true, 
    		    									 iconAlignment:MarkerOptions.ALIGN_HORIZONTAL_CENTER + MarkerOptions.ALIGN_VERTICAL_CENTER});
    		    	}
    		    	else if (type == "Hail")
    		    	{
        				options = new MarkerOptions({icon: new local.wx.Hail(), 
    		    									 draggable: false,
    		    									 clickable: false,  
    		    									 gravity: 2, 
    		    									 distanceScaling: true, 
    		    									 iconAlignment:MarkerOptions.ALIGN_HORIZONTAL_CENTER + MarkerOptions.ALIGN_VERTICAL_CENTER});
    		    	}
    		    	else if (type == "Heavy Rain")
    		    	{
        				options = new MarkerOptions({icon: new local.wx.HeavyRain(), 
    		    									 draggable: false,
    		    									 clickable: false,  
    		    									 gravity: 2, 
    		    									 distanceScaling: true, 
    		    									 iconAlignment:MarkerOptions.ALIGN_HORIZONTAL_CENTER + MarkerOptions.ALIGN_VERTICAL_CENTER});
    		    	}
    		    	else if (type == "Light Rain")
    		    	{
        				options = new MarkerOptions({icon: new local.wx.LightRain(), 
    		    									 draggable: false,
    		    									 clickable: false,  
    		    									 gravity: 2, 
    		    									 distanceScaling: true, 
    		    									 iconAlignment:MarkerOptions.ALIGN_HORIZONTAL_CENTER + MarkerOptions.ALIGN_VERTICAL_CENTER});
    		    	}
    		    	else if (type == "Lightning")
    		    	{
        				options = new MarkerOptions({icon: new local.wx.Lightning(), 
    		    									 draggable: false,
    		    									 clickable: false,  
    		    									 gravity: 2, 
    		    									 distanceScaling: true, 
    		    									 iconAlignment:MarkerOptions.ALIGN_HORIZONTAL_CENTER + MarkerOptions.ALIGN_VERTICAL_CENTER});
    		    	}
    		    	else if (type == "Sleet")
    		    	{
        				options = new MarkerOptions({icon: new local.wx.Sleet(), 
    		    									 draggable: false,
    		    									 clickable: false,  
    		    									 gravity: 2, 
    		    									 distanceScaling: true, 
    		    									 iconAlignment:MarkerOptions.ALIGN_HORIZONTAL_CENTER + MarkerOptions.ALIGN_VERTICAL_CENTER});
    		    	}
    		    	else if (type == "Snow")
    		    	{
        				options = new MarkerOptions({icon: new local.wx.Snow(), 
    		    									 draggable: false,
    		    									 clickable: false,  
    		    									 gravity: 2, 
    		    									 distanceScaling: true, 
    		    									 iconAlignment:MarkerOptions.ALIGN_HORIZONTAL_CENTER + MarkerOptions.ALIGN_VERTICAL_CENTER});
    		    	}
    		    	else if (type == "Sunny")
    		    	{
        				options = new MarkerOptions({icon: new local.wx.Sunny(), 
    		    									 draggable: false,
    		    									 clickable: false,  
    		    									 gravity: 2, 
    		    									 distanceScaling: true, 
    		    									 iconAlignment:MarkerOptions.ALIGN_HORIZONTAL_CENTER + MarkerOptions.ALIGN_VERTICAL_CENTER});
    		    	}		    			    			    			    			    			    			    	
    		        var markerLocal:Marker = new Marker(latlng, options);
    		        map.addOverlay(markerLocal);
    		    } 
    	        
    			private function doBWMap(myMap:Map, doBW:Boolean):void 
    			{
    				var s1:Sprite = map.getChildAt(1) as Sprite;
                  	var targetObject:Sprite = s1.getChildAt(0) as Sprite;
    				var matrix:Array = new Array();
    				
    				if (doBW)
    				{
    					// Black & White Object
    					matrix = matrix.concat([0.36577734829179775,0.6012741339631636,0.14454173149981608,0,0]); // red
    			        matrix = matrix.concat([0.34975509588844284,0.6103753117891721,0.1424311139968783,0,0]); // green
    			        matrix = matrix.concat([0.3484091095395311,0.6023337490798816,0.16297410831863204,0,0]); // blue
    			        matrix = matrix.concat([0,0,0,0.9,0]);   // alpha
    			        //targetObject.filters = [new ColorMatrixFilter(matrix)];	
    				}
    				else
    				{
    					// Reset to colour
    					matrix = matrix.concat([1, 0, 0, 0, 0]); // red
    			        matrix = matrix.concat([0, 1, 0, 0, 0]); // green
    			        matrix = matrix.concat([0, 0, 1, 0, 0]); // blue
    			        matrix = matrix.concat([0, 0, 0, 1, 0]); // alpha
    			        //targetObject.filters = [new ColorMatrixFilter(matrix)];			
    				}
    			}
    			
    			private function intMapType():void
    			{
    				mapTypes = new Array(MapType.NORMAL_MAP_TYPE, MapType.SATELLITE_MAP_TYPE, MapType.HYBRID_MAP_TYPE, MapType.PHYSICAL_MAP_TYPE);
    		
    				if (!currentMapType) 
    					currentMapType = 1;
    		
    			}
    
    			private function mapTypeChangeHandler():void
    			{
    				//currentMapType = mapType.selectedIndex;
    				//map.setMapType(IMapType(mapTypes[currentMapType]));
    			}
    
    			private function getMapTypeLabels(item:Object):String
    			{
    				return IMapType(item).getName();
    			} 	   
    			
    			private function doCanvasPrint(myMap:Map3D, myCanvas:Canvas, printBitmap:Boolean):void 
    			{
    				var myWidth   : Number;
    				var myHeight  : Number;
    				var myScaleX  : Number;
    				var myScaleY  : Number;
    				
    				// Record current dimensions
    				myWidth = myCanvas.width;
    				myHeight = myCanvas.height;
    				myScaleX = myCanvas.scaleX;
    				myScaleY = myCanvas.scaleY;
    		
    				var pj:PrintJob = new PrintJob();
    				var po:PrintJobOptions = new PrintJobOptions();
    				po.printAsBitmap = printBitmap;
    					
    				if (pj.start() == true) 
    				{		
    					// Scale it
    					myCanvas.scaleX = 0.6;
    					myCanvas.scaleY = 0.6;
    				    myCanvas.validateNow();
    					
    					// Resize it
    		            myCanvas.height = pj.pageHeight;
    		            myCanvas.width = pj.pageWidth;
    					myCanvas.validateNow();	
    									
    					// Print it (do the -1 on rectangle to ensure you don't get background of canvas container, usually shown as a thin blue line)
    					pj.addPage(myCanvas as Sprite, new Rectangle(1, 1, (myCanvas.width * (1 / myCanvas.scaleX)) - 1, (myCanvas.height * (1 / myCanvas.scaleY)) - 1), po);
    					pj.send();
    					
    					// Scale it back again
    					myCanvas.scaleX = myScaleX;
    					myCanvas.scaleY = myScaleY;
    				    myCanvas.validateNow();
    				    
    					// Resize it back again
    					myCanvas.height = myHeight;
    					myCanvas.width = myWidth;
    					myCanvas.validateNow();		
    				}
    			}	
    			
    			private function doTour():void
    			{	
    				for each(var cityVo:CityDataVo in CityData.Capital) {
    					map.flyTo(cityVo.latlng, 7, new Attitude(35, 45, 0), 3);
    				}
    			}
    
    		]]>
    	</fx:Script>
    	
    	<mx:Label x="10" y="10" text="Weather Map" fontSize="12" fontWeight="bold" color="#FFFFFF"/>
    
    	<mx:Button label="Print..." click="doCanvasPrint(map, mapCanvas, true)" right="456" top="10" height="22" width="100"/>
    	<mx:Canvas id="mapCanvas" borderStyle="solid" borderColor="#FFFFFF" left="10" right="10" top="38" bottom="10">
    		<maps:Map3D id="map"
    		 			mapevent_mappreinitialize="map_onMapPreInitialize()" 
    		 			mapevent_mapready="map_onMapReady()" top="0" bottom="0" left="0" right="0"/>
    	</mx:Canvas>
    	<mx:Label color="#FF0606" id="lblLoading" right="10" textAlign="right" top="12" width="196"/>
    	<mx:Button id="btnTour" label="飞行浏览" click="doTour()" right="564" top="10" height="22" width="100"/>
    	<s:Label x="15" y="15" text="三维天气预报" fontSize="16" fontWeight="bold"/>
    </s:Application>
    

    需要代码的朋友可以这里下载:https://files.cnblogs.com/liongis/3DWeatherMap.rar

    作者:LionGIS
    邮箱:liongis@163.com
    QQ:1366940902
    出处:http://liongis.cnblogs.com/
    欢迎转载,请在文章页面明显位置给出原文链接。

  • 相关阅读:
    bzoj1477: 青蛙的约会
    数论/the second wave
    bzoj2818: Gcd
    bzoj2705: [SDOI2012]Longge的问题
    数论/the first wave
    bzoj3942: [Usaco2015 Feb]Censoring
    BZOJ 1059: [ZJOI2007]矩阵游戏( 匈牙利 )
    BZOJ 1013: [JSOI2008]球形空间产生器sphere( 高斯消元 )
    BZOJ 1823: [JSOI2010]满汉全席( 2-sat )
    BZOJ 4260: Codechef REBXOR( trie )
  • 原文地址:https://www.cnblogs.com/liongis/p/2018785.html
Copyright © 2011-2022 走看看