您的位置:首页 > 其它

ArcGIS.Server.9.3和ArcGIS API for Flex在MapTips显示饼图数据统计(九)

2013-07-22 14:12 531 查看
目的:

1.ArcGIS API for Flex实现在MapTips中显示饼图进行数据统计展示,在本例子中可以点击城市的MapTip后显示详细人口年龄段的统计饼图的功能。

准备工作:

1.在ArcGIS.Server.9.3发布一个叫California的Map Service,并且把这个Service启动起来,这次需要一些数据用来进行图表显示了,California的数据比较齐全了所以本例采用这个数据。

2.底图的话采用Esri在线数据http://server.arcgisonline.com/ArcGIS/rest/services/ESRI_StreetMap_World_2D/MapServer

完成后的效果图:



开始:

1.启动Flex Builder3新建工程以及引入1.0正式版的ArcGIS API for Flex library的开发包。

2.新建chartInfowindow.mxml页面,添加Map、ArcGISTiledMapServiceLayer、ArcGISDynamicMapServiceLayer、GraphicsLayer等。具体代码如下:

1

<esri:Extent id="myExtent" xmin="-124.162751982246" ymin="32.5782548652585" xmax="-114.589241057072" ymax="40.9473919319488" />

2

<mx:Canvas width="669" height="600" borderStyle="solid" borderThickness="3" verticalCenter="0" left="10">

3

<esri:Map id="myMap" extent="{myExtent}">

4

<esri:ArcGISTiledMapServiceLayer url="http://server.arcgisonline.com/ArcGIS/rest/services/ESRI_StreetMap_World_2D/MapServer" />

5

<esri:ArcGISDynamicMapServiceLayer url="http://jh-53a435fbc0e8/ArcGIS/rest/services/California/MapServer">

6

<esri:visibleLayers>

7

<mx:ArrayCollection>

8

<mx:Number>1</mx:Number>

9

</mx:ArrayCollection>

10

</esri:visibleLayers>

11

</esri:ArcGISDynamicMapServiceLayer>

12

<esri:GraphicsLayer id="myGraphicsLayer"/>

13

</esri:Map>

14

</mx:Canvas>

3.上面的代码以ESRI_StreetMap_World_2D的ArcGISTiledMapServiceLayer为底图。在底图上只显示California的Cities的点图层,具体看ArcGISDynamicMapServiceLayer部分的设置。添加了一个GraphicsLayer用来显示MapTip了,同时设置了以California的范围为当前底图的Extent。

4.接下来需要用esri:InfoSymbol来实现mapTip,代码如下:

1

<esri:InfoSymbol id="ifs">

2

<esri:infoRenderer>

3

<mx:Component>

4

<mx:VBox width="100%" height="100%" backgroundColor="0xEEEEEE" click="clickHandler()" rollOver="rollOverHandler()" rollOut="rollOutHandler()" >

5

<mx:Style>

6

.InfoCloseButton

7

{

8

disabledSkin: Embed(source="assets/skins.swf",symbol="Callout_closeButtonDisabledSkin");

9

downSkin: Embed(source="assets/skins.swf",symbol="Callout_closeButtonDownSkin");

10

overSkin: Embed(source="assets/skins.swf",symbol="Callout_closeButtonOverSkin");

11

upSkin: Embed(source="assets/skins.swf",symbol="Callout_closeButtonUpSkin");

12

}

13

.InfoExpandButton

14

{

15

disabledSkin: Embed(source="assets/skins.swf",symbol="Callout_expandButtonDisabledSkin");

16

downSkin: Embed(source="assets/skins.swf",symbol="Callout_expandButtonDownSkin");

17

overSkin: Embed(source="assets/skins.swf",symbol="Callout_expandButtonOverSkin");

18

upSkin: Embed(source="assets/skins.swf",symbol="Callout_expandButtonUpSkin");

19

}

20

</mx:Style>

21

<mx:Script>

22

<![CDATA[

23

import mx.collections.ArrayCollection;

24

private function clickHandler():void

25

{

26

switch(currentState )

27

{

28

case "" :

29

currentState = "TitleState";

30

break;

31

case "TitleState":

32

currentState = "DetailState";

33

break;

34

case "DetailState":

35

currentState = "TitleState";

36

break;

37

}

38

}

39

private function rollOverHandler() : void

40

{

41

if(currentState == null || currentState == "" )

42

{

43

currentState = "TitleState";

44

}

45

}

46

private function rollOutHandler() : void

47

{

48

if( currentState == "TitleState" )

49

{

50

currentState = "";

51

}

52

}

53

]]>

54

</mx:Script>

55

<mx:states>

56

<mx:State name="TitleState">

57

<!-- relativeTo相对于其添加子项的对象、position子项的位置 -->

58

<mx:AddChild relativeTo="{titleBar}" position="lastChild">

59

<mx:Label id="titleLabel" fontWeight="bold" fontSize="15" text="{data.getItemAt(0).AREANAME}"/>

60

</mx:AddChild>

61

<mx:AddChild relativeTo="{titleBar}" position="lastChild">

62

<mx:Button id="expandButton" styleName="InfoExpandButton" width="18" height="18" />

63

</mx:AddChild>

64

</mx:State>

65

<!-- basedOn属性可以设置是基于哪个State -->

66

<mx:State name="DetailState" basedOn="TitleState">

67

<mx:RemoveChild target="{expandButton}" />

68

<mx:AddChild relativeTo="{titleBar}" position="lastChild">

69

<mx:Spacer width="100%" />

70

</mx:AddChild>

71

<mx:AddChild relativeTo="{titleBar}" position="lastChild">

