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

时间: 2024-09-29 04:34:34

ArcGIS API for Silverlight 编辑Geometry的相关文章

ArcGIS API for Silverlight 实现修改地图上的工程点位置

原文:ArcGIS API for Silverlight 实现修改地图上的工程点位置 #region 处理工程点点击编辑相关事件 public Graphic editgraphics = null; //待编辑的Graphics图层 public Graphic oldgraphics = null; //原先Graphics图层 public Symbol symbolold = null; /// <summary> /// 在地图上点击编辑点处理事件 /// </summary

ArcGIS API for Silverlight开发入门准备

原文:ArcGIS API for Silverlight开发入门准备 微软的Silverlight提供了跨浏览器和跨平台开发环境,在Web中可用于创建和展现富互联网应用(RIA,Rich Internet Application). ArcGIS API for Silverlight 能够让的Silverlight应用程序具有集成ArcGIS Server.ESRI MapIt和Bing Maps服务的能力.利用 ArcGIS Server 和Bing Maps资源,比如说Maps.Loca

使用ArcGIS API for Silverlight 进行复合多条件空间查询

原文:使用ArcGIS API for Silverlight 进行复合多条件空间查询 这两天帮网上认识的一个兄弟做了一个查询的示例,多多少少总结一下,在此和大家分享. 为什么说是复合多条件呢?因为进行空间查询有时候我们查询的条件会很复杂,比如要求某一要素的某一属性大于多少,且小于多少,且又不等于多少等等.而在官网给出的例子中并没有关于复合查询的说明.不过查看API后,你会发现一句很重要的话: A where clause for the query. Any legal SQL where c

ArcGIS API for Silverlight 点沿着线流动

原文:ArcGIS API for Silverlight 点沿着线流动 概述 前段时间做了一个项目,要求是有一些电力输送线,电力输送线或者石油管道都是有流动方向的,用户想做一个动态效果来模拟电力的输送.其实做简单了只要在线上标识个箭头就可以了.但也要是做成动态的,至少ArcEngine实现起来是有点麻烦的.但ArcGIS API for Silverlight可以解决这个问题. 实现思路 在地图上展示输送电力的线和模拟电力输送方向的电都是ArcGIS  API中定义的对象,否者这些数据在地图上

ArcGIS API for Silverlight中加载Google地形图(瓦片图)

原文:ArcGIS API for Silverlight中加载Google地形图(瓦片图) 在做水利.气象.土地等行业中,若能使用到Google的地形图那是再合适不过了,下面就介绍如何在ArcGIS API for Silverlight中加载Google地 形图.先上一个图,初步制作,待后续继续改进 ArcGIS API for Silverlight 中的ArcGISTiledMapServiceLayer图层,继承自TiledMapServiceLayer.如果想实现自己的缓存地图图 层

ArcGIS API for Silverlight 调用GP服务加载等值线图层

原文:ArcGIS API for Silverlight 调用GP服务加载等值线图层 第二篇.Silverlight客户端调用GP服务 利用ArcGIS API for Silverlight实现GP服务调用,这里的雨量数据是通过一个WebService获取而来,主要信息是雨量站点的经纬度坐标值和某个时间段内的降雨量值三个主要字段. 以下是核心代码部分: <UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/pr

ArcGIS API for Silverlight 之ElementLayer使用及TextSymbol的模板使用

原文:ArcGIS API for Silverlight 之ElementLayer使用及TextSymbol的模板使用 在开发中动态在地图上添加文字信息,可以使用TextSymbol添加文字 //动态添加文本 TextSymbol textSymbol = new TextSymbol() { FontFamily = new System.Windows.Media.FontFamily("Microsoft YaHei"), Foreground = new System.Wi

使用ArcGIS API for Silverlight实现地形坡度在线分析

原文:使用ArcGIS API for Silverlight实现地形坡度在线分析 苦逼的研究生课程终于在今天结束了,也许从今以后再也不会坐在大学的课堂上正式的听老师讲课了,接下来的时间就得开始找工作了.....前段时间一直比较忙,上课,考试,论文,以及联系实习单位...现在就差实习还没有着落了. 前些天帮一网友做了个在线坡度分析的例子,大概的功能就是勾选任意的地形区域,然后实现Web端的地形坡度分析和可视化显示,效果图如下: 实现的基本思路大致分为以下三部分: 1.在ArcMap中建立坡度求解

使用ArcGIS API for Silverlight + Visifire绘制地图统计图

原文:使用ArcGIS API for Silverlight + Visifire绘制地图统计图 最近把很久之前做的统计图又拿出来重新做了一遍,感觉很多时候不复习,不记录就真的忘了,时间是最好的稀释剂,真是这样. 恰好有些网友又向我问起,于是稍作记录,以便自己今后复习和参考. 本文示例用的版本为: Silverlight 5+Visifire 3.6.8+ArcGIS API for Silverlight 3.0+Visual Studio 2010 一.ArcGIS API For Sil