WLib 一个个人整理优化的 C# .NET + ArcObject / ArcEngine 常用代码库
个人整理优化的 C#.NET + ArcObject / ArcEngine 常用代码库,多以静态方法或扩展方法对 C# 和 ArcGIS 常用操作进行分类封装,目标是尽量少些重复代码,提高 ArcGIS 桌面端或 Web 后端开发效率。
- WLib 是一组对 C#.NET 和 ArcGIS Engine 开发常用代码进行封装优化的基础库和控件库;
- 以减少重复代码,提高 ArcGIS 桌面端或 Web 后端开发效率为目标。
简介
解决方案包含 8 个项目(代码库),核心库为 WLib 和 WLib.ArcGis
代码库 | 说明 | 内容 |
---|---|---|
WLib | C#基础库 | DbHelper、Windows API、硬件信息获取、压缩与解压缩、反射、DataTable转对象(简单ORM)等 |
WLib.ArcGis | ArcGIS基础库 | 优化和封装的ArcObject代码集,内容包含GP调用、拓扑、空间查询、地图查询、标注、注记、元素增删改查、制图出图、样式、专题渲染、坐标系判读转换、点线面几何创建、控件组合联动、许可初始化、shp/gdb/mdb/sde/sql/oledb连接和表格/矢量/栅格数据增删改查等 |
WLib.Envir | 环境检测库 | 获取安装的.NET版本、ArcGIS版本、Windows操作系统版本 |
WLib.Files | excel、Word、pdf读写库 | 使用NPOI读写xls和xlsx、使用AppLibrary.dll 库的简单xls操作、使用官方库Microsoft.Office.Interop.Excel操作xls和xlsx、使用官方库Microsoft.Office.Interop.Word读写doc和docx、使用itextsharp操作pdf文档 |
WLib.Gdal | GDAL帮助库 | 开源GIS库GDAL(Geospatial Data Abstraction Library)的Helper代码 |
WLib.WinCtrls | WinForm控件库 | 一些自定义的WinForm和ArcEngine控件 |
WLib.WinCtrls.Dev | DevExpress 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 文件夹中
- AppLibrary.dll 轻量级开源的Excel读写库
- GDAL 著名开源GIS开发库
- SharpZipLib 文件压缩和解压缩库
- NPOI
- oracle.dataaccess
- System.Data.SQLite
- Newtonsoft.Json
- itextsharp
使用示例
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");
插件功能
WLib
和 WLib.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));//创建、显示注册机
}
}
}
启动项目,在打开的注册机界面上,根据机器码、授权时段等信息生成注册码。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论