72

<mx:Button id="closeButton" styleName="InfoCloseButton" width="18" height="18" />

73

</mx:AddChild>

74

<mx:AddChild relativeTo="{this}">

75

<mx:PieChart id="pieChart" dataProvider="{data}" width="250" height="200" showDataTips="true">

76

<mx:series>

77

<mx:PieSeries field="VALUE" nameField="AGE" labelPosition="callout">

78

<mx:calloutStroke>

79

<mx:Stroke weight="0" color="0x000000" alpha="100"/>

80

</mx:calloutStroke>

81

<mx:radialStroke>

82

<mx:Stroke weight="0" color="#FFFFFF" alpha="20"/>

83

</mx:radialStroke>

84

<mx:stroke>

85

<mx:Stroke color="0" alpha="20" weight="2"/>

86

</mx:stroke>

87

</mx:PieSeries>

88

</mx:series>

89

</mx:PieChart>

90

</mx:AddChild>

91

<mx:AddChild>

92

<mx:Legend dataProvider="{pieChart}" direction="horizontal" horizontalGap="10" width="250" />

93

</mx:AddChild>

94

</mx:State>

95

</mx:states>

96

<!--状态切换时的动画效果 -->

97

<mx:transitions>

98

<mx:Transition fromState="*" toState="TitleState">

99

<mx:Resize target="{this}" duration="100"/>

100

</mx:Transition>

101

<mx:Transition fromState="TitleState" toState="DetailState">

102

<mx:Resize target="{this}" duration="100"/>

103

</mx:Transition>

104

<mx:Transition fromState="DetailState" toState="*">

105

<mx:Resize target="{this}" duration="100"/>

106

</mx:Transition>

107

<mx:Transition fromState="TitleState" toState="*">

108

<mx:Resize target="{this}" duration="100"/>

109

</mx:Transition>

110

</mx:transitions>

111

<mx:HBox id="titleBar" width="100%" height="100%" >

112

<mx:Image source="@Embed(source='assets/pie_chart.gif')" width="18" height="18" />

113

</mx:HBox>

114

</mx:VBox>

115

</mx:Component>

116

</esri:infoRenderer>

117

</esri:InfoSymbol>

5.上面的代码有点多了但是并不复杂了,整个代码就是定义一个id为ifs的esri:InfoSymbol,主要部分为TitleState和DetailState的2种视图状态的设置和鼠标移上去的rollOverHandler方法、鼠标移开的rollOutHandler方法、鼠标点击的clickHandler方法定义。

6.完成上面的工作后,接下来要做的就是在地图上显示MapTip了,这里就去部分的California的Cities的点图层数据了,在<mx:Application 添加mx:initialize用来实现初始化载入MapTip的显示,具体代码和说明如下:

1

<mx:initialize>

2

<![CDATA[

3

var queryTask : QueryTask = new QueryTask("http://jh-53a435fbc0e8/ArcGIS/rest/services/California/MapServer/1");

4

var query : Query = new Query();

5

//查询条件取OBJECTID大于600的;

6

query.where="OBJECTID >600";

7

//返回Geometry

8

query.returnGeometry = true;

9

//设置返回字段

10

query.outFields = ["AREANAME","AGE_UNDER5","AGE_5_17","AGE_18_21","AGE_22_29","AGE_30_39","AGE_40_49","AGE_50_64","AGE_65_UP"];

11

//进行查询

12

queryTask.execute(query, new AsyncResponder( onResult, onFault ));

13

//查询成功后执行方法

14

function onResult( featureSet : FeatureSet, token : Object = null ) : void

15

{

16

for each ( var myGraphic : Graphic in featureSet.features )

17

{

18

//设置显示的symbol

19

myGraphic.symbol = ifs;

20

//添加到GraphicsLayer中进行显示

21

myGraphicsLayer.add( myGraphic );

22

//属性数组

23

var object : ArrayCollection = new ArrayCollection

24

([

25

{AREANAME : myGraphic.attributes.AREANAME,AGE : "年龄低于5岁" , VALUE : myGraphic.attributes.AGE_UNDER5},

26

{AREANAME : myGraphic.attributes.AREANAME,AGE : "年龄5-17岁", VALUE : myGraphic.attributes.AGE_5_17},

27

{AREANAME : myGraphic.attributes.AREANAME,AGE : "年龄18-21岁",VALUE : myGraphic.attributes.AGE_18_21},

28

{AREANAME : myGraphic.attributes.AREANAME,AGE : "年龄22-29岁",VALUE : myGraphic.attributes.AGE_22_29},

29

{AREANAME : myGraphic.attributes.AREANAME,AGE : "年龄30-39岁",VALUE : myGraphic.attributes.AGE_30_39},

30

{AREANAME : myGraphic.attributes.AREANAME,AGE : "年龄40-49岁",VALUE : myGraphic.attributes.AGE_40_49},

31

{AREANAME : myGraphic.attributes.AREANAME,AGE : "年龄50-64岁",VALUE : myGraphic.attributes.AGE_50_64},

32

{AREANAME : myGraphic.attributes.AREANAME,AGE : "年龄65岁以上",VALUE : myGraphic.attributes.AGE_65_UP}

33

]);

34

//设置属性

35

myGraphic.attributes = object;

36

}

37

}

38

//查询失败后执行方法

39

function onFault( info : Object, token : Object = null ) : void

40

{

41

Alert.show(info.toString());

42

}

43

]]>

44

</mx:initialize>

7.这样就完成的功能的开发,这个例子的代码相对简单了主要的是esri:InfoSymbol的定义以及mx:PieChart控件的使用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