arcgis api for flex之专题图制作(饼状图,柱状图等)

最近公司给我一个任务,就是利用arcgis api for flex实现在地图上点(业务数据)直接显示饼状图以及柱状图的专题图制作,而不是通过点击点显示气泡窗口的形式来实现,这个公司已经实现了。
经过一段时间的摸索,参照一些网上资源,目前大概弄出来了,里面还有待完善的地方的。
效果图如下:


  (1)Chart.mxml,主要的展示地图专题图效果的页面 

<pre><?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:esri="http://www.esri.com/2008/ags"
pageTitle="Charts in infowindow" xmlns:symbols="com.esri.ags.symbols.*">
<fx:Style>
.chartStyle
{
borderThickness: 0;
infoPlacement: center;
backgroundAlpha: 0;
infoOffsetX: 0;
infoOffsetY: 0;
paddingLeft: 0;
paddingRight: 0;
paddingTop: 0;
paddingBottom: 0;
}
</fx:Style>
<fx:Script>
<![CDATA[
import com.esri.ags.geometry.MapPoint;
import com.esri.ags.FeatureSet;
import com.esri.ags.Graphic;
import com.esri.ags.events.MapEvent;

import
com.esri.ags.tasks.QueryTask;

import
com.esri.ags.tasks.supportClasses.Query;

import
mx.collections.ArrayCollection;

import
mx.controls.Alert;

import
mx.events.FlexEvent;

import
mx.rpc.AsyncResponder;

protected
function
myMap_initializeHandler(event:MapEvent):
void

{

var
pie:MapPoint =
new
MapPoint(
113.55185
,
22.82289
);

var
column:MapPoint =
new
MapPoint(
113.59637985600011
,
22.758225999000047
);

var
bar:MapPoint =
new
MapPoint(
113.52757794
,
22.84012158
);

var
gpie:Graphic =
new
Graphic(pie);

var
gcolumn:Graphic =
new
Graphic(column);

var
gbar:Graphic =
new
Graphic(bar);

//g.attributes = new Object();

var
thematic:ArrayCollection =
new
ArrayCollection(

[

{ Name:
"危化品1"
, Rate:
25
},

{ Name:
"危化品2"
, Rate:
15
},

{ Name:
"危化品3"
, Rate:
23
}

]);

//g.attributes.thematic = thematic;

gpie.attributes = thematic;

gcolumn.attributes = thematic;

gbar.attributes = thematic;

this
.myGraphicsLayerpie.add(gpie);

this
.myGraphicsLayercolumn.add(gcolumn);

this
.myGraphicsLayerbar.add(gbar);

}

]]>

</fx:Script>

<fx:Declarations>

<esri:InfoSymbol id=
"infoSymbolpie"
infoRenderer=
"InfoRendererPieChart"
containerStyleName=
"chartStyle"

</esri:InfoSymbol>

<esri:InfoSymbol id=
"infoSymbolcolumn"
infoRenderer=
"InfoRendererColumnChart"
containerStyleName=
"chartStyle"

</esri:InfoSymbol>

<esri:InfoSymbol id=
"infoSymbolbar"
infoRenderer=
"InfoRendererBarChart"
containerStyleName=
"chartStylee"

</esri:InfoSymbol>

</fx:Declarations>

<esri:Map id=
"myMap"
load=
"myMap_initializeHandler(event)"

<esri:extent>

<esri:Extent xmin=
"113.284171273203"
ymin=
"22.6348519473499"
xmax=
"113.774816132605"
ymax=
"22.9103935318251"

<esri:spatialReference>

<esri:SpatialReference wkid=
"4326"
/>

</esri:spatialReference>

</esri:Extent>

</esri:extent>

<esri:ArcGISTiledMapServiceLayer url=
"http://localhost:6080/ArcGIS/rest/services/ns_new/MapServer"
/>

<esri:GraphicsLayer id=
"myGraphicsLayercolumn"
symbol=
"{infoSymbolcolumn}"

</esri:GraphicsLayer>

<esri:GraphicsLayer id=
"myGraphicsLayerpie"
symbol=
"{infoSymbolpie}"

