属性数据表的查询显示

ArcGIS应用(十八)Arcgis 矢量图层属性表显示精度变化问题详解 Open Atrribute Table是显示图层数据属性信息的表格,主要针对矢量、表格数据。最近在处理数据过程中,发现属性表中的数据在经过数据处理之后精度显示出现问题了,包括小数点不显示、精度长度显示变化等,属性值发生了变化。 阅读详情

在ArcMap中,单击图层右键菜单中的“Open Attribute Table”命令,便可弹出属性数据表。本讲将完成类似的功能,效果如下:

 

图1

数据表显示,我们用了DataGridView控件。DataGridView 控件提供一种强大而灵活的以表格形式显示数据的方式。可以使用 DataGridView 控件来显示少量数据的只读视图,也可以对其进行缩放以显示特大数据集的可编辑视图。我们可以很方便地把一个DataTable作为数据源绑定到DataGridView控件中。

本讲的思路大体如下:首先根据图层属性中的字段创建一个空的DataTable,然后根据数据内容一行行填充DataTable数据,再将DataTable绑定到DataGridView控件,最后调用并显示属性表窗体。

1.创建属性表窗体

新建一个Windows窗体,命名为“AttributeTableFrm.cs”。

从工具箱拖一个DataGridView控件到窗体,并将其Dock属性设置为“Fill”。//令其充斥整个窗体

添加如下引用:

using ESRI.ArcGIS.Carto;

using ESRI.ArcGIS.Controls;

using ESRI.ArcGIS.esriSystem;

using ESRI.ArcGIS.SystemUI;

using ESRI.ArcGIS.Geometry;

using ESRI.ArcGIS.Geodatabase;
 

添加引用


2.创建空DataTable

首先传入ILayer,再查询到ITable,从ITable中的Fileds中获得每个Field,再根据Filed设置DataTable的DataColumn,由此创建一个只含图层字段的空DataTable。实现函数如下:

/// <summary>

/// 根据图层字段创建一个只含字段的空DataTable

/// </summary>

/// <param name="pLayer"></param>

/// <param name="tableName"></param>

/// <returns></returns>

private static DataTable CreateDataTableByLayer(ILayer pLayer, string tableName)

{

//创建一个DataTable表

DataTable pDataTable = new DataTable(tableName);

//取得ITable接口

ITable pTable = pLayer as ITable;

IField pField = null;

DataColumn pDataColumn;//System.Data.DataTable中列

//根据每个字段的属性建立DataColumn对象

for (int i = 0; i < pTable.Fields.FieldCount; i++)

{

pField = pTable.Fields.get_Field(i);

//新建一个DataColumn并设置其属性

pDataColumn = new DataColumn(pField.Name);

if (pField.Name == pTable.OIDFieldName)//此列的每行须唯一

{

pDataColumn.Unique = true;//字段值是否唯一

}

//字段值是否允许为空

pDataColumn.AllowDBNull = pField.IsNullable;

//字段别名

pDataColumn.Caption = pField.AliasName;

//字段数据类型

pDataColumn.DataType = System.Type.GetType(ParseFieldType(pField.Type));

//字段默认值

pDataColumn.DefaultValue = pField.DefaultValue;

//当字段为String类型是设置字段长度

if (pField.VarType == 8)

{

pDataColumn.MaxLength = pField.Length;

}

//字段添加到表中

pDataTable.Columns.Add(pDataColumn);

pField = null;

pDataColumn = null;

}

return pDataTable;

}

因为GeoDatabase的数据类型与.NET的数据类型不同,故要进行转换。转换函数如下:

/// <summary>

/// 将GeoDatabase字段类型转换成.Net相应的数据类型

/// </summary>

/// <param name="fieldType">字段类型</param>

/// <returns></returns>

public static string ParseFieldType(esriFieldType fieldType)

{

switch (fieldType)

{

case esriFieldType.esriFieldTypeBlob:

return "System.String";

case esriFieldType.esriFieldTypeDate:

return "System.DateTime";

case esriFieldType.esriFieldTypeDouble:

return "System.Double";

case esriFieldType.esriFieldTypeGeometry:

return "System.String";

case esriFieldType.esriFieldTypeGlobalID:

return "System.String";

case esriFieldType.esriFieldTypeGUID:

return "System.String";

case esriFieldType.esriFieldTypeInteger:

return "System.Int32";

case esriFieldType.esriFieldTypeOID:

return "System.String";

case esriFieldType.esriFieldTypeRaster:

return "System.String";

case esriFieldType.esriFieldTypeSingle:

return "System.Single";

case esriFieldType.esriFieldTypeSmallInteger:

return "System.Int32";

case esriFieldType.esriFieldTypeString:

return "System.String";

default:

return "System.String";

}

}
 

