http://blog.ityao.com/archives/258
现 在地图应用已经成为网络应用的一个大类了,各个大的网站几乎都有自己的地图产品。最出名的莫过于国外的Google Map和国内的都市圈地图,前面Daniel Yang介绍了都市圈的Flex源代码,小弟也来一个介绍Flex构建地图的系列,希望能够让大家分享到地图开发的乐趣。
不过自己毕竟不是GIS科班出身,也没从事过GIS或者地图的真正商业开发,研究地图应用开发,纯属兴趣,所以不足之处,敬请斧正:)
构建Flex地图应用,首选Google的地图API来实现,有以下原因:
- 支持自定义扩展地图类型
- 有丰富的图形标注工具
- 有多种数据接口
- 详细的文档支持
Google map API的这些特点,可以使我们快速地开发出各式各样的地图web应用,由于本帖不是替google map打广告,就不一一介绍这些特点的详细情况了,本帖更关注于第一个特点,利用Google map api来构建属于自己的地图。
或者大家会问:构建自己的地图?可以是什么样子的呢?
小弟天马行空地替大家想象了一下,我初步想大家可以构建这样的一些应用:
- 在专业的地图服务器里写script导出图瓦(动态或静态),然后制作自己的地图应用,最好的例子就是google地图本身
- 利用网络的地图图瓦资源,构造地图应用,如利用API来显示e都市的三维地图,或者如后面演示的显示别的厂商如google的对手bingo的地图,mapABC的地图等
- 通过修改现成的地图图瓦,来创造自己的地图。呵呵,站在巨人的肩膀上啊,例如你可以抓取google的图瓦,把上面的藏南地区全改回中文,然后发布出去
- 发布大型的图画作品,例如你是卖画或者什么别的艺术品,或者你要做游戏地图,可以把照片割成图瓦,挂到网上去,让大家可以在不同分辨层次下欣赏作品
- 协同进行艺术创作,把地图想象成大图画,大家可以在一个图画上创作,通过Map API可以进行宏观创作或者细节创作
- … 更多更多好点子,欢迎在评论里面留言
首先贴一个swf,给大家看看用Google Map API来显示Live地图和MapABC地图的效果。
实现这个效果的步骤如下:
- 使用Flex的google map api,首先要去这里 下载
- 注册一个api使用的key,在这个页面进行注册
- 创建flex项目,项目目录结构如下图所示:

前面下载的SDK里面的map_flex_1_16.swc(下载时间不同,可能版本号不一致)需要放在项目的lib目录里面去。 - 创建mapsample.mxml主程序,代码如下:
01.<?xml version="1.0"encoding="utf-8"?>02.<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"layout="absolute">03.<maps:Map xmlns:maps="com.google.maps.*"language="zh-CN"id="map"04.mapevent_mapready="onMapReady(event)"05.width="100%"height="100%"key="{mapKey}"/>06.<mx:Script>07.<![CDATA[08.importcom.ityao.map.MapABCDituTileLayerBase;09.importcom.ityao.map.GoogleDituTileLayerBase;10.importcom.ityao.map.LiveDituTileLayerBase;11.12.importcom.google.maps.overlays.TileLayerOverlay;13.importcom.google.maps.controls.MapTypeControl;14.importcom.google.maps.controls.PositionControl;15.importcom.google.maps.controls.ZoomControl;16.importcom.google.maps.LatLng;17.importcom.google.maps.Map;18.importcom.google.maps.MapEvent;19.importcom.google.maps.MapType;20.21.//key for http://blog.ityao.com/22.privatestaticconstmapKey:String="ABQIAAAAjg2LNPeLd2SY_LMC4kTfyhREhvxbmPPYdzuafsMTRfCiNgtm-xT_QN9uPU6M7JTAKA4l_ycXr_8HOg";23.privatefunctiononMapReady(event:Event):void{24.25.map.addControl(newZoomControl());26.map.addControl(newPositionControl());27.map.addControl(newMapTypeControl());28.map.removeMapType(MapType.PHYSICAL_MAP_TYPE);29.map.removeMapType(MapType.SATELLITE_MAP_TYPE);30.map.removeMapType(MapType.HYBRID_MAP_TYPE);31.32.//Live地图33.varliveTileBase:LiveDituTileLayerBase =newLiveDituTileLayerBase();34.varliveTileLayers:Array=newArray();35.liveTileLayers.push(liveTileBase);36.varliveMapType:MapType =newMapType(liveTileLayers,map.MERCATOR_PROJECTION,"Live地图");37.liveTileBase.setMapType(liveMapType);38.map.addMapType(liveMapType);39.40.//mapABC地图41.varmapABCDituTileLayerBase:MapABCDituTileLayerBase =newMapABCDituTileLayerBase();42.varmapABCDituTileLayers:Array=newArray();43.mapABCDituTileLayers.push(mapABCDituTileLayerBase);44.varmapABCDituMapType:MapType =newMapType(mapABCDituTileLayers,map.MERCATOR_PROJECTION,"mapABC地图");45.mapABCDituTileLayerBase.setMapType(mapABCDituMapType);46.map.addMapType(mapABCDituMapType);47.//设置缺省的地图中心和地图类型48.map.setCenter(newLatLng(23.09656,113.19219),10);49.}50.]]>51.</mx:Script>52.</mx:Application>注意需要在程序中修改mapKey变量成为你前面注册的google map api key。
- 在主程序里面,我们创建了两种自定义的地图类型,并且添加了这两种类型进google地图中进行显示
定制自定义地图,如果地图的投影方法和google map一致的话,那只要继承TileLayerBase并重载里面的loadTile(加载图瓦)方法就可以了,下一篇将用live地图和mapABC地图为大家做介绍。
Mikel