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地图的效果。
This movie requires Flash Player 9
实现这个效果的步骤如下:
- 使用Flex的google map api,首先要去这里 下载
- 注册一个api使用的key,在这个页面进行注册
- 创建flex项目,项目目录结构如下图所示:

前面下载的SDK里面的map_flex_1_16.swc(下载时间不同,可能版本号不一致)需要放在项目的lib目录里面去。 - 创建mapsample.mxml主程序,代码如下:
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> <maps:Map xmlns:maps="com.google.maps.*" language="zh-CN" id="map" mapevent_mapready="onMapReady(event)" width="100%" height="100%" key="{mapKey}"/> <mx:Script> <![CDATA[ import com.ityao.map.MapABCDituTileLayerBase; import com.ityao.map.GoogleDituTileLayerBase; import com.ityao.map.LiveDituTileLayerBase; import com.google.maps.overlays.TileLayerOverlay; import com.google.maps.controls.MapTypeControl; import com.google.maps.controls.PositionControl; import com.google.maps.controls.ZoomControl; import com.google.maps.LatLng; import com.google.maps.Map; import com.google.maps.MapEvent; import com.google.maps.MapType; //key for http://blog.ityao.com/ private static const mapKey:String = "ABQIAAAAjg2LNPeLd2SY_LMC4kTfyhREhvxbmPPYdzuafsMTRfCiNgtm-xT_QN9uPU6M7JTAKA4l_ycXr_8HOg"; private function onMapReady(event:Event):void { map.addControl(new ZoomControl()); map.addControl(new PositionControl()); map.addControl(new MapTypeControl()); map.removeMapType(MapType.PHYSICAL_MAP_TYPE); map.removeMapType(MapType.SATELLITE_MAP_TYPE); map.removeMapType(MapType.HYBRID_MAP_TYPE); //Live地图 var liveTileBase:LiveDituTileLayerBase = new LiveDituTileLayerBase(); var liveTileLayers:Array = new Array(); liveTileLayers.push(liveTileBase); var liveMapType:MapType = new MapType(liveTileLayers,map.MERCATOR_PROJECTION,"Live地图"); liveTileBase.setMapType(liveMapType); map.addMapType(liveMapType); //mapABC地图 var mapABCDituTileLayerBase:MapABCDituTileLayerBase = new MapABCDituTileLayerBase(); var mapABCDituTileLayers:Array = new Array(); mapABCDituTileLayers.push(mapABCDituTileLayerBase); var mapABCDituMapType:MapType = new MapType(mapABCDituTileLayers,map.MERCATOR_PROJECTION,"mapABC地图"); mapABCDituTileLayerBase.setMapType(mapABCDituMapType); map.addMapType(mapABCDituMapType); //设置缺省的地图中心和地图类型 map.setCenter(new LatLng(23.09656,113.19219), 10); } ]]> </mx:Script> </mx:Application>注意需要在程序中修改mapKey变量成为你前面注册的google map api key。
- 在主程序里面,我们创建了两种自定义的地图类型,并且添加了这两种类型进google地图中进行显示
定制自定义地图,如果地图的投影方法和google map一致的话,那只要继承TileLayerBase并重载里面的loadTile(加载图瓦)方法就可以了,下一篇将用live地图和mapABC地图为大家做介绍。
9 条评论
好,正在研究地图,感谢阿银
有什么研究成果记得和大家分享哦
qq414057823@qq.com
import com.ityao.map.MapABCDituTileLayerBase;
import com.ityao.map.GoogleDituTileLayerBase;
import com.ityao.map.LiveDituTileLayerBase
您好,想问下,这几个AS能发下给我吗??谢谢
import com.ityao.map.MapABCDituTileLayerBase;
import com.ityao.map.GoogleDituTileLayerBase;
import com.ityao.map.LiveDituTileLayerBase;
这几个AS能发下给我吗,谢谢
看后一篇就有
Silver想问下,flex google map 可以做到像ditu.google.cn 混合地图一样不?现在flex google map 不是混合地图到一定的缩放级别就没有标记,而且标记跟卫星地图有偏差
其实flex google map和js google map是一样原理的,实现的语言不同而已,这个偏差是国家测绘局发布的,具体我也没摸出门道来,差距大概在随机方向一两公里左右,不过不要尝试crack国家发布的这个偏差,会被抓的
Silver
想请问下,能做到局域网内加载离线地图不?用felx 的,我现在在内网里面,不能访问外网,所以加载不了,google map