3.装载DataTable数据

从上一步得到的DataTable还没有数据,只有字段信息。因此,我们要通过ICursor从ITable中逐一取出每一行数据,即IRow。再创建DataTable中相应的DataRow,根据IRow设置DataRow信息,再将所有的DataRow添加到DataTable中,就完成了DataTable数据的装载。

为保证效率,一次最多只装载2000条数据到DataGridView。函数代码如下:

 /// <summary>
/// 填充DataTable中的数据

/// </summary>

/// <param name="pLayer"></param>

/// <param name="tableName"></param>

/// <returns></returns>

public static DataTable CreateDataTable(ILayer pLayer, string tableName)

{

//创建空DataTable

DataTable pDataTable = CreateDataTableByLayer(pLayer, tableName);

//取得图层类型

string shapeType = getShapeType(pLayer);

//创建DataTable的行对象

DataRow pDataRow = null;

//从ILayer查询到ITable

ITable pTable = pLayer as ITable;

ICursor pCursor = pTable.Search(null, false);

//取得ITable中的行信息

IRow pRow = pCursor.NextRow();

int n = 0;

while (pRow != null)

{

//新建DataTable的行对象

pDataRow = pDataTable.NewRow();

for (int i = 0; i < pRow.Fields.FieldCount; i++)

{

//如果字段类型为esriFieldTypeGeometry,则根据图层类型设置字段值

if (pRow.Fields.get_Field(i).Type == esriFieldType.esriFieldTypeGeometry)

{

pDataRow[i] = shapeType;

}

//当图层类型为Anotation时,要素类中会有esriFieldTypeBlob类型的数据,

//其存储的是标注内容,如此情况需将对应的字段值设置为Element

else if (pRow.Fields.get_Field(i).Type == esriFieldType.esriFieldTypeBlob)

{

pDataRow[i] = "Element";

}

else

{

pDataRow[i] = pRow.get_Value(i);

}

}

//添加DataRow到DataTable

pDataTable.Rows.Add(pDataRow);

pDataRow = null;

n++;

//为保证效率,一次只装载最多条记录

if (n == 2000)

{

pRow = null;

}

else

{

pRow = pCursor.NextRow();

}

}

return pDataTable;

}

上面的代码中涉及到一个获取图层类型的函数getShapeTape,此函数是通过ILayer判断图层类型的,代码如下:

/// <summary>

/// 获得图层的Shape类型

/// </summary>

/// <param name="pLayer">图层</param>

/// <returns></returns>

public static string getShapeType(ILayer pLayer)

{

IFeatureLayer pFeatLyr = (IFeatureLayer)pLayer;

switch (pFeatLyr.FeatureClass.ShapeType)

{

case esriGeometryType.esriGeometryPoint:

return "Point";

case esriGeometryType.esriGeometryPolyline:

return "Polyline";

case esriGeometryType.esriGeometryPolygon:

return "Polygon";

default:

return "";

}

}
 


4.绑定DataTable到DataGridView

通过以上步骤,我们已经得到了一个含有图层属性数据的DataTable。现定义一个AttributeTableFrm类的成员变量:

 public DataTable attributeTable;


通过以下函数,我们很容易将其绑定到DataGridView控件中。

 /// <summary>
/// 绑定DataTable到DataGridView

/// </summary>

/// <param name="player"></param>

public void CreateAttributeTable(ILayer player)

{

string tableName;

tableName = getValidFeatureClassName(player .Name );

attributeTable = CreateDataTable(player,tableName );

this.dataGridView1 .DataSource = attributeTable ;

this.Text = "属性表[" + tableName + "] " + "记录数:"+attributeTable.Rows.Count .ToString();

}

因为DataTable的表名不允许含有“.”,因此我们用“_”替换。函数如下:

/// <summary>

/// 替换数据表名中的点

/// </summary>

/// <param name="FCname"></param>

/// <returns></returns>

public static string getValidFeatureClassName(string FCname)

{

int dot = FCname.IndexOf(".");

if (dot != -1)

{

return FCname.Replace(".", "_");

}

return FCname;

}

 

5.调用属性表窗体

通过1-4步骤,我们封装了一个AttributeTableFrm类,此类能够由ILayer显示图层中的属性表数据。那怎么调用AttributeTableFrm呢?

