Arcgis apis for flex项目实例—开发篇(1):地图浏览

前文已经明确数据用天地图,这样的选择一来是免费,二来各种来源的数据都大同小异,天地图用的2000坐标系是常见的经纬度,方便专题数据叠加。

闲话少说,看一下arcgis api for flex是如何吃定天地图的吧。首先要明确的是我们需要用到四个天地图瓦片服务,分别是经纬度地图底图、经纬度地图中文注记、经纬度影像底图、经纬度影像中文注记,详情可以参阅http://www.tianditu.com/guide/index.html。各种服务形式上都差不多,我们来写一个天地图图层类。

首先新建一个类,这个类必须是com.esri.ags.layers.TiledMapServiceLayer的扩展。

public class TDTTiledMapLayer extends TiledMapServiceLayer
{

}

然后,定义两个变量,_tileInfo、_baseUrl和layerId,_tileInfo是arcgis api瓦片图层的基本参数,_baseUrl是url的基本构成,_baseUrl只是定义了一些必要参数,完整的url还应包括基本地址和瓦片动态参数,再定义一个set属性,用于传入基本地址,瓦片动态参数后面再说,layerId是图层名,这个是天地图服务一个讨厌的参数,同样也要给它一个set属性把这个参数加到地址上。

            private var _tileInfo:TileInfo = new TileInfo();
            private var _baseURL:String = "?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&STYLE=default&TILEMATRIXSET=c&FORMAT=tiles";
            private var _layerId:String = "vec";
            public function set baseUrl(value:String):void
            {
                _baseURL = value + _baseURL;
            }
            public function set layerId(value:String):void
            {
                _baseURL = _baseURL + "&LAYER=" + value;
            }

然后就是定义_tileInfo了,这是我们这个类最为重要的一步,写一个函数buildTileInfo(),具体内容就不解释了,大致是定义瓦片规格,坐标参考系,以及地图级别。

        private function buildTileInfo():void
        {
            _tileInfo.height = 256;
            _tileInfo.width = 256;
            _tileInfo.origin = new MapPoint(-180, 90);
            _tileInfo.spatialReference = new SpatialReference(4490);
            _tileInfo.lods = [
                new LOD(1 , 0.703125,    2.958293554545656E8),
                new LOD(2 , 0.351563,    1.479146777272828E8),
                new LOD(3 , 0.175781,    7.39573388636414E7),
                new LOD(4 , 0.0878906,   3.69786694318207E7),
                new LOD(5 , 0.0439453,   1.848933471591035E7),
                new LOD(6 , 0.0219727,   9244667.357955175),
                new LOD(7 , 0.0109863,   4622333.678977588),
                new LOD(8 , 0.00549316,  2311166.839488794),
                new LOD(9 , 0.00274658,  1155583.419744397),
                new LOD(10, 0.00137329,  577791.7098721985),
                new LOD(11, 0.000686646,  288895.85493609926),
                new LOD(12, 0.000343323,  144447.92746804963),
                new LOD(13, 0.000171661,  72223.96373402482),
                new LOD(14, 8.58307e-005, 36111.98186701241),
                new LOD(15, 4.29153e-005, 18055.990933506204),
                new LOD(16, 2.14577e-005, 9027.995466753102),
                new LOD(17, 1.07289e-005, 4513.997733376551),
                new LOD(18, 5.36445e-006, 2256.998866688275)
            ];
        } 

最后,需要实现一下getTileURL方法,这个方法是把每一张瓦片的动态参数和_baseUrl合并形成每一张瓦片的参数。

            override protected function getTileURL(level:Number, row:Number, col:Number):URLRequest
            {
                var url:String = _baseURL + "&TILEMATRIX=" + level + "&TILEROW=" + row + "&TILECOL=" + col;
                return new URLRequest(url);
            }

然后,这个类要求我们override几个get方法,照单全收。唯一要注意的是initialExtent,这个可以依据当前地图需要的范围来设定,比如我现在就设成了安徽的。当然也可以随便设,调用时map的extent会覆盖它。

        override public function get fullExtent():Extent
        {
            return new Extent(-180, -90, 180, 90, new SpatialReference(4326));
        }
        override public function get initialExtent():Extent
        {
            return new Extent(114.76,27.59,120.26, 35.64,new SpatialReference(4326));
        }
        override public function get spatialReference():SpatialReference
        {
            return new SpatialReference(4490);
        }
        override public function get tileInfo():com.esri.ags.layers.supportClasses.TileInfo
        {
            return _tileInfo;
        }

