当前位置: 首页 > 编程日记 > 正文

FGMap学习之--三维地图

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

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

2011041711560128.png

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

再来看看我们的代码:

<?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 Objectmatrix = matrix.concat([0.36577734829179775,0.6012741339631636,0.14454173149981608,0,0]); // redmatrix = matrix.concat([0.34975509588844284,0.6103753117891721,0.1424311139968783,0,0]); // greenmatrix = matrix.concat([0.3484091095395311,0.6023337490798816,0.16297410831863204,0,0]); // bluematrix = matrix.concat([0,0,0,0.9,0]);   // alpha//targetObject.filters = [new ColorMatrixFilter(matrix)];	}else{// Reset to colourmatrix = matrix.concat([1, 0, 0, 0, 0]); // redmatrix = matrix.concat([0, 1, 0, 0, 0]); // greenmatrix = matrix.concat([0, 0, 1, 0, 0]); // bluematrix = 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 dimensionsmyWidth = 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 itmyCanvas.scaleX = 0.6;myCanvas.scaleY = 0.6;myCanvas.validateNow();// Resize itmyCanvas.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 againmyCanvas.scaleX = myScaleX;myCanvas.scaleY = myScaleY;myCanvas.validateNow();// Resize it back againmyCanvas.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>

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

相关文章:

NLP实践:对话系统技术原理和应用

本文节选自电子工业出版社《自然语言处理实践&#xff1a;聊天机器人技术原理与应用》作者&#xff1a;王昊奋&邵浩&李方圆&张凯&宋亚楠以下是节选内容按照技术实现&#xff0c;我们可将任务驱动的对话系统划分为如下两类&#xff1a;模块化的对话系统分模块串…

沃尔沃加入英伟达阵营 2021年开卖自动驾驶汽车

随着研发的深入&#xff0c;自动驾驶行业越来越显现出合纵连横的趋势。本周&#xff0c;英伟达阵营再次迎来新的合作伙伴——沃尔沃和瑞典汽车零部件供应商Autoliv。其实此前沃尔沃的自动驾驶项目“DriveMe”所用的测试车辆就搭载了英伟达DrivePX平台&#xff0c;该公司的自动驾…

【Qt】通过QtCreator源码学习Qt(五):QLoggingCategory管理、分类、过滤打印信息

1、QLoggingCategory简介 在QtCreator源码中新学到一个类QLoggingCategory。 QLoggingCategory可以控制打印输出类别和区域。方便在调试时,过滤掉不关心的打印信息。 2、使用方法 声明 在头文件中声明,供其它文件使用 #include <QLoggingCategory> Q_DECLARE_LOGG…

个人随笔——衰人自叙卷壹

为什么80%的码农都做不了架构师&#xff1f;>>> 臣本菜鸟&#xff0c;求学于锦江&#xff0c;致力就职于专业&#xff0c;不求闻达于外企。HR不以臣级低&#xff0c;BOSS亲点&#xff0c;后召臣入研发部门&#xff0c;晓臣以编码之事&#xff0c;由是感激&#xff…

【Qt】通过QtCreator源码学习Qt(六):命令行参数解析实现

参考下大神的命令行参数解析是如何是实现的 //使用const char []代替宏定义字符串,我以前都是用const QString,想想好傻 const char SETTINGS_OPTION[] = "-settingspath"; const char INSTALL_SETTINGS_OPTION[] = "-installsettingspath"; const char…

【黑客浅析】像黑客一样思考

欢迎大家前往腾讯云社区&#xff0c;获取更多腾讯海量技术实践干货哦~ 作者&#xff1a;由云鼎实验室发表在云社区 网络安全里经常说的一句话是未知攻焉知防&#xff0c;基本所有的安全人员也是一名黑客&#xff0c;在黑客攻击愈发普遍的今天&#xff0c;如何更好的防御黑客攻击…

Python的最佳学习方式

作者 | GENEVIEVE CARLTON译者 | 姜松浩责编 | 屠敏转载自 CSDN&#xff08;ID&#xff1a;CSDNNews&#xff09;以下为译文&#xff1a;如今想要学习 Python 的人拥有比以往更多的资源。但是&#xff0c;这也可能使筛选书籍、课程和其他 Python 资源变得相对困难。并不是每个人…

Android 系统启动过程

文章来源于网络&#xff0c;心得来源于整理。请尊重作者&#xff1a;http://hi.baidu.com/guoxiaoming/blog/item/24e9e9f8c9628f1fd9f9fd89.html/cmtid/7525d63fb437a6cd7c1e713bAndroid 系统启动过程Android 从系统启动有4个步骤: 1, init进程启动 2. Native服务启动 3.Syste…

