flex的draw绘制接口以及3个第二方的绘图api,至于集团的施用是C/S架构

作者:Jack47

GIS技术调换QQ群:4325120玖三

在B/S基本一统天下的年份里,PC的计算技艺也在时时刻刻的进步,微软着力达成了每家都有管理器的愿意,可是当下的盖茨猜测没有想到,现在各类家庭的Computer,大概都产生了一个上网聊天看资源音讯的工具,可以运用Computer本身总结本事的选用,就只剩余了精彩纷呈的娱乐了。这就像和盖茨当年的愿望有一点点背离啊,猜度盖茨同学当年的壮志是让每台Computer去承担些更宏伟更有意义的做事!

应接关切自身的微信公众账号技师杰克,两边的稿子会一齐,也能够增多作者的RSS订阅源

图片 1

B/S的时日意味着,只要有个能够联网到互联网的终点,无论终端的计量技艺怎么着,哪怕是无盘职业站,都得以特别轻易的拓展各类运算,管理长短不一的事体。月月红户端最特出的使用莫过于银行和杂货店的顶峰(但是笔者不懂开垦,未有考证此类应用属于哪一种结构)。

Storm安全性

固有设计Storm时,完全未有把安全性考虑在内
前些天平安性能相关的成效在一步步加进去
Storm 0.玖.x本子上的安全主题素材:

  1. 不曾表明机制(authentication),未有授权机制(authorization)
  2. 传输的数码(举个例子worker之间)未有加密
  3. ZooKeeper上囤积的多寡未有访问限制
  4. 壹经Nimbus的Thrift端口未有锁住,放肆的用户代码都足以在节点上举行

越多Storm安全性方面包车型大巴建议见这里

题外话:
在触及Storm之后,有个难题在自家的脑英里升起,国内的大商厦,譬如Baidu,Ali,腾讯,都以有出生Storm那类实时总结框架的土壤的,可是为何未有做出来啊?

Apache Storm Basic
Training

Fault
tolerance

Storm in pictures

Storm 0.9 Basic
Training


壹旦你看了本篇博客,认为对您具备收获,请点击右下角的“推荐”,让更五个人收看!

捐助Jack四七写作,打赏三个鸡蛋灌饼钱吗

图片 2

微信打赏

图片 3

支付宝打赏

三.影子结果函数,总括周长和面积等新闻

当小编在一台配置为两颗4核CPU和1陆G内部存款和储蓄器的DELL
2950服务器上,用基于微软的Hyper—V 二零一零Server的五个虚拟机搭建集团测试情形的时候,有时会回想20年前自个儿的大学生活,想起那时候上Computer课的现象。那时的微管理器课象平日的高数和马列没多大分别,基本都是先生在讲台上讲天书,不是Basic语言,正是Fortran。唯1的异样是好久会有排上三遍上机课,我用过的最早的微型Computer是紫金Ⅱ,壹种只好运营Basic语言的机器,程序都以用打孔机打在纸带上;再后来的好像正是终端了,1台VAX两千的主机,连接多台终端,终端好像只有键盘和显示器。小编以为从情理硬件上的话,那时的终点成为长春花户端更为形象,瘦的唯有键盘和显示屏了!到了毕业设计的时候,终于用上了IBM
PC,内存为640K的管理器,教授的28陆被当做宝物,唯有协调极其相信的博士才给用。其实笔者实在想不出那时会有什么的服务器端的利用,只是纪念大家的老教师好像用Fortran编写了1个拍卖实验结果的次序,多数的温度传感器连接在①段火箭引擎的固体燃料上,开火焚烧后先后搜聚数据并生成二个点火模型,说是在的,那些程序就像是固体燃料点火时间长度达几10米的火花发出的啸叫,同样让自家感动不已。

Master结点(Master node)

在遍布式系统中,调解服务极度关键,它的安插,会直接涉及到系统的运营功用,错误复苏(fail
over),故障检查测试(error detection)和程度扩张(scale)的技能。

集群上任务(task)的调节由3个Master节点来担任。那台机器上运营的Nimbus进程担任职分的调整。其余1个历程是Storm
UI,可以界面上查看集群和全体的拓扑的运营状态。

一.响应绘制的轩然大波,要激活draw工具:

