http://blog.csdn.net/lk103852503/article/details/6566652

在写一个对属性表的统计函数时,发现执行速度奇慢无比,百思不得其解,其实算法并不复杂,后来逐句排查终于发现竟是Arcengine的函数读取属性值的问题。

在获取属性表的值时有多种方法:

方法一:

ITable pTable = pLayer.FeatureClass as ITable;

clsFldValue = pTable.GetRow(i).get_Value(3);

方法二:

IFeatureCursor FCursor = pLayer.FeatureClass.Search(new QueryFilterClass(), false);

IFeature feature = FCursor.NextFeature();

if (feature == null) return null;

clsFldValue = feature.get_Value(clsFldIndex);

feature = FCursor.NextFeature();

用Environment.TickCount进行代码执行时间测试,结果发现方法一读取整个表的时间为4984ms,而方法二读取同一个属性给的时间仅为32 ms,法二的执行效率是法一的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 = 0; i < pLayer.FeatureClass.FeatureCount(null); i++)

{

clsFldValue = feature.get_Value(3);

feature = FCursor.NextFeature();

}

t = Environment.TickCount - t;

MessageBox.Show(t.ToString());

ITable pTable = pLayer.FeatureClass as ITable;

t = Environment.TickCount;

for (int i = 0; i < pTable.RowCount(null); i++)

clsFldValue = pTable.GetRow(i).get_Value(3);

t = Environment.TickCount - t;

MessageBox.Show(t.ToString());

至于为什么使用ITable 读取属性值速度如此之慢,不得而知,望有高人指点。

另外,在ESRI中国社区中也有一帖子讨论执行速度的问题,或者能为类似问题做些提示。此贴内容如下:

目标是想将原数据库中的点信息(x,y经纬度坐标,度格式),添加到FeatureClass中,数据库中大概有10000条数据,全部添加到FeatureClass中大概需要半小时以上

DataSet ds = loadExcel("d://aaa.xls");

IFeature feature = featureClass.CreateFeature();

IFields fields = featureClass.Fields;

for(int i=0;i<ds.Tables[0].Rows.Count;i++)

{

DataRow row = ds.Tables[0].Rows[i];

string xl = Convert.ToString(row[0]);

string x = Convert.ToDouble(row[1]);

string y = Convert.ToDouble(row[2]);

//....其它数据库中字段

//创建点对象

IPoint point = new PointClass();

point.X = x;

point.Y = y;

//设置Fields域

feature.set_Value(fields.FindField("线路"),xl);

feature.set_Value(fields.FindField("经度"),x);

feature.set_Value(fields.FindField("纬度"),y);

//保存点对象

feature.Shape = point;

feature.Store();

}

改进后:

DataSet ds = loadExcel("d://aaa.xls");

IFeatureBuffer featureBuffer;

IFeatureCursor cur = featureClass.Insert(true);

IPoint point;

IFields fields = featureClass.Fields;

for(int i=0;i<ds.Tables[0].Rows.Count;i++)

{

DataRow row = ds.Tables[0].Rows[i];

string xl = Convert.ToString(row[0]);

string x = Convert.ToDouble(row[1]);

string y = Convert.ToDouble(row[2]);

//....其它数据库中字段

//创建点对象

point = new PointClass();

point.X = x;

point.Y = y;

featureBuffer = featureClass.CreateFeatureBuffer();

//设置Fields域

featureBuffer.set_Value(fields.FindField("线路"),xl);

featureBuffer.set_Value(fields.FindField("经度"),x);

featureBuffer.set_Value(fields.FindField("纬度"),y);

//保存点对象

featureBuffer.Shape = point;

cur.InsertFeature(featureBuffer);

}

可以看出改进后使用了eatureClass.CreateFeatureBuffer方法,使效率大大提高。