【Qt】通过QtCreator源码学习Qt(七):插件管理类简介

一、名字空间:ExtensionSystem ExtensionSystem命名空间提供了属于核心插件系统的类。 ExtensionSystem包含插件管理器及其支持类,以及必须由插件提供者实现的IPlugin接口。 二、ExtensionSystem::PluginManager:插件主类 ExtensionSystem::PluginManager简介 三、Exten…

视频直播常见问题与解决办法汇总【系列二—直播截图】

2019独角兽企业重金招聘Python工程师标准>>> 摘要&#xff1a; 使用场景 用户常需要对视频直播的内容进行分析。例如&#xff0c;需要对直播中的某一帧的内容作为封面图片或者对于直播内容进行鉴黄以查看内容合法性等需求。因此&#xff0c;视频直播提供了实时截图功…

智能猫窝是如何诞生的?详解百度大脑的开放生态

3 月 20 日下午&#xff0c;首场百度大脑开放日在北京中关村创业大街百度大脑创新体验中心举行。百度 AI 技术生态部总经理喻友平&#xff0c;就百度大脑平台与生态进行了全面的详解&#xff0c;同时展示了百度大脑开放平台 Q1 核心升级内容&#xff0c;包括语音技术、视觉技术…

我都陪你坐了一天了,你好歹说句话啊!吖的,谱也忒大了。。。

我都陪你坐了一天了&#xff0c;你好歹说句话啊&#xff01;吖的&#xff0c;谱也忒大了。。。 查看图片 转载于:https://blog.51cto.com/guohongzhi521/552922

【linux】Linux下LCD自动熄屏解决方法

1、原因分析 参考博客&#xff1a; https://blog.csdn.net/BOJUE01/article/details/53468026?locationNum5&fps1 https://blog.csdn.net/mao0514/article/details/46562057 正常情况下Linux会在一段时间后默认关闭屏幕&#xff0c;默认为10分钟。开始一直认为是Gnome或K…

翻译机之后,搜狗再推智能硬件产品录音笔

去年 10 月&#xff0c;搜狗 AI 事业部总经理张博告诉 AI科技大本营&#xff08;ID:rgznai100&#xff09;&#xff0c;翻译机只是搜狗做智能硬件的开始&#xff0c;接下里半年里&#xff0c;他们还将发布数款集成了搜狗 AI 技术的硬件产品。 3 月 18 日&#xff0c;搜狗举办了…

小米正用时序数据库,解决这个“硬核”问题

参加 2019 Python开发者日&#xff0c;请扫码咨询 ↑↑↑作者 | 许俊红来源 | 小米云技术&#xff08;id&#xff1a;mi-cloud-tech&#xff09;时序数据根据维基百科的定义[1]&#xff0c;时间序列是一组按照时间发生先后顺序进行排列的数据点序列。时序数据库&#xff08;Tim…

【Qt】通过QtCreator源码学习Qt(八):插件生命周期及对应状态(代码走读)

1、简介 PluginManager管理插件IPlugin的生命周期,从初始化插件到删除插件共八个状态。插件状态表——PluginSpec::enum State { Invalid, Read, Resolved, Loaded, Initialized, Running, Stopped, Deleted}; 插件IPlugin的状态记录在与插件对应的插件说明PluginSpec中,状态…

第七课 环境变量PATH,cp、mv及查看文档cat/more/less/head/tail命令

一、环境变量&#xff08;PATH&#xff09;echo $PATH 查看环境变量的目录PATH$PATH:/tmp/ &#xff08;目录&#xff09;给一个目录赋值环境变量&#xff1b; 让以上环境变量永久生效&#xff1a; 编辑 vi /etc/profile/ 把以上参数加入到文本的最后&#xff0c;退出&#x…

asp.net获取页面url参数值的实现代码实例

asp.net获取页面url参数值的实现代码实例 file: default.aspx.cs using system; using system.data; using system.configuration; using system.collections; using system.web; using system.web.security; using system.web.ui; using system.web.ui.webcontrols; using sys…

【Qt】编译QtCreator

一、Ubuntu14.04编译QtCreator 4.0.3 1、准备工作 编译工具要求 Qt >= 5.5.0; g++ >= 4.7; 2、编译步骤 cd <QtCreator源码目录> qmake -r make 3、安装 make install INSTALL_ROOT=<指定目录> 二、Win10编译QtCreator 4.7.1 1、准备工作 编译工具…

