这个例子专业讲解基于ArcEngine使用GP开发的过程及遇到的问题。更多GP使用方法:GP使用心得

功能需求:现在外业第一次数据(简称调绘.mdb)和第二次数据(简称检查.mdb)有重复。第二次是在第一次的基础上进行的,即如果调绘.mdb中LCA层有365个要素,检查时发现错误,就删除了11个错误,并新增了43个,共408个,检查.mdb相对于调绘.mdb实际上有354个重复,现在要将重复的删除,mdb中包括点、线、面三种类型的要素类。

软件实现:在ArcGIS里利用工具可以实现,使用按空间位置查询,找出重复的,然后删除即可;由于每个mdb中的要素图层比较多,所以可以使用批处理,批处理时填写参数可以利用Excel快速进行。但是,mdb较多,路径各不相同,图层较多,操作起不比较费时。

程序实现

1.首先确定用什么工具来实现(先在ArcGIS里做一次):利用空间位置查询选择重复的要素,开启编辑器,删除!

2.设计界面,我每写一个功能,都要把界面整理一下,因为我不想让它很丑就出去见人。这里使用DotNetBar,节省了相当多的时间。

3.因为是直接对数据库进行操作,所以首先就要遍历数据中的要素图层,一般做法是利用GP的ListFeatureClasses方法。

GP.SetEnvironmentValue("workspace", moreDBPath.Trim());
IGpEnumList pGpEnumList = GP.ListFeatureClasses("", "", "");
string strFC = pGpEnumList.Next();
while (strFC != "")
{
System.Windows.Forms.Application.DoEvents();
Console.WriteLine(strFC);
strFC = pGpEnumList.Next();
}

选择遍历数据库没有问题!

4.利用按位置选择

SelectLayerByLocation SLBL = new SelectLayerByLocation();
SLBL.in_layer = moreDB + "\\" + strFC;
SLBL.select_features = referDB + "\\" + strFC;
SLBL.overlap_type = "ARE_IDENTICAL_TO";
GPClass.Execute(SLBL); //这里使用了自定义的GPClass类,可以直接使用GPExecute

报错ERROR 000368,去官网帮助一查,竟然没有368,这是为什么?但从相邻错误信息来看,应该是哪个参数无效!

再去官网看了按空间位置查询的帮助文档。它说:输入必须是要素图层;不可以是要素类。要素图层?要素类?以前一直把它们看成是一种意思,于是去查一下了帮助,长知识了。

结果Python的示例代码,使用了MakeFeatureLayer来创建要素图层。

//创建要素图层
MakeFeatureLayer MFL = new MakeFeatureLayer();
MFL.in_features = moreDB + "\\" + strFC;
MFL.out_layer = strFC + @"_Lyr";
GPClass.Execute(MFL); //按位置选择
SelectLayerByLocation SLBL = new SelectLayerByLocation();
SLBL.in_layer = strFC + @"_Lyr";
SLBL.select_features = referDB + "\\" + strFC;
SLBL.overlap_type = "ARE_IDENTICAL_TO";
GPClass.Execute(SLBL);

GP执行成功,虽然还看不到效果。因为MakeFeatureLayer是临时图层,程序结束就没有了,需要将它导出来:

//复制要素导出
CopyFeatures CF = new CopyFeatures();
CF.in_features = strFC + @"_Lyr";
CF.out_feature_class = resultDB + "\\" + strFC;
GPClass.Execute(CF);

现在的问题是是选择类型是ARE_IDENTICAL_TO,如果输入图层中的要素与某一选择要素相同(就几何而言),则会选择这些要素。生成的mdb是重复那一部分,而需要的结果是不重复的那一部分。在ArcGIS里可以通过切换选择来操作。于是想,先把它全部选中,然后将重复的移除。代码:

//创建要素图层
MakeFeatureLayer MFL = new MakeFeatureLayer();
MFL.in_features = moreDB + "\\" + strFC;
MFL.out_layer = strFC + @"_Lyr";
GPClass.Execute(MFL); //选择所有
SelectLayerByAttribute SLBA = new SelectLayerByAttribute();
SLBA.in_layer_or_view = strFC + @"_Lyr";
GPClass.Execute(SLBA); //按位置选择(移除)
SelectLayerByLocation SLBL = new SelectLayerByLocation();
SLBL.in_layer = strFC + @"_Lyr";
SLBL.select_features = referDB + "\\" + strFC;
SLBL.overlap_type = "ARE_IDENTICAL_TO";
SLBL.selection_type = "REMOVE_FROM_SELECTION";
GPClass.Execute(SLBL); //复制要素
CopyFeatures CF = new CopyFeatures();
CF.in_features = strFC + @"_Lyr";
CF.out_feature_class = resultDB + "\\" + strFC;
GPClass.Execute(CF);