最后在构造函数里写几笔,主要是要把buildTileInfo()加上。

            public function TDTTiledMapLayer()
            {
                super();
                buildTileInfo();
                setLoaded(true);
            }

好了。类构造完毕,下面我们去调用它。回到我们的index.html,给map加上图层。

    <esri:Map id="map" left="0" right="0" top="0" bottom="0" logoVisible="false" scaleBarVisible="false">
        <tool:TDTTiledMapLayer id="vec_c" baseUrl="http://t0.tianditu.com/vec_c/wmts" visible="true"/>
        <tool:TDTTiledMapLayer id="cva_c" baseUrl="http://t0.tianditu.com/cva_c/wmts" visible="true"/>
        <tool:TDTTiledMapLayer id="img_c" baseUrl="http://t0.tianditu.com/img_c/wmts" visible="false"/>
        <tool:TDTTiledMapLayer id="cia_c" baseUrl="http://t0.tianditu.com/cia_c/wmts" visible="false"/>
    </esri:Map>

影像底图和注记visible置为false是为了地图切换的需要,初始默认的是线划地图。下面来看效果。

再利用一点篇幅,把地图类型切换加上吧。两个按钮是toggleButton,其实有很多办法去做这个按钮,但是我们先简单实现一下。加上一个Bool型的Bindable属性IsVector,用它来标识当前地图类型以及控制按钮的状态。

            [Bindable]
            private var IsVector:Boolean = true;

然后,我们在mxml里做一些改动,主要是把ToggleButton的选中状态以及图层可见性绑定过来。

        <esri:Map id="map" left="0" right="0" top="0" bottom="0" logoVisible="false" scaleBarVisible="false">
            <tool:TDTTiledMapLayer id="vec_c" baseUrl="http://t0.tianditu.com/vec_c/wmts" layerId="vec" visible="{IsVector}"/>
            <tool:TDTTiledMapLayer id="cva_c" baseUrl="http://t0.tianditu.com/cva_c/wmts" layerId="cva" visible="{IsVector}"/>
            <tool:TDTTiledMapLayer id="img_c" baseUrl="http://t0.tianditu.com/img_c/wmts" layerId="img" visible="{!IsVector}"/>
            <tool:TDTTiledMapLayer id="cia_c" baseUrl="http://t0.tianditu.com/cia_c/wmts" layerId="cia" visible="{!IsVector}"/>
        </esri:Map>
        <s:HGroup right="10" top="10" height="22" gap="0" verticalAlign="middle">
            <s:ToggleButton width="60" label="地图" cornerRadius="0" selected="{IsVector}" click="mapType_clickHandler(event)"/>
            <s:ToggleButton width="60" label="影像" cornerRadius="0" selected="{!IsVector}" click="mapType_clickHandler(event)"/>
        </s:HGroup>

下面就把ToggleButton的Click事件绑定上,mxml里我已经写好了,下面看as代码,就一句。

            private function mapType_clickHandler(event:MouseEvent):void
            {
                IsVector = !IsVector;
            }

这样就好了,两个按钮就和地图的类型绑定在了一起。这里使用flex开发中非常重要的绑定机制,这一机制可以让代码变得非常优雅,但这不是重点,更重要的是,它让逻辑变得简单,也更安全。安全这一点后面遇到类似情况我会提出来。

时间: 2024-07-30 19:02:10

Arcgis apis for flex项目实例—开发篇(1):地图浏览的相关文章

Arcgis apis for flex项目实例—开发篇(6):自己的infowindow

前文已经完成了从数据库查询旅游景点的工作,下面就是要把这些查询的结果显示到地图上,同时要实现查询列表和地图的联动.也就是点击列表中的某一项,地图能定位至该位置并弹出infowindow. 这个开发工作本身没有太大的难度,但是我认为的增加了一点障碍,因为我不太喜欢arcgis api自带的infowindow,我需要自己做一个,这一节内容就从这个DIY的infowindow开始.首先来设计一下这个窗体,为了表示不抄袭,这个infowindow改名PopupWindow. PopupWindow.m

Arcgis apis for flex项目实例—开发篇(2):鹰眼图

在底图调用完成后,我们要为地图添加一些工具,首先就是出场率很高的鹰眼图.我这里的鹰眼图是从ESRI的Flex Viewer中剥离出来的,申明一下,怕ESRI说我侵权.经常有人质疑我为什么不直接用Viewer而要费心思自己去写一些组件.我个人的经验是Viewer东西太多了,很臃肿,对于我们这样有整洁强迫症的人来说工程里存在大量用不着的代码非常难受,其实也不光是心理作用了,确实Viewer不经过大量优化会加载比较慢.但是,Viewer中有很多思想和很多组件是非常好用的,比如这个鹰眼,所以我们依然要借

