ArcEngine查询、添加、删除要素的方法
1、查找数据
1)、利用FeaturCursor进行空间查询
//空间查询
ISpatialFilter spatialFilter = new SpatialFilterClass();
spatialFilter.Geometry = envelope;//指定几何体
String shpFld = featureClass.ShapeFieldName;
spatialFilter.GeometryField = shpFld;
spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;//相交
IQueryFilter queryFilter = new QueryFilterClass();
queryFilter = (IQueryFilter)spatialFilter;
IFeatureCursor searchCursor = featureClass.Search(queryFilter, true);
IFeature feature = searchCursor.NextFeature(); int n = ;
while (feature != null){
n++;
feature = baseCursor.NextFeature();
}
2)、利用FeatureCursor在选择集中进行查询
IFeatureSelection pFeatureSelectio = pFeatureLayer as IFeatureSelection;
ICursor ppCursor;
pFeatureSelectio.SelectionSet.Search(null, false, out ppCursor);
IFeatureCursor pFeatureCursor = ppCursor as IFeatureCursor;
IFeature pFeature = pFeatureCursor.NextFeature();
3)、利用FeatureCursor进行属性查询
IQueryFilter pQueryFilter = new QueryFilterClass();
pQueryFilter.WhereClause = "PROJECTCODE = '" + this.ProjectNumTextBox.Text.Trim() + "'";
IFeatureCursor pFeatureCursor = LineFeaClass.Search(pQueryFilter, false);
IFeature pFeatureIfExit = pFeatureCursor.NextFeature();
用Environment.TickCount进行代码执行时间测试,结果发现4)读取整个表的时间为4984ms,而 3)读取同一个属性给的时间仅为32 ms,3)的执行效率是法一的156倍!!!
完整测试代码如下:
IFeatureLayer pLayer = Utilities.GetLayerByName((string)cmbRegLayers.SelectedItem, m_mapControl) as IFeatureLayer;
IFeatureCursor FCursor = pLayer.FeatureClass.Search(new QueryFilterClass(), false);
IFeature feature = FCursor.NextFeature(); int t = Environment.TickCount; object clsFldValue=null;
for (int i = ; i < pLayer.FeatureClass.FeatureCount(null); i++)
{
clsFldValue = feature.get_Value();
feature = FCursor.NextFeature();
} t = Environment.TickCount - t;
MessageBox.Show(t.ToString()); ITable pTable = pLayer.FeatureClass as ITable; t = Environment.TickCount; for (int i = ; i < pTable.RowCount(null); i++)
clsFldValue = pTable.GetRow(i).get_Value();
t = Environment.TickCount - t;
MessageBox.Show(t.ToString());
4)属性表的方法读取属性值
ITable pTable = pLayer.FeatureClass as ITable;
clsFldValue = pTable.GetRow(i).get_Value(clsFldIndex);
2、 插入数据
ArcGIS Engine中,主要有两个方法用于要素的添加:
- Using IFeatureClass.CreateFeature followed by IFeature.Store
- Using IFeatureClass.CreateFeatureBuffer with an insert cursor
批量插入feature,如果用feature.store()方法,在图层中一个个地插入要素,较之同时使用insert cursor与feature buffer方法,会慢很多。
因为后者触发的事件和复杂行为比较少(比如说没有引发因拓扑关系产生的行为)。
1)、利用Insert Cursors和featureBuffer
IFeatureBuffer featureBuffer = featureClass.CreateFeatureBuffer();
IFeatureCursor featureCursor = featureClass.Insert(true);
object featureOID;
featureBuffer.set_Value(featureBuffer.Fields.FindField("InstBy"), "B Pierce");
for (int ic = ; ic < ; ic++)
{
featureBuffer.Shape = geometry;
featureOID = featureCursor.InsertFeature(featureBuffer);
}
featureBuffer.set_Value(featureBuffer.Fields.FindField("InstBy"), "K Johnston");
for (int ic = ; ic < ; ic++)
{
featureBuffer.Shape = geometry
featureOID = featureCursor.InsertFeature(featureBuffer);
}
featureCursor.Flush();
2)、直接进行数据插入(Feature.Store方法)
IFeature newLineFeature = LineFeaClass.CreateFeature(); newLineFeature.Shape = pFeature.Shape;
int ii = newLineFeature.Fields.FindField(AreaZonalName); if (ii > )
{
newLineFeature.set_Value(ii, this.AnalysAreaComboBox.Text.Trim());
} newLineFeature.Store();
注:最好将编辑操作对象中,如下:
IDataset dataset = (IDataset)featureClass;
IWorkspace workspace = dataset.Workspace;
// Cast the workspace to the IWorkspaceEdit interface.
IWorkspaceEdit workspaceEdit = (IWorkspaceEdit)workspace;
// Start an edit session and edit operation.
workspaceEdit.StartEditing(true);
workspaceEdit.StartEditOperation();
//在这里编写添加要素的代码。。。。。。。。。。。
// Stop editing.
workspaceEdit.StopEditOperation();
workspaceEdit.StopEditing(true);
3、数据删除 delete
删除feature,一个个删除就用IFeature.Delete方法即可,此处不再赘述,只写一种批量删除的方法,用于ITable是针对数据库进行操作的,所以速度很快。
The best approach to take when deleting features depends on two factors, how many features are being deleted and whether the data source is a local geodatabase or an ArcSDE geodatabase.
In the simplest case, a single feature that has already been retrieved can be deleted by callingIFeature.Delete. If bulk features are being deleted and the geodatabase is an ArcSDE geodatabase, the most efficient approach requires the use of a search cursor and the IFeature.Delete method.
On the other hand, if the geodatabase is a local geodatabase (a file or personal geodatabase), the most efficient method for bulk deletion is theITable.DeleteSearchedRows method.
方法1 ITable方法
///<summary>
///删除某featurelayer中所有feature
///</summary>
///<param name="pLayer">操作的涂层</param>
///<remarks>该方法可以给一个queryfilter,进行删除符合条件的features</remarks>
private void DeleteAllFeatures(IFeatureLayer pLayer, <code></code>IQueryFilter queryFilter)
{
ITable pTable = pLayer.FeatureClass as ITable;
pTable.DeleteSearchedRows(queryFilter);
}
方法2 迭代featureClass方法
IFeatureClass featureClass = featureWorkspace.OpenFeatureClass("Parcels");
IQueryFilter queryFilter = new QueryFilterClass();
queryFilter.WhereClause = "ZONING_S = 'R'";
IFeatureCursor updateCursor = featureClass.Update(queryFilter, false);
IFeature feature = updateCursor.NextFeature();
int m = ;
while (feature != null)
{
m++;
updateCursor.DeleteFeature(feature);
feature = updateCursor.NextFeature();
}
4、 数据更新 update
4.1 逐条更新记录
这种方式中可有三种方法,如下:
(1)
for (int i = ; i < pTable.RowCount(null); i++)
{
pRow = pTable.GetRow(i);
pRow.set_Value(, i + );
pRow.Store();
}
(2)
IFeatureCursor FCursor = pLayer.FeatureClass.Search(new QueryFilterClass(), false);
IFeature feature = FCursor.NextFeature(); for (int i = ; i < featureNum; i++)
{ feature.set_Value(, i);
feature.Store();
feature = FCursor.NextFeature();
}
(3)
ICursor pCursor =pTable.Update(null, false);
pRow = pCursor.NextRow();
for (int i = ; i < pTable.RowCount(null); i++)
{
pRow.set_Value(, i + );
pCursor.UpdateRow(pRow);
pRow = pCursor.NextRow();
}
试验数据为320条记录,三种方法的运行时间为:法(1)为40297ms;法(2)34922ms为;法(3)为219ms.
可见运用IFeature和IRow的Store方法更新速度都很慢,用ICursor 的UpdateRow方法速度很快,分别是前两者效率的184倍、159倍!!
4.2 批量更新记录
IFeatureClass featureClass = featureWorkspace.OpenFeatureClass("Parcels"); // 属性查询
IQueryFilter queryFilter = new QueryFilterClass();
queryFilter.WhereClause = "ZONING_S = 'U'"; //利用FeatureCursor进行数据更新
IFeatureCursor updateCursor = featureClass.Update(queryFilter, false);
int fieldindex = featureClass.FindField("ZONING_S");
IFeature feature = updateCursor.NextFeature();
int m = ; while (feature != null)
{
m++;
feature.set_Value(fieldindex, "X");
updateCursor.UpdateFeature(feature);
feature = updateCursor.NextFeature();
}
当将一批数据更新为某一相同的属性时,使用ITable.UpdateSearchedRows效率会很高。
// Find the position of the field that will be updated.
int typeFieldIndex = featureClass.FindField("TYPE"); // Create a query filter defining which fields will be updated
// (the subfields) and how to constrain which rows are updated
// (the where clause).
IQueryFilter queryFilter = new QueryFilterClass
{
SubFields = "TYPE", WhereClause = "LANE_COUNT = 4"
}; // Create a ComReleaser for buffer management.
using(ComReleaser comReleaser = new ComReleaser())
{
// Create a feature buffer containing the values to be updated.
IFeatureBuffer featureBuffer = featureClass.CreateFeatureBuffer();
featureBuffer.set_Value(typeFieldIndex, "Highway");
comReleaser.ManageLifetime(featureBuffer); // Cast the class to ITable and perform the updates.
ITable table = (ITable)featureClass;
IRowBuffer rowBuffer = (IRowBuffer)featureBuffer;
table.UpdateSearchedRows(queryFilter, rowBuffer);
}
参考文章
ArcGIS Engine效率探究——要素的添加和删除、属性的读取和更新
ArcEngine查询、添加、删除要素的方法的更多相关文章
- js动态给table添加/删除tr的方法
js动态给table添加/删除tr的方法. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> ...
- mysql 查询 添加 删除 语句
1.说明:创建数据库CREATE DATABASE database-name2.说明:删除数据库drop database dbname3.说明:备份sql server--- 创建 备份数据的 d ...
- js 查询 添加 删除 练习
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- JAVA连接MYSQL,查询 ,添加,删除,语句
package com; import Java.sql.*;/** *//** * @author Administrator */public class ggg { private ...
- python 对过时类或方法添加删除线的方法
class Cat(Animal): def __init__(self): import warnings warnings.warn("Cat类带删除线了", Deprecat ...
- JS原生添加删除class的方法
之前习惯了使用jquery的addClass的方法,然后就去找了下别人写的代码. [javascript] view plain copy function hasClass(obj,cls) { r ...
- 【225】ArcEngine 实现要素添加 & 删除
参考:ArcGIS Engine效率探究——要素的添加和删除.属性的读取和更新 删除要素 //添加图层,显示在最上面 axMapControl1.AddShapeFile(@"D:\01-业 ...
- ArcGIS Engine中删除要素的几种方法总结
转自原文 ArcGIS Engine中删除要素的几种方法总结 /// <summary> /// 通过IFeature.Delete方法删除要素 /// </summary> ...
- ArcEngine数据删除几种方法和性能比较
转自原文 ArcEngine数据删除几种方法和性能比较 一. 几种删除方法代码 1. 查询结果中删除 private void Delete1(IFeatureClass PFeatureclas ...
随机推荐
- 3DSoftRenderer
研究了好几天基本的图形学,对于光栅化的大致过程有点了解了,很感谢网上的很多大牛的无私奉献,我就写一下这几天的总结,希望也能对网络上的知识做出一点点点的贡献. 屏幕有什么特点,无非是一排排的像素点,每个 ...
- python学习笔记7(使用字符串)
一.字符串格式化,在%左侧放置一个字符串,右侧放置希望格式化的值. >>> format = 'Hello,%s,%s enough for ya?' >>> va ...
- android项目在eclipse下编译运行的问题
JDK与电脑系统要匹配,都是32位或者64位: android工程要与JDK相匹配,如果之前的android工程使用的jdk版本较高,则可能出现一些包或者类.方法.属性对应不上而报错,Android ...
- iOS 支付宝应用(备用参考)
1:先与支付宝签约,获得商户ID(partner)和账号ID(seller) 2:下载相应的公钥私钥文件(加密签名用) 3:下载支付宝SDK 4:生成订单信息5:调用支付宝客户端,由支付宝客户端跟支付 ...
- WdatePicker 设置开始时间和结束时间
开始时间: <input type="text" placeholder=" -请选择- " readonly="readonly" ...
- unity3d引擎程序员养成
标准流程:1. c++ Primer 英文版(第四或第五版)全部看完习题做完是必须的.渲染程序设计比较复杂,后期会用到c++的全部特性.c++学的越好后面越轻松.要看英文版,计算机翻来覆去就那么几个单 ...
- Java中怎样判断一个字符串是否是数字?
1:正则表达式 public static void main(String[] args) { String str = "123456456456456456"; boolea ...
- SQL 聚集函数使用
SQL 聚集函数使用 (2009-04-14 15:50:36) 转载▼ 总结: 在SQL语句中同时包含where子句,groupby子句,having子句及聚集函数时的执行顺序: 1.按WHER ...
- 如何在JavaScript里防止事件函数的高频触发和调用
网页中JavaScript最基本的功能是监听或响应用户的动作,这非常的有用.用户的动作有些频率非常高,有的十分罕见.有些监听器函数的执行如闪电般完成,而有些繁重的会把浏览器拖死.拿浏览器窗口的resi ...
- uc/os 任务删除
问题描述: uc/os 任务删除 问题解决: uc/os任务删除流程图 具体代码 注: 如上是关中断,以及取消优先级对应的就绪标志 关中断代码为: 取消就绪标志,实际上是将就绪表中指定 ...