</esri:GraphicsLayer>

<esri:GraphicsLayer id=
"myGraphicsLayerbar"
symbol=
"{infoSymbolbar}"

</esri:GraphicsLayer>

</esri:Map>

</s:Application>
</pre>
(2)InfoRendererBarChart.mxml、InfoRendererColumnChart.mxml、InfoRendererPieChart.mxml,分别是柱状图以及饼状图实现的页面

1.InfoRendererBarChart.mxml
<pre><?xml version=
"1.0"
encoding=
"utf-8"
?>

<s:VGroup xmlns:fx=
"http://ns.adobe.com/mxml/2009"

xmlns:s=
"library://ns.adobe.com/flex/spark"

xmlns:mx=
"library://ns.adobe.com/flex/mx"

clipAndEnableScrolling=
"true"

creationComplete=
"creationCompleteHandler()"

implements

"mx.core.IDataRenderer"
width=
"100"
height=
"100"

<fx:Script>

<![CDATA[

private
var
_data:
Object
;

[Bindable]

// implement IDataRenderer

public
function
get
data():
Object

{

return
_data;

}

public
function
set
data(value:
Object
):
void

{

_data = value;

}

private
function
creationCompleteHandler():
void

{

}

]]>

</fx:Script>

<mx:BarChart id=
"columnChart"
width=
"100%"
height=
"100%"

dataProvider=
"{data}"

showDataTips=
"true"

<mx:series>

<mx:BarSeries id=
"barSeries"
xField=
"Rate"
/>

</mx:series>

<mx:verticalAxis>

<mx:CategoryAxis id=
"barAxis"
categoryField=
"Name"
/>

</mx:verticalAxis>

<mx:verticalAxisRenderers>

<mx:AxisRenderer axis=
"{barAxis}"
showLabels=
"false"
/>

</mx:verticalAxisRenderers>

</mx:BarChart>

</s:VGroup>
</pre>
2.InfoRendererColumnChart.mxml 
<pre>
<?xml version=
"1.0"
encoding=
"utf-8"
?>

<s:VGroup xmlns:fx=
"http://ns.adobe.com/mxml/2009"

xmlns:s=
"library://ns.adobe.com/flex/spark"

xmlns:mx=
"library://ns.adobe.com/flex/mx"

clipAndEnableScrolling=
"true"

creationComplete=
"creationCompleteHandler()"

implements

"mx.core.IDataRenderer"
width=
"100"
height=
"100"

<fx:Script>

<![CDATA[

private
var
_data:
Object
;

[Bindable]

// implement IDataRenderer

public
function
get
data():
Object

{

return
_data;

}

public
function
set
data(value:
Object
):
void

{

_data = value;

}

private
function
creationCompleteHandler():
void

{

}

]]>

</fx:Script>

<mx:ColumnChart id=
"columnChart"
width=
"100%"
height=
"100%"

dataProvider=
"{data}"

showDataTips=
"true"

<mx:series>

<mx:ColumnSeries id=
"columnSeries"
yField=
"Rate"
/>

</mx:series>

<mx:horizontalAxis>

<mx:CategoryAxis id=
"columnAxis"
categoryField=
"Name"
/>

</mx:horizontalAxis>

<mx:horizontalAxisRenderers>

<mx:AxisRenderer axis=
"{columnAxis}"
showLabels=
"false"
/>

</mx:horizontalAxisRenderers>

</mx:ColumnChart>

</s:VGroup>
</pre>
3.InfoRendererPieChart.mxml
<pre>
<?xml version=
"1.0"
encoding=
"utf-8"
?>

<s:VGroup xmlns:fx=
"http://ns.adobe.com/mxml/2009"

xmlns:s=
"library://ns.adobe.com/flex/spark"

xmlns:mx=
"library://ns.adobe.com/flex/mx"

clipAndEnableScrolling=
"true"

creationComplete=
"creationCompleteHandler()"

implements

"mx.core.IDataRenderer"
width=
"100"
height=
"100"

<fx:Script>