Arcgis apis for flex项目实例—开发篇(5):查询

前文已完成了基本的地图工具,现在要开始一个GIS项目的核心内容——查询.按这个项目的设计,查询要分为政区查询和关键字查询两类,其实都大同小异,这里就只按关键字查询来写了. 查询在一个系统中一般有几个要素,一是要有条件输入,这里就是一个文本框和一个搜索按钮:二是要有结果列表,项目设计的左侧区域就承担了这个任务,计划用一个list来实现:三是要有地图展示,地图展示主要是把查询结果在地图上用符号标注出来,并且能提供一个infowindow来展示详细信息.本节内容不包括第三点,与地图的一些联动在下节单独

Arcgis apis for flex项目实例—开发篇(3):地图级别控制器

地图级别控制器俗称“鱼骨头”,这几乎是Web地图的标配了.ESRI的flex api自带了级别控制器叫做zoomSlider,我觉得是非常的难看,难看的和“鱼骨头”都不太沾边,给任何客户提供这样的一个组件都是非常不严肃的事情,我的选择是要么索性不提供这个工具,要么,就自己做一个.这是我做的组件的效果: 这个组件可以整合很多的地图工具,本节只讨论中间的那个滑块部分,就是从“+”到“-”之间的部分,其他的工具留给下一节. 先来看布局,一个Group把所有的部件框起来,放下两个按钮.两个Rect.两个

Arcgis apis for flex项目实例—开发篇(4):测距工具

这一节就是要完成一个很常见的动态测距工具,一边绘制测距线,一边给出每个节点的结果.顺便把基本的四个方向的移动.放大.缩小.自由平移等map工具都补全. 四个方向的箭头很简单,我直接贴代码了. <commonitem:NavButton id="btn_up" top="10" horizontalCenter="0" icon="image/up_arrow.png" click="map.panUp()&qu

Arcgis apis for flex项目实例—美工篇(1):样式与布局

前文已完成基本的功能,该是进入美工阶段了.我也只是一个小前端程序员,没有能力把页面做的美如画,美工的原则只有两点:一是采用大众化的页面风格,配色和谐,符合大多数用户的操作习惯:二是尽可能采用自定义控件样式,不要出现flex自带的控件样式.这一节先简要介绍一下总体的样式和布局.改变一下习惯,先美工处理过后的效果图: 从最终的结果看主要由几点改变:首先是有了主题色——绿.蓝.橙为主的组合:其次是加入了一些页面元素,页面整体变得丰满:然后是很多控件样式发生了变化,如滚动条.地图切换按钮.搜索框.工具按

Arcgis apis for flex项目实例—谋局篇(2):界面设计

界面设计是谋局当中第二个任务,也是很重要的,这个和概念设计排名不分先后.合理的界面布局会给用户带来非常舒心的体验,在项目之处就能把界面风格和布局确定下来,更是可以让后面的开发事半功倍. First:基本布局.我们不是艺术家,不是激进派,四平八稳符合我们的风格,也符合快速开发的要求,布局就采用上天下地,左表右图的经典百度地图式布局,下面开始. 基本元素:三个border.一个是主窗口,也就是map,一个border是网站的头部,也就是展示个名字放点图片当好看的:一个border是左侧栏,用于查询输

arcgis api for js入门开发系列四地图查询(含源代码)

备注:由于实现本篇功能的需求,修改了地图数据的dlsearch.mxd,然后更新了地图服务,需要的在文章最后有提供最新的mxd以及源代码下载的 上一篇实现了demo的地图工具栏,本篇新增地图查询功能,包括属性查询和空间查询两大块,截图如下: 属性查询效果图: 空间查询效果图: 谈核心代码实现之前,我大概的讲一讲arcgis for js的地图查询方式,一般来说,总共有三种查询方式:FindTask.IdentifyTask.QueryTask (1)FindTask查询模式:基于关键字来模糊查询

ArcGIS API for Flex (使用ArcGIS API for Flex 创建一个新的地图项目)

参考官方:https://developers.arcgis.com/flex/guide/getting-started.htmhttps://developers.arcgis.com/flex/guide/tutorial-adding-a-map-with-layers.htm 新建Flex工程 下载并解压缩ArcGIS API Flex ZIP文件.这个文件包含Flex的ArcGIS API libs库(.swc).语言环境.皮肤包文件 在 Flash Builder中, 选择 Fil