到了windows
NT的宣布,微软才总算进入了网络时期,当Windows九伍深透替代了DOS系统,使得PC有了自然的测算技巧时,各样桌面包车型大巴选用如雨后鞭笋。印象中910时期前期最火的是由Dbase演化而来的FoxBase,各类基于FOXBASE的数码管理程序如财务等,风靡不常。记得本人曾在九叁年时用了10天的年月看完了DbaseⅢ编制程序1书,然后用力20天的业余时间,写了三个拍卖生产报表的次第,并从此想通了从前在母校总也学不会的Basic和Fortran语言,然后再不学编制程序语言。其时的采用,多数集中在管理特定的作业上,运维在三个个的IBM
PC上,或者此刻的应用,称得上胖客户端,因为平昔就不存在劳动器端。

Storm的容错(Fault Tolerance)机制

正如“搭建1个Storm集群”一文介绍的同样,必须用工具如daemontools或者monit来监督Nimbus和Supervisor的后台进程。那样只要Nimbus或者Supervisor进度挂掉,会被daemontools检查测试到,并开始展览重启。

NimbusSupervisor进程被规划成高速失利(fail
fast)的(当境遇特别的动静,进程就能挂掉)并且是无状态的(状态都保存在Zookeeper恐怕在磁盘上)。

最要紧的是,worker进程不会因为Nimbus或者Supervisor挂掉而受影响。那跟Hadoop是分歧等的,当JobTracker挂掉,全部的天职都会没了。

  1. 当Nimbus挂掉会怎么样?

    尽管Nimbus是以引入的秘诀处于进程拘押(譬如通过supervisord)之下,那它会被重启,不会有其余影响

    否则当Nimbus挂掉后:

    • 曾经存在的拓扑能够接二连三健康运维,但是不能够交付新拓扑
    • 正在运行的worker进度仍旧能够一而再做事。而且当worker挂掉,supervisor会一向重启worker。
    • 退步的职务不会被分配到别的机器(是Nimbus的任务)上了
  2. 当三个Supervisor(slave节点)挂掉会怎么着?

    1旦Supervisor是以引入的点子处于进度禁锢(比方通过(supervisord)[supervisord.org/])之下,这它会被重启,不会有任何影响

    不然当Supervisor挂掉:
    分配到那台机械的持有职分(task)会晚点,Nimbus会把那几个职分(task)重新分配给别的机器。

  3. 当三个worker挂掉会如何?

    当几个worker挂掉,supervisor会重启它。假若开发银行一贯战败那么此时worker也就不可能和Nimbus保持心跳了,Nimbus会重新分配worker到其余机器

  4. Nimbus算是3个单点故障吗?
    若是Nimbus节点挂掉,worker进程依然可以持续做事。而且当worker挂掉,supervisor会一贯重启worker。不过,未有了Nimbus,当供给的时候(假诺worker机器挂掉了)worker就不能被重新分配到别的机器了。
    所以答案是,Nimbus在“某种程度”上属于单点故障的。在其实中,这种气象没什么大不断的,因为当Nimbus进度挂掉,不会有悲凉的思想政治工作爆发

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <geometryservice>http://localhost:6080/arcgis/rest/services/Utilities/Geometry/GeometryServer</geometryservice>
    <spatialref>4326</spatialref>
    <distanceunit>千米</distanceunit>      
    <areaunit>平方公里</areaunit>  
    <showMeasurements>显示测量结果</showMeasurements>    
    <perimeter>周长:</perimeter> 
    <arealabel>面积:</arealabel>

</configuration>

在大家老祖宗留下的具有遗产中,最让自家慕名的是那充满灵性的什么的太极八卦图。黑白的阴阳鱼,完美的组成3个园,代表着万事万物的阴阳轮回。

各节点的成效

假定你熟习Hadoop的话,可以如此做一下类比:

Hadoop Storm
JobTracker Nimbus(只有一个)
TaskTracker Supervisor(有很多个)
MapReduce任务 Topology

能够见见Nimbus是调治器,WorkerTask的容器,Task是天职的确实施行者。

WebGIS三次开荒培养和磨练入门群: 238339408

上篇随笔中,作者说了部分谈得来对微软智能客户端的眼光,只是自个儿对集团应用发展进度的掌握。至于公司的运用是C/S框架结构,依然B/S架构,还是要看使用的场景,只不过在互联网技艺快捷发展在此以前,C/S架构是利用的主流,而到网络时代,B/S架构替代C/S架构成为主流,已经是不争的事实。其实历史就像一个巡回,进入2010,恐怕大家会发觉,大家又将跻身3个新的时代了!