Arcengine效率探究之一——属性的读取(转载)的更多相关文章

  1. 【转载】Arcengine效率探究之二——属性的更新

    文转载自hymyjl2010<Arcengine效率探究之二——属性的更新>   修改一批要素的属性有多种方法,当数据量较大时,若选择不当可能会大大影响速度. 一.IRowBuffer 方 ...

  2. Arcengine效率探究之二——属性的更新(转载)

    http://blog.csdn.net/lk103852503/article/details/6570748 修改一批要素的属性有多种方法,当数据量较大时,若选择不当可能会大大影响速度. 一.IR ...

  3. ArcGIS Engine效率探究——要素的添加和删除、属性的读取和更新

    ArcGIS Engine效率探究——要素的添加和删除.属性的读取和更新 来自:http://blog.csdn.net/freewaywalker/article/details/23703863 ...

  4. java属性文件读取,属性修改

    /** * 属性文件读取 * @author bestmata * */ public class CommUtil { private static Logger logger=Logger.get ...

  5. 用元类和__getattribute__改变类属性的读取方式

    首先,需要知道两点: 类本身是type类的实例 __getattribute__ 可以改变类实例的属性的读取方式(http://www.cnblogs.com/blackmatrix/p/568148 ...

  6. pre-commit 钩子,代码质量检查:在 vue-cli 3.x 版本中,已经使用尤大改写的yorkie,yorkie实际是fork husky,然后做了一些定制化的改动,使得钩子能从package.json的 "gitHooks"属性中读取

    pre-commit 钩子,代码质量检查:在 vue-cli 3.x 版本中,已经使用尤大改写的yorkie,yorkie实际是fork husky,然后做了一些定制化的改动,使得钩子能从packag ...

  7. 使用jQuery匹配文档中所有的li元素,返回一个jQuery对象,然后通过数组下标的方式读取jQuery集合中第1个DOM元素,此时返回的是DOM对象,然后调用DOM属性innerHTML,读取该元素 包含的文本信息

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. SpringBoot入门 (二) 属性文件读取

    在上一篇中介绍了在idea中创建springboot工程及使用web工程输出“helloworld”到前端页面,本文学习在springboot工程中读取属性文件中的属性值. 一 自定义属性 在appl ...

  9. 深入探究.Net Core Configuration读取配置的优先级

    前言     在之前的文章.Net Core Configuration源码探究一文中我们曾解读过Configuration的工作原理,也.Net Core Configuration Etcd数据源 ...

随机推荐

  1. TiDB数据库 使用syncer工具同步实时数据

    mysql> select campaign_id ,count(id) from creative_output group by campaign_id; rows min 44.23 se ...

  2. [python] 在 python2和3中关于类继承的 super方法简要说明

    下面举一个例子,同样的代码使用 python2 和 python3 写的,大家注意两段程序中红色加粗的部分: python2的类继承使用super方法: #-*- coding:utf-8 -*- ' ...

  3. eclipse能正常启动tomcat,但是网页访问不了

    参考网址https://blog.csdn.net/did_itmyway/article/details/62099930

  4. Nescafe #29 NOIP模拟赛

    Nescafe #29 NOIP模拟赛 不知道这种题发出来算不算侵权...毕竟有的题在$bz$上是权限题,但是在$vijos$似乎又有原题...如果这算是侵权的话请联系我,我会尽快删除,谢谢~ 今天开 ...

  5. BZOJ4735:你的生命已如风中残烛(组合数学)

    Description 众所周知,萌萌哒六花不擅长数学,所以勇太给了她一些数学问题做练习.但是今天六花酱不想做数学题,于是他们开始打牌. 现在他们手上有m张不同的牌,牌有两种:普通牌和功能牌.功能牌一 ...

  6. android 登录效果

    <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android=&q ...

  7. Null和undefined的区别?

    (1)null是一个表示”无”的对象,转我数值是为0,undefined是一个表示”无”的原始值,转为数值时为NaN.当声明的变量还未被初始化时,能量的默认值为undefined (2)Null用来表 ...

  8. OpenCV——图像的矩(计算矩、轮廓面积、轮廓或曲线长度)

    图像矩描述了图像的全局特征 一阶矩与形状有关 二阶距显示曲线围绕直线平均值的扩展程度 三阶矩是关于平均值的对称性测量 由二阶和三阶矩可以导出7个不变矩,不变矩是图像的统计特性,满足平移.伸缩.旋转的不 ...

  9. 串口通信DMA中断

    这是以前学32的时候写的,那时候学了32之后感觉32真是太强大了,比51强的没影.关于dma网上有许多的资料,亲们搜搜,这里只贴代码了,其实我也想详详细细地叙述一番,但是自己本身打字就慢,还有好多事情 ...

  10. jqgrid 基础应用

    jqgrid 是一个在jquery基础上做的一个表格插件,以ajax的方式和服务器端通信. 一个jqgrid的基础示例(基础参数说明)如下: $("#jqGrid").jqGrid ...