Go Pro 半小时上手指南

Jack刚买了台Go Pro 6&#xff0c;商品包装内没有说明书&#xff0c;希望尽快拍那种慢动作或者酷炫的照片&#xff0c;去网上看了些贴都是注重结果&#xff0c;很少讲具体设置或技巧&#xff0c;光靠自己研究什么时候才能入门&#xff1f;《Go Pro 半小时上手指南》为你解决这些…

出身清华,大神朱俊彦再出GauGAN:AI让你变身神笔马良

参加 2019 Python开发者日&#xff0c;请扫码咨询 ↑↑↑作者 | Just出品 | AI科技大本营&#xff08;ID:rgznai 100&#xff09;一次 TED 演讲中&#xff0c;前锤子科技设计总监罗子雄分享如何入门学设计的经验。要想学好设计&#xff0c;他提醒观众要先看基础实例教程。由于互…

delphi中的第三方控件如何安装 (转)

最佳答案 由于组件提供的方式不同&#xff0c;所以安装的方法也是不一样的&#xff0c;下面就目前常见的各种形式的组 件的安装方法介绍一下。 1只有一个DCU文件的组件。DCU文件是编译好的单元文件&#xff0c;这样的组件是作者不想把源码公 布。一般来说&#xff0c;作…

【Qt】Qt中使用ssl时报错:qt.network.ssl: QSslSocket: cannot resolve SSLv2_client_method

一、问题 在Qt中使用https,运行时报错: qt.network.ssl: QSslSocket: cannot resolve SSLv2_client_method二、原因分析 SSLv2由于某些漏洞导致的不安全原因, 在某些linux发行版里的openssl库禁用掉了SSLv2 三、解决办法 重新编译openssl 1、下载openssl git clone …

渡鸦创始人离职百度后的下一个“真相”

参加 2019 Python开发者日&#xff0c;请扫码咨询 ↑↑↑作者 | 琥珀出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;一直以来&#xff0c;渡鸦科技被外界看做是百度一次失败的收购。彼时彼刻&#xff0c;国内外智能音箱市场成为最火爆的兵家必争之地。渡鸦创始人、原…

QuickBI助你成为分析师——数据源FAQ小结

摘要&#xff1a; 添加数据源的时候经常会遇到各种问题&#xff0c;下面来讲解一下常见情况&#xff0c;若仍有疑问扫码咨询哦&#xff01;使用 Quick BI 分析数据时&#xff0c;需要先指定原始数据所在的数据源&#xff0c;测试连通数据源是数据分析的基础&#xff0c;下面让我…

HTML5 学习笔记(一)- video

直到现在&#xff0c;仍然没有一项可以让网页上显示视频的标准。大多数的视频都是通过插件&#xff08;如Flash&#xff09;来实现播放的&#xff0c;但是并不是所有的浏览器拥有同样的插件。 而伟大的HTML5规定了一个元素<video>来实现这种功能。 <video>支持Ogg、…

【Qt】通过QtCreator源码学习Qt(九):容器算法总结

一、简介 本节总结QtCreator中封装的容器算法接口,源码文件的路径src/libs/utils/algorithm.h。 算法接口包括:判断、查找、删除、统计、排序、转换、拆分、过滤 二、算法源码讲解 1、判断 Utils::anyOf、Utils::allOf Utils::anyOf如果容器中有任一符合条件的元素,则返…

今晚8点直播 | 详解聊天机器人落地及进阶实战

近年来&#xff0c;聊天机器人技术及产品得到了快速的发展。聊天机器人作为人工智能技术的杀手级应用&#xff0c;发展得如火如荼&#xff0c;各种智能硬件层出不穷。本次公开课中&#xff0c;AI科技大本营联合电子工业出版社博文视点邀请到上海瓦歌智能科技有限公司总经理&…

webpack源码之tapable

引言 去年3月的时候当时写了一篇webpack2-update之路,到今天webpack已经到了4.2,更新挺快的,功能也在不断的完善,webpack4特性之一就是零配置, webpack生命力真的很顽强,积极跟上环境的变化,响应社区的需求,不断的迭代,因为parcel在其之前就有这个特性了。直接运行webpack命令,…

常用的 linux命令

为什么80%的码农都做不了架构师&#xff1f;>>> 将目录dir1复制成目录dir2 cp -R file1 file2 同时将文件file1、file2、file3与目录dir1复制到dir2 cp -R file1 file2 file3 dir1 dir2 mv dir1 dir2 移动或修改目录名称 rm -rf 删除文件&目录 vi :q! :wq mk…