<![CDATA[

private
var
_data:
Object
;

[Bindable]

// implement IDataRenderer

public
function
get
data():
Object

{

return
_data;

}

public
function
set
data(value:
Object
):
void

{

_data = value;

}

private
function
creationCompleteHandler():
void

{

}

]]>

</fx:Script>

<mx:PieChart id=
"pieChart"

width=
"100%"
height=
"100%"

dataProvider=
"{data}"

showDataTips=
"true"

<mx:series>

<mx:PieSeries field=
"Rate"

labelPosition=
"callout"

nameField=
"Name"

</mx:PieSeries>

</mx:series>

</mx:PieChart>

</s:VGroup>
</pre>
上述的总体实现思路是这样的:核心是InfoSymbol,InfoSymbol自定义infoRenderer绑定专题图的模版,比如InfoRendererBarChart.mxml、InfoRendererColumnChart.mxml、InfoRendererPieChart.mxml;程序初始化的时候生成了一些带有统计信息的Graphic添加到地图上,这些Graphic对象的attributes属性集合来保存各个统计的对象,每个统计的对象包含两个字段:Name表示危化品名称,Rate表示占有比重,下面我们会在InfoSymbol的定义中再次看到这两个字段。当定义好这些Graphic对象以后,我们就可以把它们添加到设置了InfoSymbol符号的GraphicLayer上了。在InfoSymbol的定义中,我们可以看到,在这个InfoSymbol中添加了一个饼图组件PieChart,这个饼图的dataProvider属性绑定的是{data},它代表的其实就是Graphic对象的attributes属性。你可以简单地这样认为:InfoSymbol中的data代表的就是其对应的Graphic对象的attributes属性。其他的柱状图也是同理的。

  既然在InfoSymbol中可以获得Graphic的属性信息,那么根据Graphic的属性信息来绘制不同的专题图就是水到渠成的事情了。

  样式代码解析:   

<pre>
.chartStyle

{

borderThickness:
0
;
/显示专题图的边框宽度/

infoPlacement: center;
/显示专题图的位置,这里是中心/

backgroundAlpha:
0
;
/显示专题图的背景透明度,这里设置为0,是为了隐藏背景/

infoOffsetX:
0
;
/显示专题图的X偏移,设置0,不然会偏离原始点位置/

infoOffsetY:
0
;
/显示专题图的Y偏移,设置0,不然会偏离原始点位置/

paddingLeft:
0
;
/显示专题图的位置偏移,设置0,不然会偏离原始点位置/

paddingRight:
0
;
/显示专题图的位置偏移,设置0,不然会偏离原始点位置/

paddingTop:
0
;
/显示专题图的位置偏移,设置0,不然会偏离原始点位置/

paddingBottom:
0
;
/显示专题图的位置偏移,设置0,不然会偏离原始点位置/

}
</pre>
需要完善优化之处:目前GraphicsLayer定义了三个(pie,bar,column),然后各自绑定不同的infoSymbol(pie,bar,column)。这样显的有点冗余了,其实只要定义一个GraphicsLayer,然后动态的判断绑定的是哪个infoSymbol。

GIS之家新博客系列发布更新在GIS之家网站,欢迎关注收藏:GIS之家网站
GIS之家作品:GIS之家
GIS之家交流咨询:咨询模式

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容

  • afinalAfinal是一个android的ioc,orm框架 https://github.com/yangf...
    passiontim阅读 15,392评论 2 45
  • # Python 资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列...
    aimaile阅读 26,436评论 6 428
  • 本篇以 arcgis api 4.x for js 版本系列为测试用例,其实 arcgis api 3.x for...
    gis之家阅读 4,078评论 0 14
  • 这几天,有些睡不好。总是在白天想多努力一些,也总在闲暇时刻,悠悠,总在晚上,安静的发下呆,总在一些时候,不想睡去,...
    双瑞瑞阅读 256评论 3 2
  • 秋天,一向是个不甚有个性的季节,仿似从夏天忽的一下就凉了下来,所以人们也常说,天凉好个秋。 虽说天是一天凉似一...
    一尾T阅读 333评论 0 0