ArcGIS API for Silverlight 编辑Geometry
概述
ArcMap的编辑功能是非常强大的,ArcEngine编写的CS程序也可以用到ArcMap中提供的编辑功能,那么ArcGIS API forSilverlight针对Geometry的编辑提供了哪些功能呢?
本文说的仅仅是对Geometry本身的编辑,并不涉及到编辑时的拓扑检查,编辑的数据源等。对于BS程序来说,可以方便的编辑Geometry基本上就满足大部分需求了。
ArcGIS Runtime API支持的几何体主要是点、线和面。
还有要注意的一点,假设在BS上要编辑ArcServer上公布的地图数据,在公布时要把地图的Edite功能复选框勾上。而且数据源必须通过Sde存储。
画点、线和面
事实上要把点、线和面加入到地图上并不难,难得是交互过程。至于店,在画的时候基本上没有交互过程,仅仅要捕捉Map空间的MouseDown或者MouseUp事件就可以,得到鼠标点击的位置在地图上的坐标,声明一个MapPoint几何体,初始化一个Graphic,设置MarkerSymbol,就能够了。
可是对于线和面,就必须有个交互过程,须要鼠标点击地图数次、而且还有能撤销上个节点等。还好,ArcGIS API 为我们提供Draw类,通过该类我们就能够画线(折线、自由线等)、面(多边形、矩形、圆、椭圆等)。Draw类的主要定义例如以下:
//画的几何体的类型
public DrawMode DrawMode { get; set; }
//画面时 交互的样式
public FillSymbol FillSymbol { get; set; }
//是否启用
public bool IsEnabled { get; set; }
//画线时的样式,也是画面时的边线样式
public LineSymbol LineSymbol { get; set; }
//作用的地图控件
public Map Map { get; set; } // 開始画触发的事件
public event EventHandler DrawBegin;
//画完后触发的时间,通常是双击结束
public event EventHandler<DrawEventArgs> DrawComplete;
//添加了一个节点触发的事件
public event EventHandler<VertexAddedEventArgs> VertexAdded; // 添加一个节点函数
public void AddVertex(MapPoint mp);
//完毕画操作
public void CompleteDraw();
//撤销上一节点
public void UndoLastVertex();
能够看出Draw类定义的功能还是非常丰富的,暴漏的属性、函数和事件也比較多,灵活性非常高。
DrawMode属性定义了我们要画的几何体是什么类型的,定义例如以下:
public enum DrawMode
{
None = 0,
//点(点)
Point = 1,
//折线(线)
Polyline = 2,
//多边形(面)
Polygon = 3,
//矩形(面)
Rectangle = 4,
//自由线(线)
Freehand = 5,
//箭头(面)
Arrow = 6,
//三角形(面)
Triangle = 7,
//椭圆(面)
Ellipse = 8,
//圆(面)
Circle = 9,
//仅仅包括两个点的线段(线)
LineSegment = 10,
}
以下的代码就是画线时调用的代码:
this._Draw = new Draw(this._Application.Map);//初始化一个Draw,把Map传进去
this._Draw.DrawMode = DrawMode.Polygon;//设置要画的几何体类型
this._Draw.DrawComplete += (sender, e) =>
{
this.ShowDialog(e.Geometry as Polygon);//定义画完之后要运行的操作
};
this._Draw.IsEnabled = true;//设置可用状态,此时在地图上点击操作的时候,就进入了画多边形的状态。
当中图上的边线为黑色的多边形就是画多边形产生的,在画没完毕之前,鼠标移动,上一节点和鼠标位置以及第一个节点和鼠标位置之间的连线时一直动态变化的,双击就能够完毕画多边形操作,进入我们定义的完毕之后的代码。
编辑点、线和多边形
对于点的编辑,我们全然自己能够写了,过程就是当我们在地图上选中一个点Graphic时,鼠标按下后移动,随着鼠标的移动,动态变化Graphic的geometry,这样就用动态效果了。
private void Map_MouseMove(object sender, MouseEventArgs e)
{
if (this._Application.CrruteTool == this)
{
if (this._SelectPointGraphic != null)
{
this._SelectPointGraphic.Geometry = this._Application.Map.ScreenToMap(e.GetPosition(this._Application.Map));
}
}
}
对于线和面,就比較复杂了,除了移动之外,还有添加节点、删除节点、旋转、缩放等,这些操作要都自己写代码实现,确实有些复杂,还好ArcGIS API为我们提供了EditGeometry类,使用该类就能够对线和面这种Geometry进行编辑。
EditGeometry的定义比較复杂,我们就说几个比較基本的操作。
//是否同意编辑节点
public bool EditVerticesEnabled { get; set; }
//当前是否可用
public bool IsEnabled { get; set; }
//是否须要保持纵横比
public bool MaintainAspectRatio { get; set; }
//是否同意移动
public bool MoveEnabled { get; set; }
//是否同意旋转
public bool RotateEnabled { get; set; }
//旋转时,旋转点的样式
public MarkerSymbol RotatePointSymbol { get; set; }
//缩放时,缩放框的样式
public LineSymbol ScaleBoxSymbol { get; set; }
//是否同意缩放
public bool ScaleEnabled { get; set; }
//缩放时,缩放点的样式
public MarkerSymbol ScalePointSymbol { get; set; }
//编辑节点的样式
public MarkerSymbol VertexSymbol { get; set; }
除了这些定义外,还定义了须要函数和事件,包含节点变化触发的事件、编辑完毕触发的事件等。
怎样使用EditGeometry?
1.初始化
this._EditGeometry = new EditGeometry(pApplication.Map);
this._EditGeometry.EditVerticesEnabled = true;
this._EditGeometry.RotateEnabled = true;
this._EditGeometry.MoveEnabled = true;
this._EditGeometry.GeometryEdit += new EventHandler<EditGeometry.GeometryEditEventArgs>(EditGeometry_GeometryEdit);
2.设置要编辑的Graphic,里面包括我们要编辑的Geometry
this._EditGeometry.StartEdit(e.Graphic);
3.编辑完毕后,我们要出发的逻辑函数
private void EditGeometry_GeometryEdit(object sender, EditGeometry.GeometryEditEventArgs e)
{
if (e.Action == EditGeometry.Action.EditCompleted)
{
//当线编辑完之后运行的代码
Geometry myNewGeometry = e.Graphic.Geometry;
}
}
编辑过程中会有一些交互效果,当中非常多样式都是我们自己能够设置的。
默认情况下,鼠标放在一段线上,或出现圆圈,点击能够插入一个节点。鼠标选中一个节点后,能够移动该节点。鼠标双击一个节点,能够删除该节点。操作外包框能够缩放和旋转geometry。
ArcGIS API for Silverlight 编辑Geometry的更多相关文章
- ArcGIS API for Silverlight动态标绘的实现
原文:ArcGIS API for Silverlight动态标绘的实现 1.下载2个dll文件,分别是: ArcGISPlotSilverlightAPI.dll 和 Matrix.dll 其下载地 ...
- ArcGIS API for Silverlight 实现修改地图上的工程点位置
原文:ArcGIS API for Silverlight 实现修改地图上的工程点位置 #region 处理工程点点击编辑相关事件 public Graphic editgraphics = null ...
- ArcGIS API for Silverlight开发入门准备
原文:ArcGIS API for Silverlight开发入门准备 微软的Silverlight提供了跨浏览器和跨平台开发环境,在Web中可用于创建和展现富互联网应用(RIA,Rich Inter ...
- ArcGIS API for Silverlight开发入门
你用上3G手机了吗?你可能会说,我就是喜欢用nokia1100,ABCDEFG跟我 都没关系.但你不能否认3G是一种趋势,最终我们每个人都会被包裹在3G网络中.1100也不是一成不变,没准哪天为了打击 ...
- 使用ArcGIS API for Silverlight 进行复合多条件空间查询
原文:使用ArcGIS API for Silverlight 进行复合多条件空间查询 这两天帮网上认识的一个兄弟做了一个查询的示例,多多少少总结一下,在此和大家分享. 为什么说是复合多条件呢?因为进 ...
- ArcGIS api fo silverlight学习一(silverlight加载GeoServer发布的WMS地图)
最好的学习资料ArcGIS api fo silverlight官网:http://help.arcgis.com/en/webapi/silverlight/samples/start.htm 一. ...
- ArcGIS API for Silverlight代码中使用Template模板
原文:ArcGIS API for Silverlight代码中使用Template模板 在项目开发中,会遇到点选中聚焦闪烁效果,但是因为在使用Symbol的时候,会设置一定的OffSetX和OffS ...
- ArcGIS API for Silverlight 绘制降雨路径动画
原文:ArcGIS API for Silverlight 绘制降雨路径动画 #region 降雨动画演示 2014-04-16 List<Graphic> graphics = new ...
- ArcGIS API for Silverlight 当DataGrid选中项时,地图聚焦弹出窗口,并可以播放音频文件
原文:ArcGIS API for Silverlight 当DataGrid选中项时,地图聚焦弹出窗口,并可以播放音频文件 先看效果图,然后上代码: <UserControl x:Class= ...
随机推荐
- 改变,从跨出第一步開始——记海大ITAEM团队首次IT讲座掠影
之前以前写了"行动带来力量,周三(5月7日)晚IT讲座通知",昨晚已经跨出了第一步.让我们还是看举办者骆宏的QQ空间的文字吧.尽管未能到现场助兴,但看着海大学子在不断挑战自己,进而 ...
- Java - 面向对象(object oriented)计划 详细解释
面向对象(object oriented)计划 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/24058107 程序包括 ...
- SSH深度历险记(八) 剖析SSH核心原则+Spring依赖注入的三种方式
于java发育.一类程序猿必须依靠类的其他方法,它是通常new依赖类的方法,然后调用类的实例,这样的发展问题new良好的班统一管理的例子.spring提出了依赖注入的思想,即依赖类不由程 ...
- Android使用代码消除App数据并重新启动设备
/** * 使用代码消除App数据 * 我们不寻常的清除App数据,中找到相应的App * 然后选择其清除数据.以下给出代码实现. * * 注意事项: * 1 设备须要root * 2 该演示样例中删 ...
- ocp认证考试指南第一章
数据库存储结构: 物理数据库存储结构: 必须的三类文件: 控制文件(controlFile):multiplexing the controfile 多路复用控制文件,指向其它关键文件,存储序列号和时 ...
- Spring AOP入门——概念和注意事项
AOP什么? AOP在功能方面,它是之前和之后运行一些业务逻辑,一些操作(比方记录日志.或者是推断是否有权限等),这些操作的加入.全然不耦合于原来的业务逻辑.从而对原有业务逻辑全然是透明. 也就是说. ...
- 对java中classloader使用的一点理解(转)
先简单介绍下java的classloader,网上资料很多,就说点关键的. Java 中的类加载器大致可以分成两类,一类是系统提供的,另外一类则是由 Java 应用开发人员编写的.系统提供的类加载器主 ...
- 4.mysql数据库创建,表中创建模具模板脚本,mysql_SQL99标准连接查询(恩,外部连接,全外连接,交叉连接)
mysql数据库创建,表创建模等模板脚本 -- 用root用户登录系统,运行脚本 -- 创建数据库 create database mydb61 character set utf8 ; -- ...
- 编写可维护的Javascript读书笔记
写在前面:之前硬着头皮参加了java方面的编程规范培训,收货良多,工作半年有余的时候,总算感觉到一丝丝Coding之美,以及造轮子的乐趣,以至于后面开发新功能的时候,在Coding style方面花了 ...
- Message解析流程(转)
Message的解析作为一个共同组件.对应不同格式的msg文件有不同的实现类来解析.用SAXParser. 1:Final class MessageResourceManager 在Start方 ...