前面已经提到,我们是在TOCControl选中图层的右键菜单中弹出属性表窗体的,因此我们需要添加一个菜单项到TOCControl中Layer的右键菜单。而在第六讲中,我们采用的是AE中的IToolbarMenu实现右键菜单的,故我们还需自定义一个Command,实现打开属性表的功能。

以ArcGIS的Base Command为模板新建项“OpenAttributeTable.cs”。

注意:新建Base Command模板时,会弹出一个对话框让我们选择模板适用对象,这时我们要选择MapControl、PageLayoutControl,即选择第二项或者倒数第二项。

添加如下引用:

using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Display;

using ESRI.ArcGIS.esriSystem;
 


添加成员变量:

 private ILayer m_pLayer;


修改构造函数为:

 public OpenAttributeTable(ILayer pLayer)
{

//

// TODO: Define values for the public properties

//

base.m_category = ""; //localizable text

base.m_caption = "打开属性表"; //localizable text

base.m_message = "打开属性表"; //localizable text

base.m_toolTip = "打开属性表"; //localizable text

base.m_name = "打开属性表"; //unique id, non-localizable (e.g. "MyCategory_MyCommand")

m_pLayer = pLayer;

try

{

//

// TODO: change bitmap name if necessary

//

string bitmapResourceName = GetType().Name + ".bmp";

base.m_bitmap = new Bitmap(GetType(), bitmapResourceName);

}

catch (Exception ex)

{

System.Diagnostics.Trace.WriteLine(ex.Message, "Invalid Bitmap");

}

}
 


再在On_Click函数中添加如下代码,以创建并打开属性表窗体。

 /// <summary>
/// Occurs when this command is clicked

/// </summary>

public override void OnClick()

{

// TODO: Add OpenAttributeTable.OnClick implementation

AttributeTableFrm attributeTable = new AttributeTableFrm();

attributeTable.CreateAttributeTable(m_pLayer);

attributeTable.ShowDialog();

}
 


至此,我们完成了OpenAttributeTable命令。显然,我们要在TOCControl的OnMouseDown事件中调用此命令。

因为,当前选中的图层参数,即ILayer是通过OpenAttributeTable的构造函数传入的,而选中的ILayer是动态变化的,所以我们无法在窗体初始化的Form1_Load事件中就添加OpenAttributeTable菜单项到右键菜单。但我们可以在OnMouseDown事件中动态添加OpenAttributeTable菜单项。

要注意的是,最后我们必须移除添加的OpenAttributeTable菜单项,不然每次按下右键都会添加此菜单项,将造成右键菜单中含有多个OpenAttributeTable菜单项。

修改TOCControl的OnMouseDown事件的部分代码如下:

 private void axTOCControl1_OnMouseDown(object sender, ITOCControlEvents_OnMouseDownEvent e)
{

//……

//弹出右键菜单

if (item == esriTOCControlItem.esriTOCControlItemMap)

m_menuMap.PopupMenu(e.x, e.y, m_tocControl.hWnd);

if (item == esriTOCControlItem.esriTOCControlItemLayer)

{

//动态添加OpenAttributeTable菜单项

m_menuLayer.AddItem(new OpenAttributeTable(layer), -1, 2, true, esriCommandStyles.esriCommandStyleTextOnly);

m_menuLayer.PopupMenu(e.x, e.y, m_tocControl.hWnd);

//移除OpenAttributeTable菜单项,以防止重复添加

m_menuLayer.Remove(2);

}

}
 


6.编译运行

c#+arcengine 空间查询属性查询 c#+arcengine 空间查询属性查询c#+arcengine 空间查询属性查询 立即下载

相关推荐

ArcEngine图层属性表

C#读取图层属性表,在ArcEngine10.2.。

ArcEngine简单教程——数据属性:属性表、识别(Identify);删除图层 等功能实现

1目的 了解ArcEngine中矢量要素的字段及属性结构,了解栅格图像的数据属性及属性表 实现右击TOC可以显示数据属性表、删除图层,双击Map可以识别地图属性 2概要 本文只介绍主要功能方法,具体的调用关系、窗口实现可见 https://download.csdn.net/download/nominior/11367818 1)通过图层获取属性表,返回DataTab...

DL_GIS 6561

ArcGIS Engine + C# 实例开发教程.pdf

ArcGIS Engine + C# 实例开发教程