初步拓扑

为了在集群上运维二个拓扑,需求首先把代码打包成3个“胖jar包”–必须带有全体的借助代码,除了Storm它自己,因为Storm集群会提供。然后在一台设置了storm命令行的机器上通过storm jar一声令下来交给拓扑:

storm jar my-topology-version-with-dependency.jar com.corp.MyTopology arg1 arg2

那些命令会连到Nimbus,上传jar包。接下来Nimbus会把拓扑的代码运送到多台不相同的机器或然JVM上。唯有当拓扑在机器上布署成功了还要在JVM中起首化了后头,能力真正开头拍卖新闻。

图片 4

乘势技巧的开垦进取,新闻化的须求也尤其高,最标准的供给是财务的电算化。财务系统的纷纭决定了简便易行的客户端的选择无法化解全数的主题材料,由此需求运算技能更加高的硬件,于是有了服务器,于是有了B/S架构的运用。大旨的拍卖放在服务器端实行,部分的测算还在客户端。当时硬件的总结能力,决定了C/S架构的使用,是能够最合理施用计算财富的最优的化解方案,服务器端和客户端都负担相应的计量工作,在品质上也是一种平衡。

架构

先上一张Storm的架构图,假如理解GFS和Hadoop的框架结构,会意识那几个种类的架构图都很类似。
图片 5

Storm架构图

简单的说的叙述一下思路好了

网络的高速发展,使得聚焦总计和汇总积存成为一种主流的必要,应为这种办法能够最大限度的降落客户的完全具备资金财产,
而且服务器硬件技能和存款和储蓄本事也在此时期高速的提升,也为凭借B/S架构的采用提供了物理的保障,于是才有了蜂拥而至的IDC,提供五颜六色的空间租用和接通服务,在让更加多的人感受新闻爆炸的还要,也等于公布,集团应用正式进入了B/S的时代,同期也发布了斗雪红户端时期的到来。

转发请保留小编和原来的小说出处

二.制图完事后的告竣事件,获取geometry等消息,分别剖断是属于哪一类类型(点、线、面等等),然后调换graphic,增多在地图上出示出来

先说说笔者对四季蔷薇户端的了然。

