ArcGIS.Server.9.3和ArcGIS API for Flex在MapTips显示饼图数据统计(九)
目的:
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等。具体代码如下:
4.接下来需要用esri:InfoSymbol来实现mapTip,代码如下:
6.完成上面的工作后,接下来要做的就是在地图上显示MapTip了,这里就去部分的California的Cities的点图层数据了,在<mx:Application 添加mx:initialize用来实现初始化载入MapTip的显示,具体代码和说明如下:
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。
2

3

4

5

6

7

8

9

10

11

12

13

14

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方法定义。
2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

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控件的使用。
2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44