ArcGIS Engine二次开发(基于C#)

这是一份关于ArcGIS Engine二次开发的一份报告总结,在这份报告中包含了简单的ArcGIS功能。对数据的加载,包括矢量数据和栅格数据地图浏览功能:拉框放大、拉框缩小、平移、全图、逐级放大、逐级缩小、历史视图浏览(撤销、重做)点线面的绘制:点、圆、多边形、矩形,能分别设置颜色、样式、大小及面填充方式;书签功能选择要素:拉框选择、按多边形选择、按圆选择、按线选择,并能设置选择颜色;打开图层属性表属性查询。

yuanyuan0924的博客 1万+

ArcGIS_Engine_C#_实例开发教程

ArcGIS_Engine_C#_实例开发教程

arcgis-elasticSearch-es-矢量数据导入插件-数据建模-mapping-indexsetting-字段映射

arcgis elasticSearch es 矢量数据导入插件 数据建模 mapping indexsetting 字段映射 索引建模支持geoshape、shape,text索引支持keyword/ngram/edgeNgram/ikSmart,快速导入,兼容multipolygon,带洞,多面,使用时需要安装elasticsearch包 elasticsearch==7.5.1 urllib3==1.26.9 具体说明见文章:http://t.csdn.cn/2GUe2

实现图层属性数据表的查询显示

在ArcMap中,单击图层右键菜单中的“Open Attribute Table”命令,便可弹出属性数据表。本讲将完成类似的功能,效果如下:图1数据表显示,我们用了DataGridView控件。DataGridView控件提供一种强大而灵活的以表格形式显示数据的方式。可以使用 DataGridView控件来显示少量数据的只读视图,也可以对其进行缩放以显示特大数据集的可编辑视图。我们可以很方便地把一...

Prince的博客 4130

保姆级教程:用OpenCV的calibrateHandEye()搞定机器人手眼标定(附Python代码)

本文详细介绍了如何使用OpenCV的calibrateHandEye()函数完成机器人手眼标定,解决机械臂与相机坐标系对齐问题。教程涵盖从基础原理、数据采集到Python代码实现的完整流程,特别适合需要精确视觉引导的机器人应用开发。通过手眼标定,可确保机械臂准确抓取相机检测到的目标物体。

weixin_33712987的博客 518

ArcGIS Engine + C# 实例开发教程: 属性数据表的查询显示

ArcGIS Engine + C# 实例开发教程: 属性数据表的查询显示 在上一讲中,我们完成了图层符号选择器的制作。这一讲中,我们将实现图层属性数据表的查询显示。 在ArcMap中,单击图层右键菜单中的“Open Attribute Table”命令,便可弹出属性数据表。本讲将完成类似的功能,效果如下: 图1 数据表显示,我们用了DataGridView控件。DataGr

supernever专栏 7936

李沐之数值稳定性+模型初始化和激活函数

层记为t,这里的y不是预测,还包括了损失函数,y是优化函数,不是预测的结果y。第t层是输出。所有的h都是一些向量,向量关于向量的导数是一个矩阵,所以用了很多次的矩阵乘法,出问题就在这里。

m0_51133942的博客 1527

深入GD32/STM32引脚复用:你的JTAG/SWD接口是怎么‘消失’的?一次讲清原理与预防

本文深入解析GD32/STM32调试接口(JTAG/SWD)突然失效的原理与预防措施。通过分析MCU启动流程、引脚复用机制及典型错误代码模式,揭示调试接口'消失'的根本原因,并提供硬件设计检查清单、软件防护代码及开发流程优化方案,帮助开发者有效避免烧录失败问题。

weixin_42532938的博客 370

《ArcGIS Engine+C#实例开发教程》第八讲 属性数据表的查询显示

转载自:http://www.cnblogs.com/SunYu/archive/2010/11/26/1888573.html 第一讲 桌面GIS应用程序框架的建立 第二讲 菜单的添加及其实现 第三讲 MapControl与PageLayoutControl同步 第四讲 状态栏信息的添加与实现 第五讲 鹰眼的实现 第六讲 右键菜单添加与实现 教程Bug及优化方案1 第七讲...

weixin_34032779的博客 250

手把手教你学 Simulink (1.3)--Simulink 的模块库及其模块介绍

Simulink 提供了丰富的模块库,涵盖了从基本的信号生成和处理到复杂的数学运算和系统建模的各种功能。通过熟悉这些模块库及其模块,你可以更高效地构建和仿真动态系统。

MHD0815的博客 5153

属性数据表的查询显示(转载)

http://blog.csdn.net/Terminatorss/article/details/4400238 在ArcMap中,单击图层右键菜单中的“Open Attribute Table”命令,便可弹出属性数据表。本讲将完成类似的功能,效果如下:   图1 数据表显示,我们用了DataGridView控件。DataGridView 控件提供一种强大而灵活的以表格形式显示数据的方式...

weixin_34409822的博客 194

深入解析 OpenClaw(小龙虾)源码:架构设计与核心实现

OpenClaw用清晰、工程化的代码结构,将复杂的Agent交互流程变成了可管理、可扩展的流水线。无论是想深入了解Agent系统设计,还是希望二次开发定制自己的AI助理,阅读OpenClaw源码都是一次绝佳的学习旅程。希望本文能帮助你快速掌握OpenClaw的核心脉络。如果你对某个模块(如技能开发、安全机制)感兴趣,欢迎继续探讨。本文基于OpenClaw社区版本源码分析,具体实现可能随版本迭代有所调整,请以最新源码为准。

Ven%的博客 449

破盾实录|Vueling航空阿卡迈防护逆向:从503挑战到Cookie生成的全流程拆解

摘要:文章分享了作者在爬取西班牙伏林航空(Vueling)机票数据时,遭遇阿卡迈(Akamai)防护系统的实战经历。起初简单的请求被拦截返回503错误,分析发现阿卡迈通过混淆JS代码实施"挑战-验证"机制,需模拟真实浏览器环境才能获取有效Cookie。作者详细拆解了逆向过程:从抓包分析JS挑战流程,到破解代码混淆和控制流平坦化,最终用Python+Pyppeteer成功模拟浏览器特征,突破防护获取数据。整个过程涉及JS反混淆、环境检测绕过和Cookie生成验证等关键技术点,为类似防护系统

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1643

ArcGIS Engine + C# 实例开发教程:第八讲 属性数据表的查询显示

在上一讲中,我们完成了图层符号选择器的制作。这一讲中,我们将实现图层属性数据表的查询显示。 在ArcMap中,单击图层右键菜单中的“Open Attribute Table”命令,便可弹出属性数据表。本讲将完成类似的功能,效果如下: 图1 数据表显示,我们用了DataGridView控件。DataGridView 控件提供一种强大而灵活的以表格形式显示数据的方式。可以使用 DataGri

yulongguiziyao的专栏 1773

工业缺陷标注要人命?我从零搭了一套自动标注系统,标注效率直接提升10倍

你是不是也深陷工业缺陷标注的无尽内耗?这不是个例,工业视觉项目落地,80%的时间和成本,都耗在了数据标注环节。普通的图像标注(猫狗分类、人脸识别),标注门槛低、规则简单、一致性要求宽松;而工业缺陷标注,是CV领域公认的地狱级难度:缺陷尺寸小到几像素、种类繁杂且非标、行业专业性极强、标注精度要求到像素级、正负样本极度不均衡,人工标注不仅效率低、成本高,更直接决定了模型的最终上限。我在工业视觉行业摸爬滚打了6年,踩遍了人工标注的所有坑,最终从零搭建了一套工业缺陷专用的闭环自动标注系统,把原来一张图30分钟的标注

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 203

jxWebUI--数据表

jxWebUI--数据表

jxandrew的专栏 695

如何用matlab扫频法测考虑频率耦合的并网逆变器的序阻抗,如何实现?

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!

**My Coding Family** 1194

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

oracle中hidden_column,ColumnHidden 属性 (权限)

ColumnHidden 属性 (权限)ComboBox.ColumnHidden property (Access)02/20/2019本文内容ColumnHidden 属性可用于显示或隐藏数据表视图中的指定的列。You can use the ColumnHidden property to show or hide a specified column in Datasheet view. ...

weixin_35803802的博客 763

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

数据表中通过关联查询到每个外键ID所指的name以及其他属性

之前我在网上百度,想要找到一个合适的方法老是找不到,自己现在解决了,在这里记录一下。 前提条件: 我有一张歌曲表、一张专辑表、一张歌手表。 其中歌曲表中有两个外键song_albumId、song_singerId,分别对应后两张表的两个主键album_id、singer_id。 歌曲表: 专辑表: 歌手表: 问题引入: 当我查询歌曲时,如果按常规查询套路,查询歌曲进行排序对应的SQL语句为: select * from song_table ORDE...

小jiang的博客 1591

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

上一篇: NHibernate中使用事务
下一篇: c#结构与类的区别
群龙
博客等级 码龄18年 22粉丝 6原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值