ZooKeeper

  1. 引入精心设计过的机械,因为ZooKeeper是Storm的瓶颈
    • 每一种机器使用二个ZK的实例
    • 在意因为同样台机械上的任何进度只怕虚拟机他们是共享那台机器的,所以恐怕会影响ZK的质量(来源)
  2. I/O是ZooKeeper的瓶颈
  • 把ZooKeeper的积累放到本身的磁盘上
  • 应用SSD会显然跳级质量
  • 常规意况下,Zookeeper的每一趟写操作都会同步到磁盘,那就形成了三次磁盘寻址操作(一次是数量,三次是数量的日志)。当有着的worker都发心跳给ZooKeeper时,恐怕会明白影响属性(来源)。
    • 内需监控ZooKeeper节点的I/O负载
  1. 引入在生养情况上运转的ZooKooper集群有起码3个节点,那样即便有多个ZooKeeper服务器挂掉了(比如举办保证),也是能够的。
            //集成后的标会响应函数            
            private function activateDrawTool(event:MouseEvent):void
            {
                    this.drawToolbar.deactivate();
                    graphicsLayer.visible=true;                        
                    selectedDrawingIcon =BorderImage(event.currentTarget);
                    clearSelectionFilter();
                    selectedDrawingIcon.filters = [ glowFilter ];

                    finishDrawing = false;
                    showMeasurements = false;
                    drawType = selectedDrawingIcon.name;    

                    borVisibleChange(selectedDrawingIcon.id);

                    switch (drawType)
                    {

                        case DrawTool.POLYLINE:
                        {
                            addingPlot=false;                        
                            drawingPolygon = false;
                            drawingLine = true;
                            showMeasurements = true;

                            outlineColorId.visible=false;
                            outlineColor.visible=false;

                            drawStatus = drawLineLabel;

                            this.drawtool.deactivate();    
                            setMapAction(drawType, drawStatus, lineSymbol, drawEnd);
                            break;
                        }
                        case DrawTool.FREEHAND_POLYLINE:
                        {
                            addingPlot=drawingPolygon =false;                            
                            drawingLine=showMeasurements = true;

                            outlineColorId.visible=false;
                            outlineColor.visible=false;                    

                            drawStatus = drawFreehandLineLabel;

                            this.drawtool.deactivate();    
                            setMapAction(drawType, drawStatus, lineSymbol, drawEnd);
                            break;
                        }                            
                        case DrawTool.POLYGON:
                        {
                            addingPlot=    drawingLine = false;
                            drawingPolygon = showMeasurements = true;        

                            outlineColorId.visible=true;
                            outlineColor.visible=true;

                            drawStatus = drawPolygonLabel;

                            this.drawtool.deactivate();    
                            setMapAction(drawType, drawStatus, fillSymbol, drawEnd);                            
                            break;
                        }
                        case DrawTool.EXTENT:
                        {
                            addingPlot=    drawingLine = false;
                            drawingPolygon = showMeasurements = true;        

                            outlineColorId.visible=true;
                            outlineColor.visible=true;

                            drawStatus = drawExtentLabel;

                            this.drawtool.deactivate();    
                            setMapAction(drawType, drawStatus, fillSymbol, drawEnd);                            
                            break;
                        }
                        case DrawTool.CIRCLE:
                        {
                            addingPlot=    drawingLine = false;
                            drawingPolygon = showMeasurements = true;        

                            outlineColorId.visible=true;
                            outlineColor.visible=true;

                            drawStatus = drawCircleLabel;

                            this.drawtool.deactivate();    
                            setMapAction(drawType, drawStatus, fillSymbol, drawEnd);                            
                            break;
                        }
                        case DrawTool.FREEHAND_POLYGON:
                        {
                            addingPlot= drawingLine = false;
                            drawingPolygon =showMeasurements = true;

                            outlineColorId.visible=true;
                            outlineColor.visible=true;

                            drawStatus = drawFreehandPolygonLabel;

                            this.drawtool.deactivate();    
                            setMapAction(drawType, drawStatus, fillSymbol, drawEnd);
                            break;
                        }    
                        case DrawTool.MAPPOINT:
                        {    
                            this.addingPlot=drawingPolygon =drawingLine = showMeasurements = false;                        
                            this.addingText=true;
                            drawStatus = drawMapPointLabel;            

                            outlineColorId.visible=true;
                            outlineColor.visible=true;

                            this.drawtool.deactivate();                            
                            setMapAction(drawType,drawStatus,null,drawEnd);                        
                            break;
                        }
                        default:
                        {
                            //响应态势标会
                            drawingPolygon =drawingLine = showMeasurements = false;                        
                            this.addingPlot=true;    

                            outlineColorId.visible=true;
                            outlineColor.visible=true;

                            this.setMapAction(null,null,null,null);
                            var outline:SimpleLineSymbol=new SimpleLineSymbol("solid", this.outlineColor.selectedColor, this.customAlpha.value, 1);                
                            drawtool.fillSymbol=new SimpleFillSymbol("solid", this.fillColor.selectedColor, customAlpha.value, outline);        

                            this.drawtool.activate(drawType);    


                        }


                    }

            }

万事万物都以三个循环往复,当斗雪红户端发展到00年份的早先时期,多量的客户端能源被弃置,于是才会有网格总结之类的主张。大切诺基IA称得上富网络选择,在小编眼里是月季户端的矫枉过正,是B/S架商谈C/S架构融入的开头。进入2008年间,微软的Widows七已经宣布,Silverlight也到了第伍版的Beta,在微软具有的产品中,任何3个成品都并未有Silverlight那样的开支进程。基于一样底层的Silverlight和WPF的便捷的前行,用客户端的才干将Web突显的更是美妙绝伦,我们也不禁的尾随微软的步伐,跨入了多少个福特ExplorerIA的有时,也许几年未来,以至是现行反革命,大家再也不用琢磨你的选用是B/S框架结构,照旧C/S架构,统统都称为帕杰罗IA吧。

从节点(Slave node)

Storm集群上有三个从节点,他们从Nimbus上下载拓扑的代码,然后去真正实践。Slave上的Supervisor进程是用来监督和管制实际上运作职业代码的经过。在Storm
0.九自此,又多了七个进度Logviewer,可以用Storm
UI来查看Slave节点上的log文件。
在配备文件storm.yaml中,决定了1台机器上运维几个worker:

