土木水电学院 3S实验室 肖泽云
QQ:289700062 第 1 页 共 38 页 Email:xwebsite@163.com
Flex for ArcGIS开发
三峡大学土木水电学院 肖泽云
参考资料:http://resources.esri.com/help/9.3/arcgisserver/apis/flex/help/index.html
目 录
1、一个简单的例子..................................................................................................2
2、切换地图 .............................................................................................................3
3、使用查询 .............................................................................................................5
4、使用地图范围......................................................................................................9
5、使用图形 ...........................................................................................................13
6、符号化图形 .......................................................................................................16
7、Geoprocessing工具 .........................................................................................19
8、路径分析 ...........................................................................................................22
9、组件样式 ...........................................................................................................24
10、Flex事件 ........................................................................................................27
11、当前地图范围..................................................................................................28
12、当前鼠标坐标..................................................................................................31
13、缩放至选择的对象 ..........................................................................................33
14、图层目录 .........................................................................................................37
土木水电学院 3S实验室 肖泽云
QQ:289700062 第 2 页 共 38 页 Email:xwebsite@163.com
1、一个简单的例子
代码:
其中,地图采用 ArcGISDynamicMapServiceLayer,其地址为 url属性中的地址。运行
程序,其结果如下图所示:
土木水电学院 3S实验室 肖泽云
QQ:289700062 第 3 页 共 38 页 Email:xwebsite@163.com
2、切换地图
如果发布的一个系统中有时候需要显示矢量地图、有时候需要显示卫星图片、有时候
需要显示地形等,这就可以通过切换地图来实现。其原理为将各种需要的地图先加载到程序
中,然后根据需要来显示这些地图。
如下例子:
Streets
Topo
Imagery
运行程序,其结果如下图所示:
土木水电学院 3S实验室 肖泽云
QQ:289700062 第 5 页 共 38 页 Email:xwebsite@163.com
3、使用查询
本例中,你将学习如何使用查询工具从 ArcGIS Server 服务中查获信息。你将使用
Query, QueryTask, 和 FeatureSet去查询地图中图层并显示结果。在查询过程中一般有下
面四个步骤:
1)建立地图和图形图层 GraphicsLayer;
2)用查询过滤器建立查询任务;
3)根据用户输入信息执行查询任务,例如,通过在图上选择数据,从列表中选择一
个值,或输入一个值;
4)显示在 FeatureSet中查询返回的结果。FeatureSet是由选择数据的几何和属性数
据组成,几何对象可以在地图中高亮显示,属性数据也可以被用于移入到数据
表格
关于规范使用各类表格的通知入职表格免费下载关于主播时间做一个表格详细英语字母大小写表格下载简历表格模板下载
中或提示
信息中去。
下面的例子就是一个用户输入城市的名字来查询的任务。
1)建立图层
地图和图层用于提供查询依据和显示查询结果。图形图层 GraphicsLayer图层用于显
示查询结果,下面的例子代码表示将一个 ArcGIS Server的 tiled map地图服务和图形图层
GraphicsLayer 添加到地图中去。在图形图层中的数据将用定义为“infoSymbol1”的符号
来显示,关于这个稍后会有介绍:
该地图中主要有两个部分,第一部分就是 ArcGISTiledMapServiceLayer 图层,第二部
分就是 GraphicsLayer图层。
2)建立查询任务
这个查询任务建立在一个图层上,该图层就是将要查询的对象所在的图层。其中 URL
属性为该图层的地址,它包含图层所在的 ID,如下该图层的 ID 号就是 0,即 Map 中的第
一个图层。
Query用于定义查询的准则,真正的过滤器是由 text属性来设置的。使用的字段就
是在 map 文档中显示的属性字段。你可以在服务目录中设置来决定图层的显示字段。由于
我们这里要返回查询的结果,所以设置属性"returnGeometry"为 true。
在本例中,一系列的输出字段包含在 esri:outFields 标记中。当你使用这些输出
字段时,你需要指定哪些是查询要用到的字段。指定字段越少,查询反映越快。你应该使用
真实的字段名称而不是别名(别名可以在结果中使用)。
CITY_NAME
STATE_NAME
土木水电学院 3S实验室 肖泽云
QQ:289700062 第 6 页 共 38 页 Email:xwebsite@163.com
3)执行查询
在应用程序中,查询是基于用户的输入信息来执行的。在本例中通过在一个面板中的
一个 text input来输入需要查询的城市的名称,添加一个按钮去执行查询。该按钮的 click
事件将调用 doQuery()方法,该方法的第一个参数就是我们先前定义的查询准则,第二个
参数就是异步响应(asynchronous responder)。这个响应通过设置回应函数 onResult()
和 onFault()来处理查询是否成功或失败,这两个函数将在后面具体来定义。
在
中添加 doQuery()函数:
private function doQuery():void
{
queryTask.execute(query, new AsyncResponder(onResult,
onFault));
}
4)显示查询结果
显示查询结果除了为查询的图形结果设置符号,还将该图形添加到图形图层中。这个
符号可以直接通过图形图层来表现,所有添加到该图层中的图形都将用这种符号来表示。
你可能还记得前面我们添加图形图层( graphics layer)时我们使用的符号
"infoSymbol1",下面将定义这个符号(符号定义用 esri:InfoSymbol)。InfoSymbol 有一个
infoRenderer标记用于定义任何去渲染(符号化)。在下面的例子中,"data.CITY_NAME"
和"data.STATE_NAME"都是我们之前在查询中设定的输出字段。
本例中用于渲染(infoRenderer)的组件 Component 包含一个 VBox 容器,该容器
能实现 IDataRenderer.
下面来定义回应函数 onResult(),其中一个参数就是 FeatureSet对象,用于包含查
询的结果,FeatureSet中的数据能被直接分配给图形图层的 graphicProvider 去在 Map
中渲染。
如果返回错误信息,则用警告窗体来显示错误。
private function doQuery():void
{
queryTask.execute(query, new AsyncResponder( onResult,
土木水电学院 3S实验室 肖泽云
QQ:289700062 第 7 页 共 38 页 Email:xwebsite@163.com
onFault));
function onResult(featureSet:FeatureSet, token:Object =
null):void
{
myGraphicsLayer.graphicProvider =
featureSet.features;
}
function onFault(info:Object, token:Object = null):void
{
Alert.show(info.toString());
}
}
整个程序代码如下:
土木水电学院 3S实验室 肖泽云
QQ:289700062 第 8 页 共 38 页 Email:xwebsite@163.com
CITY_NAME
STATE_NAME
土木水电学院 3S实验室 肖泽云
QQ:289700062 第 9 页 共 38 页 Email:xwebsite@163.com
4、使用地图范围
本例中将介绍多种方式来设置地图的范围。在你初始化地图时,如果不包含任何地图
范围信息,将使用默认的地图范围,即在保存地图文档时的地图范围。如果使用多个图层或
者服务,默认的范围就是基本地图的初始范围或者添加的第一个图层的范围。
1)任何设置一个范围
设置一个初始范围和默认范围不同,需要用到 extent属性或者 Extent类。
设置地图的初始范围用 extent属性:
(1)添加地图;
(2)插入标记,并定义其 ID属性和制定坐标系;
(3)添加标记。设置 Map的范围属性 extent
为前面定义的 Extent。
如下代码:
设置地图的初始范围用 Extent类:
(1)添加地图;
(2)添加标记,并指定坐标系的 id和 wkid;
(3)插入标记并指定 ID和坐标系;
(4)添加标记。
注:坐标系的 wkid参考网址:
投影坐标系可以参考
http://resources.esri.com/help/9.3/arcgisserver/apis/rest/pcs.html
地理坐标系可以参考
http://resources.esri.com/help/9.3/arcgisserver/apis/rest/gcs.html
如下代码:
上面介绍的是两种设置地图范围的不同方式。第一种是通过在外部定义 Extent 类,
设置 Map 的 extent 属性为外部定义的 Extent 类来实现;第二种方式是在 Map 标记内添加
extent标记,在标记内添加 Extent类来实现的。
2)使用多个服务时任何设置范围
在很多情况下,需要使用一个图层的范围,但是这个图层又不是初始图层或基础地图。
为了达到这个目的,设置地图的范围为这个图层的范围。在下面的例子中,将使用两个图层,
基础图层是 ArcGIS Online上的世界地图,第二个图层是 Kansas州的图层。
为了设置 Kansas州的为地图的显示范围,需要添加一个 load属性。
load="{myMap.extent=myKansasLayer.fullExtent}"
下面的代码就是利用 Kansas州的范围来设置地图的显示范围:
注:如果你想使用地图(Kansas 州)的初始范围来设置地图当前的显示范围,使用
myKansasLayer.initialExtent即可,如下:
3)任何获取当前地图的范围
返回当前地图的范围直接使用 extent属性即可。
如下例子:
在地图切换时要求保证地图的显示范围仍然不变。
4)如何监听地图范围的变化
每次在移动或缩放地图时地图都将发出一个 ExtentEvent 事件。你可以通过 mxml 或
ActionScript来添加一个事件监听器来告知地图范围的变化。
在 MXML中使用监听,如下例子通过设置 extentChange属性的事件:
土木水电学院 3S实验室 肖泽云
QQ:289700062 第 12 页 共 38 页 Email:xwebsite@163.com
在 ActionScript中使用监听,如下例:
myMap.addEventListener(ExtentEvent.EXTENT_CHANGE, extentChangeHandler);
其中 extentChangeHandler为地图范围变化时定义的处理函数。
如下面的例子:
土木水电学院 3S实验室 肖泽云
QQ:289700062 第 13 页 共 38 页 Email:xwebsite@163.com
5、使用图形
1)使用图形
GraphicsLayer 图层可以在地图上覆盖图形。这些图形可以使用户做的标记或者输入
任务。例如,程序可能以图形的形式将查询的结果添加到地图上。
一个图形包括:
(1)几何对象——几何对象决定图形在哪里,是点、线还是面;
(2)符号——符号决定图形如何显示;
(3)属性——用于描述图形。如果你创建图形,就需要指定属性。Query.outFields
就是一个限制任务返回属性的一个例子。
图形并不是要具有什么所有的要求,没有一项是必须的。例如,很多任务返回结果的
图形对象都在 FeatureSet中,这些图形只具有几何对象和属性。如果你想添加一个图形到
地图中,你就必须为它们定义一个符号。
如果你写代码运行用户在地图中绘制图形,绘图工具(Draw)会使你的工作更加方便。
绘图工具是一个类,可以帮助你捕捉用于在屏幕上绘制的几何图形。你然后需要定义一个符
号,然后把它应用到新的图形对象中去。drawing toolbar例子演示了这一工作
流程
快递问题件怎么处理流程河南自建厂房流程下载关于规范招聘需求审批流程制作流程表下载邮件下载流程设计
。
如 果 你 的 任 务 返 回 一 个 FeatureSet , 你 可 以 获 取 一 个 图 形 数 组
(FeatureSet.features),然后就可以指定到GraphicsLayer图层的graphicProvider中去。
下面的代码就是展示如何处理从查询任务中返回的结果。
private function doQuery():void
{
queryTask.execute(query, new AsyncResponder(onResult, onFault));
function onResult(featureSet:FeatureSet, token:Object = null):void
{
myGraphicsLayer.graphicProvider = featureSet.features;
}
function onFault(info:Object, token:Object = null):void
{
Alert.show( info.toString() );
}
}
定义图形图层和符号:
在上一例中使用的符号是 InfoSymbol,在此使用的是 SimpleMarkerSymbol,查询结
果将以红色的圆圈表示。
在其他不提供 feature set作为结果的任务中提供几何对象,你可以用来创建图形。
例如,一个地标查询任务中查找一个地址,这个位置是一个点几何对象,你就可以用这个几
何对象来创建一个图形来显示这个地址在哪里,如下代码:
for each (var candidate:AddressCandidate in candidates)
{
if (candidate.score > 80) {
var myGraphic:Graphic = new Graphic();
myGraphic.geometry = candidate.location;
土木水电学院 3S实验室 肖泽云
QQ:289700062 第 14 页 共 38 页 Email:xwebsite@163.com
myGraphic.symbol = mySymbol;
myGraphic.attributes = { address: candidate.address,score:
candidate.score, locatorName: candidate.attributes.Loc_name };
myGraphicsLayer.add(myGraphic);
}
}
2)使用符号
用于渲染图形可用的符号主要有: SimpleMarkerSymbol, SimpleLineSymbol,
SimpleFillSymbol, PictureMarkerSymbol, PictureFillSymbol, InfoSymbol,
CartographicLineSymbol 和 CompositeSymbol。参看相关的例子学习如何使用不同的符号。
(1)Infosymbol 和 infoRenderer
Infosymbol 是一个很小的窗体,包含地图中一个点数据的信息。和 nfoWindows 不同
的是,在地图中可以同时显示多个 Infosymbol。
InfoSymbol具有两个属性,infoPlacement和 infoRenderer。infoPlacement属性决
定符号的位置,参考 InfoPlacement类查询其可用的属性。infoRenderer属性是 IFactory
的一种类型,它包含用户界面的定义以及显示出的信息。一旦创建 InfoSymbol,它就能指
定给一个图形对象,类似于 MarkerSymbol。
(2)定义内部 infoRenderer
你可以在内部定义 infoRenderer。其步骤如下:
①插入 InfoSymbol和 infoRenderer标记;
②在标记内定义用户界面控件(即显示出来的界面),这些都是
InfoSymbol的内容;
③如果需要,在外部使用 outerDocument来包含变量或方法。