转载:
http://blog.csdn.net/mydriverc/archive/2007/07/26/1709210.aspx
评论;我试验了,其实可以使用IqueryFilter.subField="distinct(FiledName)"直接Search 就行
有时我们需要读取图层中某个字段的所有值的唯一值集合,或做统计用途,或作为其他功能的输入。
一般通过IDataStatistics接口来获取唯一值集合,代码如下:
''' <summary>
''' 通过IDataStatistic接口获取图层指定字段的唯一值
''' </summary>
''' <param name="pFeatureLayer">目标图层</param>
''' <param name="strField">目标字段名</param>
''' <returns>目标字段的所有值的唯一值集合</returns>
''' <remarks></remarks>
Public Function GetUVByDataStatistics()Function GetUVByDataStatistics(ByVal pFeatureLayer As IFeatureLayer, ByVal strField As String) As IList(Of String)
Dim uvList As IList(Of String) = New List(Of String)
Dim pQueryFilter As IQueryFilter = New QueryFilter
Dim pFeatureCur As IFeatureCursor
pQueryFilter.SubFields = strField
pFeatureCur = pFeatureLayer.FeatureClass.Search(pQueryFilter, True)
Dim pDataStatic As IDataStatistics = New DataStatistics
pDataStatic.Field = strField
pDataStatic.Cursor = pFeatureCur
Dim pEnumvar As System.Collections.IEnumerator = pDataStatic.UniqueValues
pEnumvar.Reset()
While pEnumvar.MoveNext
Dim pObj As Object = pEnumvar.Current
uvList.Add(pObj.ToString)
End While
Return uvList
End Function
但当图层的数据量很大时,以上这种方法执行起来速度较慢,性能影响比较明显,得考虑使用另外一种方法。通过IQueryDef接口使用类似SQL的查询语句来获取图层字段的唯一值集合,执行速度等同于执行SQL查询语句。
''' <summary>
''' 通过IQueryDef接口查询字段的唯一值
''' </summary>
''' <param name="pFeatureLayer">目标图层</param>
''' <param name="strField">目标字段名</param>
''' <returns>目标字段的所有值的唯一值集合</returns>
''' <remarks></remarks>
Public Function GetUVByQueryDef()Function GetUVByQueryDef(ByVal pFeatureLayer As IFeatureLayer, ByVal strField As String) As IList(Of String)
Dim uvList As IList(Of String) = New List(Of String)
Dim pQueryDef As IQueryDef
Dim pRow As IRow
Dim pCursor As ICursor
Dim pFeatureWorkspace As IFeatureWorkspace
Dim pDataset As IDataset
pDataset = pFeatureLayer.FeatureClass
pFeatureWorkspace = pDataset.Workspace
pQueryDef = pFeatureWorkspace.CreateQueryDef
With pQueryDef
.Tables = pDataset.Name ' Fully qualified table name
.SubFields = "DISTINCT(" & strField & ")"
pCursor = .Evaluate
End With
pRow = pCursor.NextRow
While Not pRow Is Nothing
Dim pObj As Object = pRow.Value(0)
uvList.Add(pObj.ToString)
pRow = pCursor.NextRow
End While
Return uvList
End Function
转载:
http://www.southgis.com/bz/199.html
对于关系数据库,ArcEngine定义了几种查询接口:
1. 常规的ITable、IFeatureClass接口
这是我们最常使用的,完成同一个表内的数据查询、更新操作。假设之前已定义IFeaturWorkspace pFWork,并已赋值。
ITablepTab=pFWork.OpenTable("DLTB");
IQueryFilter pqf=new QueryFilterClass();
pqf.WhereClause="DLBM like '01_'";
ICursor pCur=pTab.Search(pqf,true);
2. IWorkspace.ExecuteSQL
能够执行关系数据库的所有DDL和DML类SQL语句。由于通过此函数执行SQL语句时会绕过ArcEngine的存储机制,可能会破坏SDE数据的一致性(主要在更新SDE的系统表记录时),因此必须慎用。
另外,由于此函数执行后不返回结果,决定了用此函数不能执行查询语句。
//下面执行向DLJX的历史档案表中更新记录(SqlServer语法)。
//作用是:给创建时间在2009-7-13之后已删除的记录的创建时间改为2009-1-1
//假设之前已定义IWorkspace pWork,并已赋值。
pWork.ExecuteSQL("update DLJX_H set GDB_FROM_DATE='2009-1-1'
where objectid=2andGDB_FROM_DATE>'2009-7-13' and GDB_TO_DATE<'9999-12-31' ");
//下面创建一个表pWork.ExecuteSQL("CREATE TABLE IDS(ID BIGINT NOT NULL, BINDTYPE VARCHAR(20))");
3. 用IQueryDef接口执行各种查询
通过IQueryDef可以执行SQL数据库引擎所支持的所有查询,并且如果查询的表是要素类,还会正确返回要素类的最新数据(即使要素类启用了版本管理,且数据不更新到基表)。
并且还能执行一些有用的查询。举例如下:
//查询要素类数据
//假设之前已定义IWorkspace pWork,并已赋值
IQueryDef pQDef=pFWork.CreateQueryDef();
pQDef.Tables="DLJX";
pQDef.WhereClause="JXLX='97'";
ICursor pCur=pQDef.Evaluate();
//判断某个表是否存在(如果此表未登记成GeometryTable,通过IWorkspace2.NameExists可能获取不到)
pQDef.SubFields = "id";
pQDef.Tables = "sysobjects";
pQDef.WhereClause = "id = object_id(N'IDS') and OBJECTPROPERTY(id, N'IsUserTable') = 1";
ICursor pCur=pQDef.Evaluate();
IRow pRow = pCur.NextRow();
if (pRow != null) {bExist = true;}
//聚合查询
//注意:对返回字段的处理,由于ArcEngine只简单的以逗号切分了SubFields内容,//因此,如果包含有逗号时,字段名需要依次后推,且不支持字段别名定义
pQDef.SubFields = "count(*),sum(TDZMJ),sum(KZZMJ),left(ZLDWDM,6)";
pQDef.Tables = "DLTB group by left(ZLDWDM,6)";ICursor pCur=pQDef.Evaluate();
针对上面所返回的ICursor,实际记录虽然只有四个字段,但ICursor.Fields却有五个元素,各字段名为:count(*)、sum(TDZMJ)、sum(KZZMJ)、left(ZLDWDM、6)因此要取第四个字段的值,需要这样:int iInx=pCur.FindField("left(ZLDWDM");
IRow pRow=pCur.NextRow();
string sDM=pRow.get_Value(iInx).ToString();
//多表联接查询
pQDef.Tables="DLTB a left join XZQ b on
a.ZLDWDM=b.XZQDM"
ICursor pCur=pQDef.Evaluate();
4. 使用ArcEngine的统计类(实现了IDataStatistics接口)
//假设之前已定义IFeaturWorkspace pFWork,并已赋值
ITable pTab=pFWork.OpenTable("DLTB");
ICursor pCur=pDLTBTable.Search(null,false);
IDataStatistics pDataStat = new DataStatisticsClass();
pDataStat.Field = "MJ";
pDataStat.Cursor = pCur;
IStatisticsResults pRes = dataStatistics.
Statistics;
//之后可以调用接口相关方法,比如计数:pRes.Sum
在实际应用中,第1种和第3种方法使用最多,基本上能满足大多的数据查询需求。
第4种方法完全用第3种方法,但如果应用需要适应多种数据库类型的话,使用第4种方法更方便,但性能肯定没有第3种方法高,并且第4种方法不能进行多表联合查询。个人认为,除了获取惟一值外,其它情况都可用第3种方法解决,如果出现不同数据库类型,查询语法格式不一致时,可以通过动态判断数据库类型实现分支实现多个版本。
第2种方法,在一般情况下不建议使用。原因是由于没有返回值,主要用于数据库维护或记录更新操作。这在SDE体系外进行的操作,一不小心就会破坏SDE数据结构的完整性、一致性。但也不能说此方法无用武之地了,做为其它方法的补充,可以用在存贮过程、视图、SDE体系之外的自定表的创建上,另外,对SDE系统表熟悉的话,可以进行一些底层的维护,比如修改历史表记录的时间戳,修改锁等。
分享到:
相关推荐
本主题将深入探讨“arcengine 唯一值渲染符号化源码”,这是一种用于地图视觉表现的重要技术,特别是在处理分类数据时。ArcEngine结合了C#编程语言和DevExpress控件库,提供了丰富的开发工具和界面元素。 唯一值...
2. **唯一值渲染**:根据属性字段的特定值,为每种不同的值分配不同的符号。比如,不同的城市用不同的颜色表示。 3. **分级渲染**:基于属性字段的连续数值,将数据划分为若干等级,并为每个等级分配不同的符号或...
ArcEngine栅格数据渲染,包括RGB渲染、分类色带渲染、唯一值渲染、拉伸渲染等。
本文将深入探讨ArcEngine如何实现各种专题图,包括点密度图、饼图、柱状图、唯一值图、比例图、分级色彩图和分级符号图,并重点介绍使用C#语言和ArcEngine 10.0实现这些功能的源码细节。同时,我们将提及TocControl...
这通常涉及查询图层中的记录,获取指定字段的唯一值及其出现的频率。 2. **数据处理**:计算每个唯一值的数量,这可以通过遍历图层中的特征并计数实现。将这些数据存储在一个适合的数据结构中,如Dictionary或List...
在探讨《ArcScene+AE+唯一值符号化》这一主题时,我们首先需要理解几个核心概念:ArcScene、AE(ArcEngine)、唯一值符号化,以及它们如何在地理信息系统(GIS)开发中协同工作。 ### ArcScene ArcScene是Esri ...
在本专题中,我们将深入探讨如何利用C#语言和ArcEngine 10.0实现各种类型的专题图,包括点密度图、饼图、柱状图、唯一值图、比例图、分级色彩图以及分级符号图,并了解如何集成TocControl的右键菜单功能。...
4. 地图着色:提供了六种不同的着色方法,如单一值、唯一值、分类、柱状图、点密度和组合着色,增强了地图的视觉表达能力。 5. 叠加分析:通过选择输入图层、叠加图层、选择叠加操作和结果名称,可以进行复杂的地理...
标题与描述均提到了“ArcEngine对象模型”,这暗示了我们正在探讨的是ArcGIS Engine中的对象模型,这是ESRI提供的一套用于开发地理信息系统(GIS)应用的组件库。ArcGIS Engine通过COM(Component Object Model)...
本文将探讨 ArcEngine 中的动态标注技术,解决动态标注的问题,并分析标注内容的唯一性问题。 动态标注技术: 动态标注是 ArcEngine 中的一种强大功能,允许用户根据需要动态生成标注内容。通过使用 ArcEngine 的...
### ArcEngine专题地图(简单渲染) #### 概述 在地理信息系统(GIS)领域中,专题地图是一种专门用来表示特定主题或数据集的地图类型。它能够有效地将复杂的数据转化为直观的视觉信息,帮助用户更好地理解和分析...
使用VS C# 2012 ArcEngine10.2二次开发,实现地块融合dissolve或merge,含源代码和测试数据,方便ArcEngine二次开发学习和应用。 图形融合功能:处理一个图层,将某字段属性值相同的多个地块进行自动融合成一个地块...
《ArcEngine/Server二次开发与唯一值专题图详解》 在GIS领域,ArcEngine和ArcGIS Server是Esri公司推出的强大地理信息系统开发平台,广泛应用于地图制作、空间数据管理及地理分析等多个方面。本专题主要探讨Arc...
根据提供的文件信息,我们可以深入探讨ArcEngine 9.2中的专题图示例,特别是其中涉及的两种渲染技术:点密度渲染(Dot Density Rendering)和唯一值渲染(Unique Value Rendering)。 ### 一、点密度渲染 (Dot Density ...
在ArcScene中,二维数据可以通过拉伸功能转换为3D模型,拉伸值可以根据常数、属性字段或Z值来设定。在ArcObjects中,通过设定Geometry对象的Z值来构建3D几何对象。例如,以下代码演示如何使用多片构建一个房子的3D...
基于ArcEngine的GIS软件二次开发 实现地图符号化功能(包括简单渲染、唯一值渲染、成比例符号渲染、点密度渲染、柱状图渲染、多比例尺渲染) 多比例尺渲染 需要 等待一段时间! 运行前请先将USA文件夹复制到E盘根...
ArcGIS Engine 提供了创建缓冲区的功能,开发者可以通过编程设置缓冲距离、形状等参数,以生成缓冲区并进行后续的空间查询、统计分析等操作。 三、叠置分析 叠置分析是GIS中处理多层地理数据的重要手段,它将不同...