WLib 一个个人整理优化的 C# .NET + ArcObject / ArcEngine 常用代码库

发布于 2020-11-09 10:08:10 字数 9917 浏览 1965 评论 0

个人整理优化的 C#.NET + ArcObject / ArcEngine 常用代码库,多以静态方法或扩展方法对 C# 和 ArcGIS 常用操作进行分类封装,目标是尽量少些重复代码,提高 ArcGIS 桌面端或 Web 后端开发效率。

  • WLib 是一组对 C#.NET 和 ArcGIS Engine 开发常用代码进行封装优化的基础库和控件库;
  • 以减少重复代码,提高 ArcGIS 桌面端或 Web 后端开发效率为目标。

简介

解决方案包含 8 个项目(代码库),核心库为 WLib 和 WLib.ArcGis

代码库说明内容
WLibC#基础库DbHelper、Windows API、硬件信息获取、压缩与解压缩、反射、DataTable转对象(简单ORM)等
WLib.ArcGisArcGIS基础库优化和封装的ArcObject代码集,内容包含GP调用、拓扑、空间查询、地图查询、标注、注记、元素增删改查、制图出图、样式、专题渲染、坐标系判读转换、点线面几何创建、控件组合联动、许可初始化、shp/gdb/mdb/sde/sql/oledb连接和表格/矢量/栅格数据增删改查等
WLib.Envir环境检测库获取安装的.NET版本、ArcGIS版本、Windows操作系统版本
WLib.Filesexcel、Word、pdf读写库使用NPOI读写xls和xlsx、使用AppLibrary.dll 库的简单xls操作、使用官方库Microsoft.Office.Interop.Excel操作xls和xlsx、使用官方库Microsoft.Office.Interop.Word读写doc和docx、使用itextsharp操作pdf文档
WLib.GdalGDAL帮助库开源GIS库GDAL(Geospatial Data Abstraction Library)的Helper代码
WLib.WinCtrlsWinForm控件库一些自定义的WinForm和ArcEngine控件
WLib.WinCtrls.DevDevExpress WinForm控件库一些自定义的DevExpress WinForm和ArcEngine控件

引用

使用 nuget 引用

Install-Package WLib
Install-Package WLib.ArcGis
Install-Package WLib.Envir

环境

开发环境

  • Visual Studio 2017
  • .NET Framework 4.0

调用组件

引用的第三方 dll 已包含到 DLL 文件夹中

使用示例

private void SmapleMethod(){
    //使用以下对象需引用:
    //using WLib.ArcGis.Data;
    //using WLib.ArcGis.GeoDatabase.FeatClass;
    //using WLib.ArcGis.GeoDatabase.WorkSpace;
    //using WLib.Database;
    //using WLib.Database.DbBase;

    //---------示例1:获得区域内的河流的总长度----------
    //1、直接根据图层的路径获得 IFeatureClass 对象
    IFeatureClass featureClass = FeatureClassEx.FromPath(@"c:\World.mdb\River");//获取河流图层
    //2、通过QueryFeatures扩展方法,查询图层中的数据
    double sumRiverLength = 0.0;//计算河流的总长度
    featureClass.QueryFeatures(@"XZQDM = '440000'", feature => sumRiverLength += feature.ToDouble("RiverLength"));


    //---------示例2:复制图层----------
    var workspace = WorkspaceEx.GetWorkSpace(@"c:\World.mdb");
    workspace.GetFeatureClassByName("River").CopyStruct(workspace, "NewRiver", "河流");

    //---------示例3:数据查询----------
    //数据库连接和SQL查询的方式获取shp、mdb、gdb、dbf数据
    DbHelper dbHelper1 = DbHelper.GetShpMdbGdbHelper(@"c:\River.dbf");
    System.Data.DataTable dataTable = dbHelper1.GetDataTable(@"select * from River where RiverName =  'Pearl River'");
}

数据库连接查询

  • WLib提供了DbHelper类封装简化ADO.NET的操作;
  • 支持包括Oracle、SQLServer、MySQL、Sqlite和通过ODBC、OLEDB连接的数据源(例如Access、Excel、dbf等),可扩展支持其他类型数据源。

查询示例

  • 特定数据库的查询
//需添加引用: using WLib.Database;
DbHelper dbHelper = DbHelper.SqlServerHelper("127.0.0.1", "databaseName", "username", "password");
DataTable table = dbHelper.GetDataTable("select * from table1");
  • 通用数据库的查询通过枚举EDbProviderType指定数据源、使用连接字符串构建查询:
DbHelper dbHelper =  DbHelper.GetDbHelper("Data Source=127.0.01;Initial Catalog=myDataBase;User Id=username;Password=password;", EDbProviderType.SqlServer, 30);
DataTable table = dbHelper.GetDataTable("select * from table1");
  • 支持的数据源类型通过EDbProviderType枚举说明支持的数据源类型包括:
    • Oracle、SQLServer、MySQL、Sqlite等数据库;
    • 各类通过ODBC、OLEDB连接的数据源(包括Access、Excel、dbf等);
    • 通过修改EDbProviderType 枚举及枚举值的Description特性来扩展支持其他数据源。
  • 查询ArcGIS数据ArcGIS提供的数据(shp\gdb\mdb\dbf),在安装了ESRI OLE DB提供程序后同样可以通过DbHelper进行简单查询,示例如下:
DbHelper dbHelper = DbHelper.GetShpMdbGdbHelper(@"c:\River.dbf");
DataTable dataTable = dbHelper.GetDataTable(@"select * from River where RiverName =  'Pearl River'");

属性和事件

连接超时和命令执行超时设置

dbHelper.ConnectionTimeOut = 10;//设置连接超时时间(秒)
dbHelper.CommandTimeOut = 60;//设置命令执行超时时间(秒)

监控执行的SQL语句

通过 DbHelper.PreExcute 事件监控执行的SQL语句,方便日志记录或调试:

dbHelper1.PreExcute += (sender, e) => Console.WriteLine(e.Sql);

连接字符串的构建

  • 由于不同连接方式下、不同数据库的连接字符串不同,在设置连接字符串时通常容易出错,解决此问题推荐参考网站:https://www.connectionstrings.com/
  • DbHelper类中,也提供了一些辅助方法构建部分常用数据库的连接字符串,例如:
var connectionString1 = DbHelper.Access_OleDb4("c:\data\mydb.mdb", "testUser", "123456");
var connectionString2 = DbHelper.Excel_OleDb("c:\data\data.xlsx", "YES", 1);
var connectionString3 = DbHelper.MySql("127.0.0.1","testDb", "aa","123456");
var connectionString4 = DbHelper.Sqlite("c:\Data\mydb.db");

插件功能

WLibWLib.WinCtrl 库为WinForm插件式应用提供基本的插件组件和管理功能,本插件功能并不成熟,仅为基本的、简单的插件开发需求做准备。

简介

该插件功能为WinForm插件式开发服务,在程序设计上,可将部分或整个WinForm程序的各个具体业务功能当成插件,与主界面上的基础UI进行交互,整个应用程序的功能可相对自由地组合。

插件组件整体层级结构为:

  • 功能命令(Command):调用具体功能的命令。也可以是具体的功能本身。
  • 插件项(Plugin Item):嵌入到界面中的插件,通常代表界面中的一个菜单项或工具栏上的工具、按钮等。
  • 插件容器(Plugin Container):装载插件,对插件进行分类的容器,通常代表界面中的菜单、工具栏等。
  • 插件视图(Plugin View):可装载插件的整个视图,通常代表一个窗体。
  • 插件方案(Plugin Plan):应用程序的一整套插件方案。
  • 插件系统(Plugin Plan System):代表一个可以定制不同插件方案的应用程序。

结合应用示例如下:

软件注册

软件注册模块提供简单的以注册表授权方式的软件许可授权功能。

  • WLib 库的SoftRegister 类提供软件机器码、注册码的生成、授权验证等功能;
  • WLib.WinCtrls 库提供注册机和授权注册窗体。

为软件添加授权注册功能

命名空间引用:

using WLib.Register;
using WLib.WinCtrls.RegisterCtrl;

在程序入口main方法处添加授权验证

static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);

    //var appInfo = AppInfo.FromEntryAssembly();
    var appInfo = new AppInfo("","XXX软件","YYY公司");//获取当前软件的信息,用于生成机器码和验证注册码
    new SoftRegister(appInfo).CheckRegister(
        () => Application.Run(new MainForm()),//验证授权成功,则打开主窗体
        msg => Application.Run(new RegisterForm(appInfo))//验证授权失败,则打开授权注册窗体
    );
}

上述代码说明:

  • 先获取当前软件的信息即AppInfo ,用于标识软件。
  • 实例化SoftRegister对象并且传入软件信息AppInfo,该对象内部将根据公司名AppInfo.Company和软件标识名AppInfo.Key来标识软件,且后续参与机器码的生成;
  • 通过CheckRegister(Action successAction, Action<string> failAction) 方法验证授权,验证授权步骤为:
    • 读注册表HKEY_CURRENT_USER\SOFTWARE\company\key\reg,从macCode中获得机器码,从regCode中获得注册码,从lastTime中获得上次验证授权时间。
    • 若注册表键不存在,或机器码、注册码不存在,或验证的注册码不是由该机器码所得,或超出授权时段,弹出授权注册窗体要求用户重新授权。
    • 若注册表已记录注册码、机器码且验证注册码通过则打开软件主窗体。

使用注册机进行软件授权

新建 Windows 窗体项目,在 Program.cs 的Main方法中,创建并且显示注册机窗体,传入要注册的软件的信息。

using System;
using System.Windows.Forms;
using WLib.Register;
using WLib.WinCtrls.RegisterCtrl;

namespace MyProject.RegisterMachine
{
    static class Program
    {
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            
            //var appInfo = AppInfo.FromAssembly('MyProject.dll');
            var appInfo = new AppInfo("","XXX软件","YYY公司");
            Application.Run(new RegisterMachineForm(appInfo));//创建、显示注册机
        }
    }
}

启动项目,在打开的注册机界面上,根据机器码、授权时段等信息生成注册码。

项目地址:https://github.com/Windr07/WLib

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

JSmiles

生命进入颠沛而奔忙的本质状态,并将以不断告别和相遇的陈旧方式继续下去。

0 文章
0 评论
84961 人气
更多

推荐作者

醉城メ夜风

文章 0 评论 0

远昼

文章 0 评论 0

平生欢

文章 0 评论 0

微凉

文章 0 评论 0

Honwey

文章 0 评论 0

qq_ikhFfg

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文