C#进行MapX二次开发之图层操作

特别说明,本文整理自一篇网络的文章《MapX从数据库读取数据形成新图层(C#)》

在C#中实 现MapX从数据库读取数据形成新图层分为两个问题:

1.MapX从数据库读取数据形成新图层;

2.将DataTable转换为ADO的Recordset。这里的第二个问题是由第一个问题引起的,因为MapX是一 个COM控件,而且它只支持ADO的数据访问方式,而C#编程时一般会使用ADO.NET方式,为此需要在两种方 式之间做一下转换。(当然也可以在C#中使用ADO方式)

DataTable转换为ADO的Recordset的操作 代码如下所示。

/// <summary>
/// 在.net中用ADO.NET取代了ADO实现对数 据的访问,但一些COM控件只支持ADO并不支持ADO.NET。
/// 为了使用这类控件,只能将ADO.NET 中的数据对象,比如转换DataTable为ADO中的Recordset
/// (DataSet对象本质上是DataTable的 集合,因此本文只讲述DataTable对象的转换)。
/// </summary>
public sealed  class ADONETtoADO
{
/// <summary>
/// 将DataTable对象转换为 Recordeset对象
/// </summary>
/// <param  name="table">DataTable对象</param>
/// <returns>转换后得到的 Recordeset对象</returns>
public static Recordset ConvertDataTableToRecordset (DataTable table)
{
//思路:
// 1.创建Recordset对象后,在其中对应DataTable 的Column创建Field,为此需要将ADO.NET的数据类型转换为ADO的数据类型;
// 2.打开Recordset 对象,对应DataTable对象中的每一行,在Recordset对象中新建一条记录,并对每个字段赋值。

Recordset rs = new RecordsetClass();
foreach (DataColumn dc in  table.Columns)
{
rs.Fields.Append(dc.ColumnName, GetDataType(dc.DataType), -1,  FieldAttributeEnum.adFldIsNullable, Missing.Value);
}

rs.Open (Missing.Value, Missing.Value, CursorTypeEnum.adOpenUnspecified,  LockTypeEnum.adLockUnspecified, -1);
foreach (DataRow dr in table.Rows)
{
rs.AddNew(Missing.Value, Missing.Value); object o;
for (int i = 0; i <  table.Columns.Count; i++)
{
rs.Fields[i].Value = dr[i];
o = rs.Fields [i].Value;
}
}

return rs;
}

/// <summary>
/// 将ADO.NET的数据类型转换为ADO的数据类型
/// </summary>
/// <param  name="dataType">ADO.NET的数据类型</param>
/// <returns>ADO 的数据类型</returns>
private static DataTypeEnum GetDataType(Type dataType)
{
switch (dataType.ToString())
{
case "System.Boolean":  return DataTypeEnum.adBoolean;
case "System.Byte": return  DataTypeEnum.adUnsignedTinyInt;
case "System.Char": return  DataTypeEnum.adChar;
case "System.DateTime": return  DataTypeEnum.adDate;
case "System.Decimal": return  DataTypeEnum.adDecimal;
case "System.Double": return  DataTypeEnum.adDouble;
case "System.Int16": return  DataTypeEnum.adSmallInt;
case "System.Int32": return  DataTypeEnum.adInteger;
case "System.Int64": return  DataTypeEnum.adBigInt;
case "System.SByte": return  DataTypeEnum.adTinyInt;
case "System.Single": return  DataTypeEnum.adSingle;
case "System.String": return  DataTypeEnum.adVarChar;
//case "TimeSpan":return DataTypeEnum.
case  "System.UInt16": return DataTypeEnum.adUnsignedSmallInt;
case  "System.UInt32": return DataTypeEnum.adUnsignedInt;
case  "System.UInt64": return DataTypeEnum.adUnsignedBigInt;
default: throw  (new Exception("没有对应的数据类型"));
}
}
}

时间: 2024-08-31 14:14:25

C#进行MapX二次开发之图层操作的相关文章

C#进行MapX二次开发之鹰眼实现

鹰眼一般是指GIS应用中,系统有两个一大一小的图,小图提供快速定位地图位置的功能,这个是在GIS中应用比较广泛的一个功能,在Google地图中,右下角也有一个小图框,也是指的鹰图.如下图所示.    在本次介绍的例子中,左边是主地图,右边是小地图,即鹰眼. 鹰眼要实现下面几个功能: 1. 主地图变化时,鹰眼也要做出相应的位置变化,以便更好展示位置所在. 2.鹰眼地图移动到任何一个位置,主地图也要做相关联的位置变化,以实现地图的粗略定位. 3.主地图实现鼠标滚轮的变化支持. 首先我们先设置主地图的

destoon二次开发常用数据库操作_php实例

destoon在初始化系统后系统会自动连接数据库,并将数据库操作对象保存在$db.对于数据库操作方法请参考include/db_mysql.class.php函数原型,下面对常用数据库操作举例说明. 1.执行SQL语句 $db->query("INSERT INTO `{$DT_PRE}table` (`xxx`) VALUES ('yyy')"); $db->query("UPDATE `{$DT_PRE}table` SET `xxx`='yyy' WHERE

C#进行MapX二次开发之开篇介绍及资源汇总

关于地理信息的开发有好多控件工具可以选择,GIS软件包括三家美国GIS开发商ESRI,Intergraph和 MapInfo的软件产品,以及国产软件:MapGIS,GeoStar和Citystar,SuperMap等产品.另外还有一些边缘 产品,是Web GIS的领域,不是纯粹的GIS产品,称之为地图应用平台可能较好,如Google公司的Google Maps.微软的Virtual Earth,国内的51地图,搜狗的地图等. 可能用的比较多的是ESRI了,他的 Arc IMS或者ArcGIS S

C#进行MapX二次开发之控件基本操作

上篇介绍了MapX的部分基本使用代码,包括放大.缩小.缩放到初始大小(全图).平移.矩形选择. 圆形选择.箭头.打开图层对话框 .打开ActiveX属性对话框 .添加符号等基本操作代码,本篇继续探 讨一些控件的基本操作. MapX提供的标准工具,不同的工具将会使鼠标能够完成多种任务.例如 ,如果当前的工具设成 miLabelTool,那么当单击鼠标时,会在此特指的地图对象上放置标签.鼠标光标 将根据正使用的工具更改形状.MapX 可用的标准工具列表如下所示: 工具 常量 描述 Add Line

求vb+mapx二次开发高手 我已经实现了地图的加载,和一般的功能,现在需要,点击一个区改变区的颜色?

问题描述 我现在双击一个区,连接到该区的属性数据用frmprop的grid来显示,代码如下:PrivateSubMap1_DblClick()OnErrorResumeNextIfMap1.CurrentTool=miSelectToolThenDimiAsIntegerDimlyrAsMapXLib.LayerSetfrmprop.map=Map1Fori=1ToMap1.Layers.CountSetlyr=Map1.Layers(i)Iflyr.Selection.Count=1Thenf

C#进行MapX二次开发之地图搜索

在GIS中,地标或者道路等信息查找是一项很重要的功能,类似于我们查找数据库记录那样,需要模糊 进行匹配,一般来说,找到需要的地标或者道路等地图元素后,双击可以定位到地图的具体位置,并放大 地图,类似于Google Map的Fly to功能. 由于地图的信息是按照层来存储的,所以我们查找信息 的时候,也是按照一层层来进行检索,由于MapInfo的地图一般有很多层,每层进行遍历会比较花费时间 ,所以一般的专业系统,都只是关系一部分层,我们通常在配置文件中指定感兴趣的层名集合,然后查找 的时候,在这些

C# Arcgis engine 二次开发 动态生成面装网格图层

问题描述 C#Arcgisengine二次开发动态面装网格图层ArcgisEngineC#vs2005C#Arcgisengine二次开发动态生成网格根据现有图层的边界在动态生成一个新的图层(没有实现)*我用的是ImapGrid来生成的网格.但是不能满足我的要求公司要求对生成后的网格进行填写值.(我想应该不是让生成网格是不是应该生成面装图层然后在一个个面装属性里面填写值)怎么实现大师们帮帮我把:ps:最好有动态生成面装网格图层代码因为我还要根据面装图块到其他图层里面查相交的区域..... 解决方

[AE二次开发]选择特定图层

问题描述 实现目标:添加多个图层,进行属性查询时,可以实现特定图层的查询不知道利用COMBOBOX能不能实现,或者有什么好的方法吗? 解决方案 解决方案二:先遍历图层,加载到combox里,设置item选取事件代码

rc ngine-利用C#进行arc engine 二次开发 单值渲染

问题描述 利用C#进行arc engine 二次开发 单值渲染 第一个图是正常生成点shp图:第二个是基于点属性的某一字段进行单值渲染后的结果,地图是空白的,怎么才能将渲染好的结果显示出来啊?求大神指教!!! 解决方案 PointShp是点图层还是面图层?如果是点图层,怎么单值渲染中C类水平和B类水平的符号是面符合? 解决方案二: 对,应该是点文件,编码中写成面文件了