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. October 22nd, 2017 Week 43rd Sunday

    Yesterday is not ours to recover, but tomorrwo is ours to win or lose. 我们无法重拾昨天,但我们可以选择赢得或者输掉明天. Eve ...

  2. python中判断实例可迭代地几种方式

    1. 利用 __iter__内建属性 if hasattr(obj, '__iter__') : print 'iterable' 这种方法不能检测字符串,如:hasattr('', '__iter_ ...

  3. 极限编程核心价值:尊重(Respect)

    原文:https://deviq.com/respect 极限编程核心价值:简单(Simplicity) 极限编程核心价值:沟通(Communication) 极限编程核心价值:反馈(Feedback ...

  4. JAVA引用的种类

    最近在进行Java项目开发的时候,由于业务的原因,有时候new的对象会比较多,这个时候我总是有一个疑惑?那就是JVM在何时决定回收一个Java对象所占据的内存?这个问题其实对整个web系统来说是一个比 ...

  5. ACM模拟赛

    今天是毕业的学长给高二的同学测试.组队比赛,ACM赛制,于是就愉快的和学姐一队啦. 看到英文题面感到恐慌,不过好在不难读懂. A:并没有什么技术含量的模拟题: B:字符串题,给定一些比赛和每个队胜利的 ...

  6. 7、JVM--虚拟机类加载机制

    7.1.概述 再类文件结构中 在Class文件中描述的各种信息,最终都需要加载到虚拟机中之后才能运行和使用. 而虚拟机如何加载这些Class文件?Class文件中的信息进入到虚拟机后会发生什么变化? ...

  7. Kubernetes1.91(K8s)安装部署过程(五)--安装flannel网络插件

    node节点需要安装flannel网络插件才能保证所有的pod在一个局域网内通信,直接使用yum安装即可,版本是0.7.1. 1.安装flannel插件: 注意是2个node节点都需要安装,都需要修改 ...

  8. WorldWind源码剖析系列:插件列表视图类PluginListView和插件列表视图项类PluginListItem

    WorldWind中的插件类是个庞大的类,可以说从软件设计层面上统筹可扩展的插件体系的设计思想是WorldWind中的精华,值得学习和借鉴.插件体系中的所用到的类可以分为两大类,一类是插件类Plugi ...

  9. 第12章 GPIO输入—按键检测

    第12章     GPIO输入—按键检测 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fi ...

  10. Mike的农场 BZOJ4177

    分析: 最小割,不选则割的建模题...(然而一开始我当成了费用流,简直丧心病狂...最后想到了最小割...) 对于条件一,直接建一条双向边就可以了,并且不计入sum中,因为这是作为费用的存在,让它跑出 ...