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. 无法在“EntityFramework”已存在的情况下创建影像复制该文件的解决方案

    问题产生的原因:你项目正在生成中你就打开浏览器预览了,导致这个问题解决方案:右击重新生成项目,等生成后再打开 “/”应用程序中的服务器错误. 无法在“EntityFramework”已存在的情况下创建 ...

  2. OpenCASCADE Linear Extrusion Surface

    OpenCASCADE Linear Extrusion Surface eryar@163.com Abstract. OpenCASCADE linear extrusion surface is ...

  3. Python标准模块--linecache

    1.模块简介 linecache主要用于缓存文件内容,如果下次继续读取该文件,则不需要打开文件,直接在缓存中获取该文件内容. 2.模块使用 模块的基本方法有getline,clearcache,get ...

  4. (转)J2EE的13种核心技术

    一.JDBC(Java Database Connectivity)  JDBC API为访问不同的数据库提供了一种统一的途径,象ODBC一样,JDBC对开发者屏蔽了一些细节问题,另外,JDBC对数据 ...

  5. JS只能输入数字,数字和字母等的正则表达式

    1.只能输入英文 <input type="text" onkeyup="value=value.replace(/[^a-zA-Z]/g,'')"> ...

  6. M端总结

    最近在项目开发过程中涉及到了移动端,现在对此进行总结. 在此次M端的开发过程中,遇到了许多问题,在此进行一次总结,希望大家在以后的开发过程中能尽量规避类似的问题,提高开发效率和代码质量.一.布局1.移 ...

  7. WebGIS中兴趣点简单查询、基于Lucene分词查询的设计和实现

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.前言 兴趣点查询是指:输入框中输入地名.人名等查询信息后,地图上可 ...

  8. Oracle11g中数据的倒库和入库操作以及高版本数据导入低版本数据可能引发的问题

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.前言 在10g之前,传统的导出和导入分别使用EXP工具和IMP工具 ...

  9. 对于Fragment的一些理解

    前言 Fragment想必大家不陌生吧,在日常开发中,对于Fragment的使用也很频繁,现在主流的APP中,基本的架构也都是一个主页,然后每个Tab项用Fragment做布局,不同选项做切换,使用起 ...

  10. [Java IO]06_JSON操作

    6.1 JSON 知识背景 6.1.1 JSON 简介 JSON: JavaScript Object Notation(JavaScript 对象表示法) JSON 是存储和交换文本信息的语法.类似 ...