supervisor.slots.ports:
- 6700
- 6701
- 6702

分界面效果:

硬件供给

            private function drawEnd(event:DrawEvent):void
            {

                finishDrawing = true;
                this.drawtool.deactivate();
                this.setMapAction(null,null,null,null);

                selectedDrawingIcon = null;
                clearSelectionFilter();
                event.target.deactivate();
                var outSR:SpatialReference = new SpatialReference(102113);
                var geom:Geometry = event.graphic.geometry;

                lastDrawGraphic = new Graphic(geom);            

                if(addingPlot==true)
                {

                    var outline:SimpleLineSymbol=new SimpleLineSymbol("solid", this.outlineColor.selectedColor, this.customAlpha.value, 1);                
                    lastDrawGraphic.symbol=new SimpleFillSymbol("solid", this.fillColor.selectedColor, customAlpha.value, outline);        
                    this.drawtool.deactivate();

                }                
                else
                {                
                    switch (geom.type)
                    {
                        /*   case Geometry.MAPPOINT:
                        {
                            //文本标会就是对点的symbol进行了修改
                            if (txtLabel.text == "")
                                return;
                            var text:String=txtLabel.text;
                            var color:uint=cpText.selectedColor;
                            var font:String=textFont.selectedItem.font;
                            var size:Number=numTextSize.value;
                            var textFormat:TextFormat=new TextFormat(font, size, color, bold.selected, italic.selected, underline.selected);                            
                            var textSymbol:TextSymbol=new TextSymbol(text);
                            textSymbol.textFormat=textFormat;                             
                            lastDrawGraphic.symbol=textSymbol;     
                            break;

                        }   */
                        case Geometry.POLYLINE:
                        {
                            lastDrawGraphic.symbol = new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID, fillColor.selectedColor, customAlpha.value, 6);
                            if (chkMeasurements.selected)
                            {
                                var param:ProjectParameters=new ProjectParameters();
                                param.geometries=[geom];
                                param.outSpatialReference=outSR;
                                geometryService.project(param);
                                var polyline:Polyline = geom as Polyline;
                                measurePt = polyline.extent.center;
                            }
                            break;
                        }
                        case Geometry.POLYGON:
                        {

                                lastDrawGraphic.symbol = new SimpleFillSymbol(SimpleFillSymbol.STYLE_SOLID, fillColor.selectedColor, customAlpha.value, new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID, outlineColor.selectedColor, 1, 2));
                                if (chkMeasurements.selected)
                                {
                                    var param:ProjectParameters=new ProjectParameters();
                                    param.geometries=[geom];
                                    param.outSpatialReference=outSR;
                                    geometryService.project(param);
                                    var polygon:Polygon = geom as Polygon;
                                    measurePt = polygon.extent.center;
                                }
                                break;


                        }
                        case Geometry.EXTENT:
                        {
                            lastDrawGraphic.symbol = new SimpleFillSymbol(SimpleFillSymbol.STYLE_SOLID, fillColor.selectedColor, customAlpha.value, new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID, outlineColor.selectedColor, 1, 2));
                            if (chkMeasurements.selected)
                            {
                                var param:ProjectParameters=new ProjectParameters();
                                param.geometries=[geom];
                                param.outSpatialReference=outSR;
                                geometryService.project(param);
                                var extent:Extent = geom as Extent;
                                measurePt = extent.center;
                            }
                            break;
                        }
                    }
                }

                //添加删除要素监听事件
                lastDrawGraphic.addEventListener(MouseEvent.CLICK, onGraphicClick);

                graphicsLayer.add(lastDrawGraphic);                 
                onePlanGraphics.addItem(lastDrawGraphic);
                savePlanBtn.enabled=true;            

            }    

ZooKeeper的作用