终于实现了。

5.为了增加用户的体验,重写在了一个类,并把新建一个线程来处理:

string referDB = "";
string moreDB = "";
string resultDB = "";
ProgressBarX progress = null;
public NoRepeatClass(string _referDB, string _moreDB, string _resultDB, ProgressBarX _progress)
{
referDB = _referDB;
moreDB = _moreDB;
resultDB = _resultDB;
progress = _progress; Thread MyThreadOne = new Thread(new ThreadStart(MainFun));
MyThreadOne.Name = "NoRepeat";
MyThreadOne.IsBackground = true;
MyThreadOne.Start();
} private void MainFun()
{
//主程序代码

6.为了让用户知道处理的进度,于是添加了进度条,并更新内容为当前处理图层的名称。但这里,不能直接在一个线程里设置主线程的控件属性,于是找了一个函数:

#region 设置控件参数
/// <summary>
/// 设置控件参数
/// </summary>
/// <param name="oControl">控件</param>
/// <param name="propName">参数名称</param>
/// <param name="propValue">参数值</param>
delegate void SetControlValueCallback(Control oControl, string propName, object propValue);
public static void SetControlPropertyValue(Control oControl, string propName, object propValue)
{
if (oControl.InvokeRequired)
{
SetControlValueCallback d = new SetControlValueCallback(SetControlPropertyValue);
oControl.Invoke(d, new object[] { oControl, propName, propValue });
}
else
{
Type t = oControl.GetType();
System.Reflection.PropertyInfo[] props = t.GetProperties();
foreach (System.Reflection.PropertyInfo p in props)
{
if (p.Name.ToUpper() == propName.ToUpper())
{
p.SetValue(oControl, propValue, null);
}
}
}
}
#endregion

目前的效果如下:

7.为了提高操作效率,增加了路径拖放功能,下面是拖放类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO; namespace GPTools
{
class DragClass
{
private Control control;
private string fileType = ""; public DragClass(Control _control,string _fileType)
{
//如果控件为空
if (_control == null)
{
return;
}
control = _control;
fileType = _fileType; //设置是否可以拖放
control.AllowDrop = true; //定义拖放事件
control.DragEnter += new DragEventHandler(control_DragEnter);
ontrol.DragDrop += new DragEventHandler(control_DragDrop); } private void control_DragEnter(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop))
{
e.Effect = DragDropEffects.Copy;
}
} private void control_DragDrop(object sender, DragEventArgs e)
{
string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
foreach (string file in files)
{
//判断文件类型
if (Path.GetExtension(file) == fileType)
{
Console.WriteLine(file);
control.Text = file;
}
}
}
}
}

在初始化主程序后实例化拖放类,一旦拖放就会触发DragEnter事件和DragDrop事件:

DragClass dg = new DragClass(this.txbReferDB, ".mdb");
DragClass dg2 = new DragClass(this.txbMoreDB, ".mdb");

8.因为我们只遍历了检查.mdb中的图层,万一调绘.mdb中没有对应图层怎么,所以,我们得检查,如果没有则跳过。

//创建要素图层
//…… //检查数据
object dt = "";
if (GPClass.GP.Exists(referDB + "\\" + strFC, ref dt))
{
//3.选择所有
//4.按位置选择(移除)
}
//复制要素
//……

9.为了更准确的统计操作时间,添加了计时功能。效果图如下:

10.为了让用户快速进行执行任务,可以在执行按钮上添加Enter事件。

private void btnExcute_Enter(object sender, EventArgs e)
{
Excute();
} private void Excute()
{
referDBPath = txbReferDB.Text.Trim();
moreDBPath = txbMoreDB.Text.Trim();
resultDBPath = txbResultDB.Text.Trim(); if (referDBPath.Trim() != "" && moreDBPath.Trim() != "" && resultDBPath.Trim() != "")
{
NoRepeatClass nr = new NoRepeatClass(referDBPath, moreDBPath, resultDBPath, progressBar);
}
else
{
MessageBoxEx.EnableGlass = false;
MessageBoxEx.Show("警告:数据库路径选择有误!\n 请检查数据路径是否正确。", "提示");
}
}

参考:http://bbs.esrichina-bj.cn/esri/viewthread.php?tid=50540

