cl991036
管理员
管理员
  • 注册日期2003-07-25
  • 发帖数5917
  • QQ14265545
  • 铜币29669枚
  • 威望217点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
  • GIS帝国铁杆
70楼#
发布于:2006-07-11 14:17
<P>不错的贴</P>
<P>加精华</P>
没钱又丑,农村户口。头可断,发型一定不能乱。 邮箱:gisempire@qq.com
举报 回复(0) 喜欢(0)     评分
zhpzh1
路人甲
路人甲
  • 注册日期2004-03-12
  • 发帖数45
  • QQ
  • 铜币399枚
  • 威望0点
  • 贡献值0点
  • 银元0个
71楼#
发布于:2006-07-11 11:56
AE开发编辑功能
<P align=center><B>数据编辑问题</B><B>
<br></B>
<p>
<P>在<FONT face="Times New Roman">AE</FONT>中数据的编辑是一个重点,也是一个难点。它包括的东西非常多,如:地物的添加,地物的修改,地物查询,节点捕捉,地物的符号化等一系列的问题。熟练的使用地物编辑的功能,是开发一个系统必须具备的条件。数据编辑问题解决得好坏直接决定着软件是否操作方便。在这我只是写一些相应的功能函数,至于软件开发中的架构,我不考虑。
<p>
<p>
<P><B><FONT face="Times New Roman">1、 </FONT></B><B>添加地物</B><B>
<p></B>
<p>
<P>什么是地物,这是<FONT face="Times New Roman"> GIS</FONT>的基本概念,我在这不想多说,我只想说明一点,地物可以表现在地图上,如房子、铁路、水管等等。我们把房子的总称称为一个地物类,在<FONT face="Times New Roman">AE</FONT>中对应一个地物类(<FONT face="Times New Roman">IFeatureClass</FONT>),一个地物类在地图上表示为一个地物层(<FONT face="Times New Roman">IFeatureLayer</FONT>),单独的一栋房子或一条管道我们称为地物(<FONT face="Times New Roman">IFeature</FONT>),<FONT face="Times New Roman">Arcgis</FONT>中一类地物只能放在一个层,通过图层的叠加组成一幅地图。
<p>
<p>
<P>熟悉面向对象的编程语言的人都知道,其实上边的地物类,地物的概念就是类和实体的概念。房子、铁路、水管等是一类地物的抽象,而具体的某一房子就是对象了。大家了解了这一点。接下来的开发就容易理解一些了。当然,还有一些其他的概念也必须了解一下:如长事务、短事务、编辑空间等。请大家查找一些相关资料,了解这方面的内容。
<p>
<p>
<P>我们先开始最基本的编辑功能:添加点线面的操作。它包括输入添加点线面和通过鼠标拖动添加点线面。下边讨论一下添加点线面的基本的实现方法:
<p>
<p>
<P><FONT face="Times New Roman">一、</FONT><B>添加点</B><B>
<p></B>
<p>
<P>我们可以有多种方法添加点,但基本的思路一样,只是有少量的接口有变化。下边是通过<FONT face="Times New Roman">FeatrueClass</FONT>的<FONT face="Times New Roman">CreateFeature</FONT>()函数添加地物。
<p>
<p>
<P align=left>public void AddPointByStore()
<p>
<p>
<P align=left>      {
<p>
<p>
<P align=left>              //得到要添加地物的图层
<p>
<p>
<P align=left>              IFeatureLayer l = MapCtr.Map.get_Layer(0) as IFeatureLayer;
<p>
<p>
<P align=left>              //定义一个地物类,把要编辑的图层转化为定义的地物类
<p>
<p>
<P align=left>              IFeatureClass fc = l.FeatureClass ;
<p>
<p>
<P align=left>              //先定义一个编辑的工作空间,然后把转化为数据集,最后转化为编辑工作空间,
<p>
<p>
<P align=left>              IWorkspaceEdit w = (fc as IDataset).Workspace as IWorkspaceEdit;
<p>
<p>
<P align=left>              IFeature f ;
<p>
<p>
<P align=left>              IPoint p;
<p>
<p>
<P align=left>              //开始事务操作
<p>
<p>
<P align=left>              w.StartEditing (false);
<p>
<p>
<P align=left>              //开始编辑
<p>
<p>
<P align=left>              w.StartEditOperation() ;
<p>
<p>
<P align=left>              for (int i = 0 ; i< 100 ; i++ )
<p>
<p>
<P align=left>              {
<p>
<p>
<P align=left>                   //创建一个地物
<p>
<p>
<P align=left>                   f= fc.CreateFeature();
<p>
<p>
<P align=left>                   p = new PointClass();
<p>
<p>
<P align=left>                   //设置点的坐标
<p>
<p>
<P align=left>                   p.PutCoords (i,i);
<p>
<p>
<P align=left>                   //确定图形类型
<p>
<p>
<P align=left>                   f.Shape = p;
<p>
<p>
<P align=left>                   //保存地物
<p>
<p>
<P align=left>                   f.Store();    
<p>
<p>
<P align=left>              }
<p>
<p>
<P align=left>              //结束编辑
<p>
<p>
<P align=left>              w.StopEditOperation();
<p>
<p>
<P align=left>              //结束事务操作
<p>
<p>
<P align=left>              w.StopEditing(true);
<p>
<p>
<P align=left>}
<p>
<p>
<P>上边的代码能添加点地物,但不能作为最终的代码使用,细心的人会看到。这段代码只是把第一层加进来,然后在第一层上边添加点地物,如果第一层不是点层,该怎么办,那就要判断了。怎么判断我们以后再说。通过上边的代码,我们已经清楚地了解到,编辑地物的基本框架,这也是我们所说的事务,如果想操作能返回和重做,就必须把代码写在<FONT face="Times New Roman">IWorkspaceEdit</FONT>的<FONT face="Times New Roman">StartEditing()</FONT>和<FONT face="Times New Roman">StopEditing()</FONT>函数之间,把相关的操作写在<FONT face="Times New Roman">IWorkspaceEdit</FONT>的<FONT face="Times New Roman">StartEditOperation()</FONT>和<FONT face="Times New Roman">StopEditOperation()</FONT>之间。并且操作是利用<FONT face="Times New Roman">IWorkspaceEdit</FONT>接口完成的,所以要仔细理会<FONT face="Times New Roman">IWorkspaceEdit</FONT>接口的用处,如何工作空间都可以转化为<FONT face="Times New Roman">IWorkspaceEdit</FONT>的对象,当转化为<FONT face="Times New Roman">IWorkspaceEdit</FONT>定义的对象后,我们定义一个<FONT face="Times New Roman">IFeature</FONT>的对象,然后利用<FONT face="Times New Roman">IFeatureClass</FONT>的<FONT face="Times New Roman">CreateFeature()</FONT>函数创建一个地物,并赋值给定义的<FONT face="Times New Roman">IFeature</FONT>对象。接着设置<FONT face="Times New Roman">IFeature</FONT>对象的一些属性,如:坐标值,坐标系,地物类型等,最后是调用<FONT face="Times New Roman">IFeature</FONT>对象的<FONT face="Times New Roman">Store()</FONT>保存添加的地物。
<p>
<p>
<P>上边的方法可以添加点地物,接着看看下边的代码。看有什么不同:
<p>
<p>
<P align=left>public void AddPointByWrite()
<p>
<p>
<P align=left>     {
<p>
<p>
<P align=left>         IFeatureLayer l = MapCtr.Map.get_Layer(0) as IFeatureLayer;
<p>
<p>
<P align=left>         IFeatureClass fc = l.FeatureClass ;
<p>
<p>
<P align=left>         IFeatureClassWrite fr = fc as IFeatureClassWrite ;
<p>
<p>
<P align=left>         IWorkspaceEdit w = (fc as IDataset).Workspace as IWorkspaceEdit;
<p>
<p>
<P align=left>         IFeature f ;  
<p>
<p>
<P align=left>         IPoint p;
<p>
<p>
<P align=left>         w.StartEditing (true);
<p>
<p>
<P align=left>         w.StartEditOperation() ;
<p>
<p>
<P align=left>         for (int i = 0 ; i< 100 ; i++ )
<p>
<p>
<P align=left>         {
<p>
<p>
<P align=left>              f= fc.CreateFeature();
<p>
<p>
<P align=left>              p = new PointClass();
<p>
<p>
<P align=left>              p.PutCoords (i,i);
<p>
<p>
<P align=left>              f.Shape = p;
<p>
<p>
<P align=left>              fr.WriteFeature (f);
<p>
<p>
<P align=left>         }
<p>
<p>
<P align=left>              w.StopEditOperation();
<p>
<p>
<P align=left>              w.StopEditing(true);
<p>
<p>
<P align=left>     }
<p>
<p>
<P>代码中用红色标记的两行就是不同的代码,其实他就是保存方式的不同而已。在这利用了<FONT face="Times New Roman">IFeatureClassWrite </FONT>接口来保存数据。再看看下边的代码:
<p>
<p>
<P align=left>         public void AddPointByBuffer()
<p>
<p>
<P align=left>         {
<p>
<p>
<P align=left>              IFeatureLayer l = MapCtr.Map.get_Layer(0) as IFeatureLayer;
<p>
<p>
<P align=left>              IFeatureClass fc = l.FeatureClass ;
<p>
<p>
<P align=left>              IWorkspaceEdit w = (fc as IDataset).Workspace as IWorkspaceEdit;
<p>
<p>
<P align=left>              w.StartEditing (true);
<p>
<p>
<P align=left>              w.StartEditOperation() ;
<p>
<p>
<P align=left>              IPoint p;
<p>
<p>
<P align=left>              IFeatureBuffer f;
<p>
<p>
<P align=left>              IFeatureCursor cur = fc.Insert(true);
<p>
<p>
<P align=left>              for (int i = 0 ; i< 100 ; i++ )
<p>
<p>
<P align=left>              {
<p>
<p>
<P align=left>                   f= fc.CreateFeatureBuffer();
<p>
<p>
<P align=left>                   p = new PointClass();
<p>
<p>
<P align=left>                   p.PutCoords (i,i);
<p>
<p>
<P align=left>                   f.Shape = p;
<p>
<p>
<P align=left>                   cur.InsertFeature (f);
<p>
<p>
<P align=left>              }
<p>
<p>
<P align=left>              w.StopEditOperation();
<p>
<p>
<P align=left>              w.StopEditing(true);
<p>
<p>
<P>     }<FONT face="Times New Roman">
<p></FONT>
<p>
<P>其实不同的地方就两句代码,红色表示的。在这没有再定义地物接口了(<FONT face="Times New Roman">IFeature</FONT>),而是使用<FONT face="Times New Roman">IFeatureBuffer </FONT>接口,保存的时候是使用<FONT face="Times New Roman">InsertFeature()</FONT>保存,这对大数据量处理的非常有好处。他是先把要添加的保存到缓冲区里。最后一次性保存。<FONT face="Times New Roman">
<p></FONT>
<p>
<P><FONT face="Times New Roman">二、</FONT><B>添加线</B><B>
<p></B>
<p>
<P>添加线的方法跟添加点一样,不同的只是地物类型不一样而已,我把代码贴出来,大家跟添加点的方式进行对比。这样便于记忆。也有利于理解。
<p>
<p>
<P align=left>     public void AddLineByWrite()
<p>
<p>
<P align=left>     {
<p>
<p>
<P align=left>         IFeatureLayer l = MapCtr.Map.get_Layer(0) as IFeatureLayer;
<p>
<p>
<P align=left>         IFeatureClass fc = l.FeatureClass ;
<p>
<p>
<P align=left>         IFeatureClassWrite fr = fc as IFeatureClassWrite ;
<p>
<p>
<P align=left>         IWorkspaceEdit w = (fc as IDataset).Workspace as IWorkspaceEdit;
<p>
<p>
<P align=left>         IFeature f ;  
<p>
<p>
<P align=left>//可选参数的设置
<p>
<p>
<P align=left>object Missing = Type.Missing;
<p>
<p>
<P align=left>         IPoint p=new PointClass();
<p>
<p>
<P align=left>         w.StartEditing (true);
<p>
<p>
<P align=left>         w.StartEditOperation() ;
<p>
<p>
<P align=left>         for (int i = 0 ; i< 100 ; i++ )
<p>
<p>
<P align=left>         {
<p>
<p>
<P align=left>              f = fc.CreateFeature();
<p>
<p>
<P align=left>              //定义一个多义线对象
<p>
<p>
<P align=left>              IPolyline PlyLine=new PolylineClass();
<p>
<p>
<P align=left>              //定义一个点的集合
<p>
<p>
<P align=left>              IPointCollection ptclo = PlyLine as IPointCollection;
<p>
<p>
<P align=left>              //定义一系列要添加到多义线上的点对象,并赋初始值
<p>
<p>
<P align=left>              for(int j=0;j<4;j++)
<p>
<p>
<P align=left>              {  
<p>
<p>
<P align=left>                   p.PutCoords(j,j);
<p>
<p>
<P align=left>                   ptclo.AddPoint(p,ref Missing,ref Missing);
<p>
<p>
<P align=left>              }
<p>
<p>
<P align=left>                   f.Shape = PlyLine;
<p>
<p>
<P align=left>                   fr.WriteFeature (f);
<p>
<p>
<P align=left>         }
<p>
<p>
<P align=left>              w.StopEditOperation();
<p>
<p>
<P align=left>              w.StopEditing(true);
<p>
<p>
<P>}
<p>
<p>
<P>至于添加线的其他两种方法,通过修改添加点的代码,就可以得到。可以自己想想然后测试,这样便于记忆和理解。
<p>
<p>
<P><B></B> </P>
[此贴子已经被作者于2009-6-3 18:00:37编辑过]
举报 回复(0) 喜欢(0)     评分
上一页 下一页
游客

返回顶部