ZooKeeper在Storm上不是用来做新闻传输用的,而是用来提供和谐服务(coordination
service),相同的时候积累拓扑的地方和总结数据。

  • ZooKeeper也正是一块黑板,SupervisorNimbus和worker都在地点留下约定好的音讯。举个例子Supervisor启动时,会在ZooKeeper上注册,Nimbus就能够发掘SupervisorSupervisor在ZooKeeper上留下心跳新闻,Nimbus透过这个心跳新闻来对Supervisor进展健康检查评定,检验出坏节点
  • 是因为Storm组件(component)的气象音讯囤积在ZooKeeper上,所以Storm组件就足以无状态,能够kill -九来杀死
    • 举例:Supervisors/Nimbus的重启不影响正在运维中的拓扑,因为状态都在ZooKeeper上,从ZooKeeper上又一次加载一下就好了
  • 用来做心跳
    • Worker通过ZooKeeper把孩子executor的地方以心跳的情势汇报给Nimbus
    • Supervisor过程经过ZK把本身的景色也以心跳的样式反映给Nimbua
  • 积累近日职责的不当情形(拓扑停止时会删除)

源代码目录如下:

本文是Storm连串之一,主要介绍Storm的架构划设想计,推荐读者在翻阅Storm介绍(一)的底子之上,阅读这一篇。本文只是小编的读书笔记,偏重于浅档案的次序的框架结构介绍,倘诺想真正领悟里面设计时候的度量,还供给越来越多的去阅读Storm源码。

NewPlotWidget.xml:配置总括周长和面积的单位消息等等

知晓Storm的架构,有助于帮忙大家知晓大型遍及式系统设计中须求消除的主题素材,以及缓慢解决难题的思绪,支持大家越来越好的开始展览Storm性能调优化。

            //使用GeometryService计算距离和面积等响应
            private function projectCompleteHandler(event:GeometryServiceEvent):void
            {
                var geom:Geometry = (event.result as Array)[0];
                var lengthsParameters:LengthsParameters = new LengthsParameters();
                var areasAndLengthsParameters:AreasAndLengthsParameters = new AreasAndLengthsParameters();
                switch (geom.type)
                {
                    case Geometry.POLYLINE:
                    {
                        var pLine:Polyline = Polyline(geom);
                        lengthsParameters.geodesic = true;
                        lengthsParameters.polylines = [ pLine ];
                        geometryService.lengths(lengthsParameters);
                        break;
                    }
                    case Geometry.POLYGON:
                    {
                        var pGon:Polygon = Polygon(geom);
                        areasAndLengthsParameters.polygons = [ pGon ];
                        geometryService.areasAndLengths(areasAndLengthsParameters);
                        break;
                    }
                    case Geometry.EXTENT:
                    {
                        var extent:Extent = Extent(geom);

                        // convert it to a polygon for measurment
                        const arrPoints:Array = [
                            new MapPoint(extent.xmin, extent.ymin),
                            new MapPoint(extent.xmin, extent.ymax),
                            new MapPoint(extent.xmax, extent.ymax),
                            new MapPoint(extent.xmax, extent.ymin),
                            new MapPoint(extent.xmin, extent.ymin)
                        ];

                        var polygon:Polygon = new Polygon();
                        polygon.addRing(arrPoints);
                        polygon.spatialReference = extent.spatialReference;

                        areasAndLengthsParameters.polygons = [ polygon ];
                        geometryService.areasAndLengths(areasAndLengthsParameters);
                        break;
                    }
                }
            }

            private function arealengthsCompleteHandler(event:GeometryServiceEvent):void
            {
                var area:Number = event.result.areas[0]; //event.arealengths.areas[0];
                var length:Number = event.result.lengths[0]; // or (event.result as Array)[0]; //event.arealengths.lengths[0];

                var label:String = "面积:" + numFormatter.format(area/1000000) + "平方千米";
                label += "\n" + "周长:" + numFormatter.format(length/1000) + "千米";
                addDrawLabel(label, lastDrawGraphic);
            }

            private function lengthsCompleteHandler(event:GeometryServiceEvent):void
            {
                var length:Number = (event.result as Array)[0];

                var label:String = "距离:" + numFormatter.format(length/1000) + "千米";
                addDrawLabel(label, lastDrawGraphic);
            }

config.xml文件的配备如下:

        <widget label="态势标绘" icon="assetsimpact_area_over.png"
            config="widgets/esri/NewPlot/NewPlotWidget.xml" url="widgets/esri/NewPlot/NewPlotWidget.swf" />

NewPlotWidget.mxml:

备注:

大抵的笔触如下:利用arcgis api  for
flex的draw绘制接口以及一个第一方的绘图api
PlotAPI4flex,来绘制各个箭头以及多方形、圆形等图形,文本和图表的绘图用的是arcgis
api。

相关文章