GP开发示例:数据库去重的更多相关文章

  1. Github团队开发示例(一)

    Github团队开发示例(二) 作者:Grey 原文地址:http://www.cnblogs.com/greyzeng/p/6044837.html 我们可以在Github上管理自己的团队项目.团队 ...

  2. Padrino 博客开发示例

    英文版出处:http://www.padrinorb.com/guides/blog-tutorial 楼主按 拿作者自己的话说:Padrino(谐音:派骓诺)是一款基于Sinatra的优雅的Web应 ...

  3. windows phone 8.1开发SQlite数据库操作详解

    原文出自:http://www.bcmeng.com/windows-phone-sqlite1/ 本文小梦将和大家分享WP8.1中SQlite数据库的基本操作:(最后有整个示例的源码)(希望能通过本 ...

  4. (数据科学学习手札120)Python+Dash快速web应用开发——整合数据库

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 这是我的系列教程Python+Dash快速web ...

  5. Github团队开发示例(二)

    Github团队开发示例(二) 作者:Grey 原文地址:http://www.cnblogs.com/greyzeng/p/6063765.html 接之前讲的Github团队开发示例(一),本文主 ...

  6. Net力软快速信息化系统开发框架 + 开发手册+数据库说明

    源码目录结构说明LeaRun.Cache –缓存层LeaRun.Resource –本地语言LeaRun.Utilities –公共类库LeaRun.DataAccess –数据库访问核心组件LeaR ...

  7. DevExpress .NET界面开发示例大全

    说到做.net界面开发,很多人应该都会想到DevExpress. 它的 .net界面开发系列一共有7个版本:WinForms.ASP.NET.MVC.WPF.Silverlight.Windows 8 ...

  8. TWaver Flex开发示例及license下载

    做电信项目的朋友一定知道TWaver,而Flex版具有很好的跨平台性,很适合做B/S模式的应用. Flex版的在线DEMO:http://twaver.servasoft.com/demo/twave ...

  9. 在SQL Server 2014下面使用的SQL2000的Northwind和Pubs示例数据库

    在SQL Server 2014下面使用的SQL2000的Northwind和Pubs示例数据库 http://files.cnblogs.com/files/lxzhangying/SQl2000S ...

随机推荐

  1. hdu 5248 贪心

    题意:

  2. bzoj 3240 矩阵乘法+十进制快速幂

    首先,构造出从f[][i]->f[][i+1]的转移矩阵a,和从f[i][m]->f[i+1][1]的转移矩阵b, 那么从f[1][1]转移到f[n][m]就是init*(a^(m-1)* ...

  3. http协议之 COOKIE

    cookie我们都很了解,这里描述下cookie的几个参数意义 key = "qq", value = "Bobser" .. os.time(), path ...

  4. Python知识(6)--numpy做矩阵运算

    矩阵运算 论numpy中matrix 和 array的区别:http://blog.csdn.net/vincentlipan/article/details/20717163 matrix 和 ar ...

  5. h5的部分新元素或属性

    #h5的新元素或属性 - datalist标签(新表单元素):规定了input元素可能的选项列表.   * 条件:datalist的id属性值必须等于input元素的list属性值.          ...

  6. MySql_delete同时删除多表相关联记录

    sql delete同时删除多表相关联记录 sqlserver 支持级联更新和删除oracle 只支持级联删除 删除包含主键值的行的操作,该值由其它表的现有行中的外键列引用.在级联删除中,还删除其外键 ...

  7. 怎样用Java代码来把SSL的证书自己主动导入到Java的秘钥存储文件(keystore)

    我们在开发或者使用SSL的过程中,非常多的软件须要我们提供java的keystore.特别是一些基于Java的中间件产品. 我们常规的做法是JDK自带的工具命令(keytool)去做.比方,以下的样例 ...

  8. 一个对 Dijkstra 的采访视频

    之前在微博上推荐了一个对 Dijkstra 的采访视频,看了两遍之后觉得实在很好,所以再正式推荐一下.大部分人可能都知道他对图论算法和操作系统的贡献,而其实 Dijkstra 在程序语言上的造诣也很深 ...

  9. 实现工资的按天统计(X:日期 Y:姓名)

    案例:工人工资按天按班别存入数据库,想实现一根据部门及员工姓名还有日期的汇总表... 汇总表效果如下: 还可以根据XY坐标对应的值查询显示该日期的明细记细 2013-09-06升级(如是当月最多只能显 ...

  10. ldap安装配置过程中遇到的错误,以及解决方法

    错误1: [root@openldap openldap]# ldapsearch -LLL-W -x -H ldap://etiantian.org -D "cn=admin,dc=eti ...