ArcEngine 查询要素图层某个字段的唯一值

ArcGIS按属性查询中有列出字段唯一值的功能,在教学案例中给出了一段实现代码,

//使用FeatureClass对象的IDataset接口来获取dataset和workspace的信息
IDataset dataset = (IDataset)currentFeatureLayer.FeatureClass;
//使用IQueryDef接口的对象来定义和查询属性信息。通过IWorkspace接口的CreateQueryDef()方法创建该对象。
IQueryDef queryDef = ((IFeatureWorkspace)dataset.Workspace).CreateQueryDef();
//设置所需查询的表格名称为dataset的名称
queryDef.Tables = dataset.Name;
//设置查询的字段名称。可以联合使用SQL语言的关键字,如查询唯一值可以使用DISTINCT关键字。
queryDef.SubFields = currentFieldName ;
//执行查询并返回ICursor接口的对象来访问整个结果的集合
ICursor cursor = queryDef.Evaluate();
//使用IField接口获取当前所需要使用的字段的信息
IFields fields = currentFeatureLayer.FeatureClass.Fields;
IField field = fields.get_Field(fields.FindField(currentFieldName));

//对整个结果集合进行遍历,从而添加所有的唯一值
//使用IRow接口来操作结果集合。首先定位到第一个查询结果。
IRow row = cursor.NextRow();
//如果查询结果非空,则一直进行添加操作
while (row != null)
{
    //对String类型的字段,唯一值的前后添加'和',以符合SQL语句的要求
    if (field.Type == esriFieldType.esriFieldTypeString)
    {
        listBoxValues.Items.Add("\'" + row.get_Value(0).ToString() + "\'");
    }
    else
    {
        listBoxValues.Items.Add(row.get_Value(0).ToString());
    }
    //继续执行下一个结果的添加
    row = cursor.NextRow();
}

作为Engine的初学者觉得有点看不懂,怎么办。。。用之前学的基础知识写一段看的懂的。。。

//获取要素图层的源
IFeatureClass feclass = currentFeatureLayer.FeatureClass;
//根据源数据创建游标
IFeatureCursor cusro = feclass.Search(null, true);
IFeature fea = cusro.NextFeature();
//获取源数据的所有字段
IFields fields = currentFeatureLayer.FeatureClass.Fields;
//获取所选字段的Index
int index = fields.FindField(currentFieldName);

while (fea != null)
{
    string str;
    str = fea.get_Value(index).ToString();
    //如果值列表中还没有str这个值
    if (!listBoxValues.Items.Contains("\'" + str + "\'"))
    {
        //将str加入到值列表,并且str前后加上单引号
        listBoxValues.Items.Add("\'" + str + "\'");
    }
    fea = cusro.NextFeature();
}

其实之后再看了两遍教学代码还是能看的懂得,不过找替代方法不失为一种复习知识点的办法。


今天继续测试的时候发现这两段代码不是等效的,第一段代码只能对.gdb数据库中的要素类进行查询而不能直接查询shp文件,第二段代码是可以查询数据库中的要素类也可以查询单独的shp文件。尝试修改第一段代码,奈何初学者水平有限没有成功,以后有想法修改成功再贴上来。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ArcEngine中实现点要素层的唯一符号化,您可以按照以下步骤进行操作: 1. 打开要素类并获取要素集合。使用IFeatureClass接口打开要素类,并使用IFeatureCursor接口获取要素集合。 ```csharp IFeatureClass featureClass = ...; // 打开要素类 IFeatureCursor featureCursor = featureClass.Search(null, false); // 获取要素集合 ``` 2. 创建唯一符号化渲染器。使用ISimpleRenderer接口创建一个新的SimpleRenderer对象,并使用IUniqueValueRenderer接口将其转换为唯一符号化渲染器。 ```csharp ISimpleRenderer simpleRenderer = new SimpleRenderer(); IUniqueValueRenderer uniqueValueRenderer = simpleRenderer as IUniqueValueRenderer; ``` 3. 设置字段和符号。指定用于唯一分类的字段,并为每个唯一设置符号。 ```csharp uniqueValueRenderer.FieldCount = 1; // 设置字段数量 uniqueValueRenderer.set_Field(0, "FieldName"); // 设置用于分类的字段名称 // 为每个唯一设置符号 ISymbol symbol = ...; // 设置符号 uniqueValueRenderer.AddValue("Value1", "", symbol); // 添加第一个唯一和对应的符号 uniqueValueRenderer.AddValue("Value2", "", symbol); // 添加第二个唯一和对应的符号 // ... // 可以重复上述步骤为更多唯一设置符号 ``` 4. 应用渲染器到层。获取要素层对象,并将唯一符号化渲染器应用到层的渲染器属性中。 ```csharp IFeatureLayer featureLayer = ...; // 获取要素层对象 featureLayer.Renderer = uniqueValueRenderer as IFeatureRenderer; // 应用渲染器到层 ``` 5. 刷新地并显示唯一符号化的结果。调用IMap接口的Refresh方法刷新地,并使用IActiveView接口的Refresh和PartialRefresh方法来更新显示。 ```csharp IMap map = ...; // 获取地对象 map.Refresh(); // 刷新地 IActiveView activeView = map as IActiveView; activeView.Refresh(); // 刷新活动视 activeView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, null); // 部分刷新,更新地理数据 ``` 请根据您的具体需求自行填充代码中的缺失部分,例如打开要素类、设置字段和符号等。希望这些信息对您有所帮助!如有其他问题,请继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值