arcgis api for flex之專題圖制作(餅狀圖,柱狀圖等)

最近公司給我一個(gè)任務(wù),就是利用arcgis api for flex實(shí)現(xiàn)在地圖上點(diǎn)(業(yè)務(wù)數(shù)據(jù))直接顯示餅狀圖以及柱狀圖的專題圖制作,而不是通過(guò)點(diǎn)擊點(diǎn)顯示氣泡窗口的形式來(lái)實(shí)現(xiàn),這個(gè)公司已經(jīng)實(shí)現(xiàn)了。
經(jīng)過(guò)一段時(shí)間的摸索,參照一些網(wǎng)上資源,目前大概弄出來(lái)了,里面還有待完善的地方的。
效果圖如下:


  (1)Chart.mxml,主要的展示地圖專題圖效果的頁(yè)面 

<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:
"?;?"
, Rate:
25
},

{ Name:
"?;?"
, 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,分別是柱狀圖以及餅狀圖實(shí)現(xiàn)的頁(yè)面

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>
上述的總體實(shí)現(xiàn)思路是這樣的:核心是InfoSymbol,InfoSymbol自定義infoRenderer綁定專題圖的模版,比如InfoRendererBarChart.mxml、InfoRendererColumnChart.mxml、InfoRendererPieChart.mxml;程序初始化的時(shí)候生成了一些帶有統(tǒng)計(jì)信息的Graphic添加到地圖上,這些Graphic對(duì)象的attributes屬性集合來(lái)保存各個(gè)統(tǒng)計(jì)的對(duì)象,每個(gè)統(tǒng)計(jì)的對(duì)象包含兩個(gè)字段:Name表示?;访Q,Rate表示占有比重,下面我們會(huì)在InfoSymbol的定義中再次看到這兩個(gè)字段。當(dāng)定義好這些Graphic對(duì)象以后,我們就可以把它們添加到設(shè)置了InfoSymbol符號(hào)的GraphicLayer上了。在InfoSymbol的定義中,我們可以看到,在這個(gè)InfoSymbol中添加了一個(gè)餅圖組件PieChart,這個(gè)餅圖的dataProvider屬性綁定的是{data},它代表的其實(shí)就是Graphic對(duì)象的attributes屬性。你可以簡(jiǎn)單地這樣認(rèn)為:InfoSymbol中的data代表的就是其對(duì)應(yīng)的Graphic對(duì)象的attributes屬性。其他的柱狀圖也是同理的。

  既然在InfoSymbol中可以獲得Graphic的屬性信息,那么根據(jù)Graphic的屬性信息來(lái)繪制不同的專題圖就是水到渠成的事情了。

  樣式代碼解析:   

<pre>
.chartStyle

{

borderThickness:
0
;
/顯示專題圖的邊框?qū)挾?/em>/

infoPlacement: center;
/顯示專題圖的位置,這里是中心/

backgroundAlpha:
0
;
/顯示專題圖的背景透明度,這里設(shè)置為0,是為了隱藏背景/

infoOffsetX:
0
;
/顯示專題圖的X偏移,設(shè)置0,不然會(huì)偏離原始點(diǎn)位置/

infoOffsetY:
0
;
/顯示專題圖的Y偏移,設(shè)置0,不然會(huì)偏離原始點(diǎn)位置/

paddingLeft:
0
;
/顯示專題圖的位置偏移,設(shè)置0,不然會(huì)偏離原始點(diǎn)位置/

paddingRight:
0
;
/顯示專題圖的位置偏移,設(shè)置0,不然會(huì)偏離原始點(diǎn)位置/

paddingTop:
0
;
/顯示專題圖的位置偏移,設(shè)置0,不然會(huì)偏離原始點(diǎn)位置/

paddingBottom:
0
;
/顯示專題圖的位置偏移,設(shè)置0,不然會(huì)偏離原始點(diǎn)位置/

}
</pre>
需要完善優(yōu)化之處:目前GraphicsLayer定義了三個(gè)(pie,bar,column),然后各自綁定不同的infoSymbol(pie,bar,column)。這樣顯的有點(diǎn)冗余了,其實(shí)只要定義一個(gè)GraphicsLayer,然后動(dòng)態(tài)的判斷綁定的是哪個(gè)infoSymbol。

GIS之家新博客系列發(fā)布更新在GIS之家網(wǎng)站,歡迎關(guān)注收藏:GIS之家網(wǎng)站
GIS之家作品:GIS之家
GIS之家交流咨詢:咨詢模式

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • afinalAfinal是一個(gè)android的ioc,orm框架 https://github.com/yangf...
    passiontim閱讀 15,891評(píng)論 2 45
  • # Python 資源大全中文版 我想很多程序員應(yīng)該記得 GitHub 上有一個(gè) Awesome - XXX 系列...
    aimaile閱讀 26,840評(píng)論 6 427
  • 本篇以 arcgis api 4.x for js 版本系列為測(cè)試用例,其實(shí) arcgis api 3.x for...
    gis之家閱讀 4,229評(píng)論 0 14
  • 這幾天,有些睡不好。總是在白天想多努力一些,也總在閑暇時(shí)刻,悠悠,總在晚上,安靜的發(fā)下呆,總在一些時(shí)候,不想睡去,...
    雙瑞瑞閱讀 345評(píng)論 3 2
  • 秋天,一向是個(gè)不甚有個(gè)性的季節(jié),仿似從夏天忽的一下就涼了下來(lái),所以人們也常說(shuō),天涼好個(gè)秋。 雖說(shuō)天是一天涼似一...
    一尾T閱讀 470評(píng)論 0 0

友情鏈接更多精彩內(nèi)容