config.xml文件的配置如下:

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

源代码目录如下:

界面效果:

大概的思路如下:利用arcgis api  for flex的draw绘制接口以及一个第三方的绘制api PlotAPI4flex,来绘制各种箭头以及多边形、圆形等图形,文本和图片的绘制用的是arcgis api。

NewPlotWidget.xml:配置计算周长和面积的单位信息等等

<?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>

NewPlotWidget.mxml:

简单的描述一下思路好了

1.响应绘制的事件,要激活draw工具:

            //集成后的标会响应函数
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); } } }

2.绘制完之后的结束事件,获取geometry等信息,分别判断是属于哪种类型(点、线、面等等),然后转换graphic,添加在地图上展示出来

            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; }

3.投影结果函数,计算周长和面积等信息

            //使用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);
}

备注:

GIS技术交流QQ群:432512093

WebGIS二次开发培训入门群: 238339408

天津政府应急系统之GIS一张图(arcgis api for flex)讲解(十)态势标绘模块的更多相关文章

  1. 天津政府应急系统之GIS一张图(arcgis api for flex)讲解(一)GIS一张图的系统开发环境以及flexviewer框架

    系统的GIS功能实现是基于arcgis api for flex,首先附上系统的主界面图,接下来的是对主界面的模块功能详细讲解: 一.GIS环境软件安装 (1)arcgis desktop的安装,要是 ...

  2. 天津政府应急系统之GIS一张图(arcgis api for flex)讲解(八)资源搜索模块

    config.xml文件的配置如下: <widget label="资源搜索" icon="assets/images/public_impact_over.png ...

  3. 天津政府应急系统之GIS一张图(arcgis api for flex)讲解(二)鹰眼模块

    讲解GIS功能模块实现之前,先大概说一下flexviewer的核心配置文件config.xml,系统额GIS功能widget菜单布局.系统的样式.地图资源等等都是在这里配置的,这里对flexviewe ...

  4. 天津政府应急系统之GIS一张图(arcgis api for flex)解说(二)鹰眼模块

    解说GIS功能模块实现之前,先大概说一下flexviewer的核心配置文件config.xml,系统额GIS功能widget菜单布局.系统的样式.地图资源等等都是在这里配置的,这里对flexviewe ...

  5. 天津政府应急系统之GIS一张图(arcgis api for flex)讲解(十三)台风模块

    config.xml文件的配置如下: <widget label="台风" icon="assets/images/typhoon.png" config ...

  6. 天津政府应急系统之GIS一张图(arcgis api for flex)讲解(十一)路径导航模块

    config.xml文件的配置如下: <widget label="路径导航" icon="assets/images/lujingdaohang.png" ...

  7. 天津政府应急系统之GIS一张图(arcgis api for flex)讲解(六)地图搜索模块

    config.xml文件的配置如下: <widget label="地图搜索" icon="assets/images/emergency_resource_ove ...

  8. 天津政府应急系统之GIS一张图(arcgis api for flex)讲解(四)地图导航控件模块

    config.xml文件的配置如下: <widget left="10" top="50" config="widgets/Navigation ...

  9. 天津政府应急系统之GIS一张图(arcgis api for flex)讲解(三)显示地图坐标系模块

    config.xml文件的配置如下: <widget left="3" bottom="3" config="widgets/Coordinat ...

随机推荐

  1. 进程管理三大扩展工具htop

    三大进程管理监控工具 HTOP 介绍: Htop是一款运行于Linux系统监控与进程管理软件,htop提供所有进程的列表,并且使用彩色标识出处理器.swap和内存状态.用户一般可以在top无法提供详尽 ...

  2. js实现匀速运动及透明度动画

    1.html代码 <body> <div id="container"> <span id="btn"></span& ...

  3. java中动态代理实现机制

    前言: 代理模式是常用的java设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关系 ...

  4. Objective-C中的委托(代理)模式

    我个人更喜欢把委托(Delegate)模式称为代理(Proxy)模式.还是那句话,第一次接触代理模式是在Java中接触的,在Java中实现代理模式和接口是少不了的.当时学习Spring的时候用到了接口 ...

  5. 数据结构:C_链表队列的实现

    数据结构链表形式队列的实现(C语言版) 1.写在前面 队列是一种和栈相反的,遵循先进先出原则的线性表. 本代码是严蔚敏教授的数据结构书上面的伪代码的C语言实现代码. 分解代码没有包含在内的代码如下: ...

  6. css截断长文本显示

    实现 截断长文本显示处理,以前是通过后台的截取,但这种方法容易丢失数据,不利于SEO. 而通过前端css的截断,则灵活多变,可统一运用与整个网站. 这项技术主要运用了text-overflow属性,这 ...

  7. 1Z0-053 争议题目解析419

    1Z0-053 争议题目解析419 考试科目:1Z0-053 题库版本:V13.02 题库中原题为: 419.In Oracle 11g, by default which one of the fo ...

  8. 【JUC】JDK1.8源码分析之ArrayBlockingQueue(三)

    一.前言 在完成Map下的并发集合后,现在来分析ArrayBlockingQueue,ArrayBlockingQueue可以用作一个阻塞型队列,支持多任务并发操作,有了之前看源码的积累,再看Arra ...

  9. centos6搭建gitlab

    前言 原来的项目放在公网的gitlab上,处于安全考虑,在内网搭建一套,有图形界面,可以直接从外网git导入进来,使用了一下觉得挺方便,把安装流程记录下来,参考官网:https://gitlab.co ...

  10. 使用CodeDom动态生成类型

    .NET 3.5的时候加入了匿名类型这个特性,我们可以直接使用 new {name="abc"} 来直接生成一个对象.这个特性现在应用的地方很多,比如dapper的查询参数都是用匿 ...