ArcEngine 数据导入经验(转载)
(一)
GIS系统数据是基础,想必大家在做ArcEngine二次开发的过程中都会遇到向MDB和SDE写入数据的工作,我们将会通过几个篇幅,从大数据量导入过程中的问题和解决方式入手带给大家一些实用的经验。
1.数据的写入和删除要使用IWorkspaceEdit.StartEditing来开启一个编辑流程,千万别草率的写入和删除。使用该接口,如果数据在处理过程中出现任何异常,可以不对操作结果进行保存编辑和结束编辑IWorkspaceEdit.StopEditing,这样能够保证你处理的数据不被破坏。
2.读取数据要释放游标和要素类,循环IFeatureCursor过程中要释放Feature,循环结束时释放IFeatureCursor。
while ((feature = featureCursor.NextFeature()) != null)
{
Marshal.ReleaseComObject(feature);//释放要素
} Marshal.ReleaseComObject(featureCursor);//释放游标
3.有时会在导入过程中需要对原始数据进行加工和处理,那么可以考虑将SDE中大数据量的图层分批导入到MDB(Personal Geodatabase)中,在对MDB中的数据进行加工和处理后导入到新的图层中。数据导入一批就进行保存编辑然后再开始编辑,这样会更好的保证数据的导入成功率,如数据量在200万条执行一次导入成功率会比每次导入50万条的成功率低很多,如果为每个要素类导入时开启一个专用的gsrvr进程那么成功率将是最高的。分批处理和导入也会大幅提升速度。
4.在保持编辑后要手动调用垃圾回收机制,这样能够在数据保存后释放掉gsrvr进程,可以有效的避免gsrvr进程死锁。
GC.Collect(); //发起一轮全面的回收
(二)
上一篇中提到在导入过程中需要对大数据量的原始数据进行加工和处理后导入到新的图层中,可以考虑采用分批处理和导入,这里就通过一个事例来说明具体的实现方式。
先来看看图形数据结构:
1.原始数据DataSet中有三个图层分别是:StationEquipment(站内设备层、线层)、StationLine(站内连接线层、线层)、StationFrame(站房边框层、面层),站内设备层和站内连接线层中的要素在空间关系上它们都分布在站房边框层要素内。其中站内设备层和站内连接线层的数据量在100万条以上,站房边框层有2800条数据。
2.新数据DataSet中对应有三个图层分别是:NewStationEquipment(站内设备层、点层)、NewStationLine(站内连接线层、线层)、NewStationFrame(站房边框层、面层)。
数据处理要求:
1.要将原始数据中的站内设备层中的线要素转换为点要素导入到新的站内设备层中(把线要素的中心点存储到新的站内设备层中)。
2.要将原始数据中的站内连接线层的线要素延长到新的设备点要素上,形成连接关系。
介绍完数据情况和处理要求后,我们来看看具体的实现方式:
1.建立一个Personal Geodatabase文件命名为Staion.mdb,按照原始数据图层的结构在MDB中创建3个图层。
2.分批将原始数据中的100站房边框层要素和通过空间查询得到站内设备层要素和站内连接线层要素导入到通过Staion.mdb作为模板复制的一个MDB文件中。
(1)分批将原始数据导入到每个MDB中
public void SDEDataMigrate()
{
int start = ;
string[] SDELayerNames = { "SDE.StationEquipment", "SDE.StationLine", "SDE.StationFrame" };
string[] MDBLayerNames = { "StationEquipment", "StationLine", "StationFrame" }; //加载SDE图层
OpenSDE(SDELayerNames); //循环分批导入MDB,每次复制100个站房数据到一个拷贝的MDB中
while (start > )
{
start = CopyGDB(start, start.ToString(), MDBLayerNames);
}
}
(2)拷贝MDB,导入原始数据到MDB中
private int CopyGDB(int start, string directoryName, string[] layerNames)
{
IWorkspaceFactory workspaceFactory;
IFeatureWorkspace featureWorkspace;
IWorkspaceName workName;
IWorkspaceName workNameCopy;
string resourceDirectory = @"D:\Personal GDB";
IFileNames fileNames;
IFeatureClass featureClass;
IFeatureLayer featureLayer;
int stop; //目的地目录是否存在
if (!Directory.Exists(directoryName))
{
Directory.CreateDirectory(directoryName);
} fileNames = new FileNamesClass();
fileNames.Add(@"D:\Personal GDB\Staion.mdb"); workspaceFactory = new AccessWorkspaceFactoryClass();
workName = workspaceFactory.GetWorkspaceName(resourceDirectory, fileNames);
workspaceFactory.Copy(workName, directoryName, out workNameCopy); featureWorkspace
= workspaceFactory.OpenFromFile(directoryName + @"\Staion.mdb", ) as IFeatureWorkspace; foreach (string layerName in layerNames)
{
featureClass = featureWorkspace.OpenFeatureClass(layerName);
featureLayer = new FeatureLayer();
featureLayer.FeatureClass = featureClass;
featureLayer.Name = featureClass.AliasName;
_MDBLayerList.Add(featureLayer);
} //开始编辑
WorkSpaceStartEdit(featureWorkspace as IWorkspace); //导入数据
stop = SDEDataCopy(start, );
_MDBLayerList.Clear(); //结束编辑
WorkSpaceStopEdit(featureWorkspace as IWorkspace); Marshal.ReleaseComObject(workspaceFactory);
return stop;
}
ArcEngine 数据导入经验(转载)的更多相关文章
- 通过 Sqoop1.4.7 将 Mysql5.7、Hive2.3.4、Hbase1.4.9 之间的数据导入导出
目录 目录 1.什么是 Sqoop? 2.下载应用程序及配置环境变量 2.1.下载 Sqoop 1.4.7 2.2.设置环境变量 2.3.设置安装所需环境 3.安装 Sqoop 1.4.7 3.1.修 ...
- Oracle创建删除用户,角色,表空间,导入导出数据库命令总结(转载)
无意间看到一篇文章,觉得对于ORACLE的新手很实用,特转载,原文出处这里 说明:在创建数据库时输入的密码,是修改系统默认的密码,以system和sysman等系统默认身份登录时要输入的密码就是修改后 ...
- c#将Excel数据导入到数据库的实现代码(转载)
假如Excel中的数据如下: 数据库建表如下: 其中Id为自增字段: 代码如下: using System; using System.Collections.Generic ...
- SQLServer怎样把本地数据导入到远程服务器上(转载)
平常用到mssql时间比较少,总是过一段时间就忘记应该怎么操作了.当要做mssq把本地数据导入到远程服务器的时候,就去网上搜索很久都没有图解的,所以今天自己收集一下免得下次又到处去找.希望对自己,同时 ...
- Oracle11g中数据的倒库和入库操作以及高版本数据导入低版本数据可能引发的问题
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.前言 在10g之前,传统的导出和导入分别使用EXP工具和IMP工具 ...
- 从零自学Hadoop(16):Hive数据导入导出,集群数据迁移上
阅读目录 序 导入文件到Hive 将其他表的查询结果导入表 动态分区插入 将SQL语句的值插入到表中 模拟数据文件下载 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并 ...
- 从零自学Hadoop(17):Hive数据导入导出,集群数据迁移下
阅读目录 序 将查询的结果写入文件系统 集群数据迁移一 集群数据迁移二 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephis ...
- 将excel数据导入到mysql的方法
文本框被键盘遮挡到了,不会再获取焦点的时候被顶到键盘顶部.解决方案:设置A的Position为绝对定位absolute即可,其他几种定位方式未测试,但是不能是fixed ,正是因为这种定位方式,导致它 ...
- HIVE几种数据导入方式
HIVE几种数据导入方式 今天的话题是总结Hive的几种常见的数据导入方式,我总结为四种:(1).从本地文件系统中导入数据到Hive表:(2).从HDFS上导入数据到Hive表:(3).从别的表中查询 ...
随机推荐
- amazeui的表单开关插件的自定义事件必须添加.bootstrapSwitch 命名空间,给了我们什么启示
amazeui的表单开关插件的自定义事件必须添加.bootstrapSwitch 命名空间,给了我们什么启示 一.总结 一句话总结:详细看使用文档(说明文档说的真的是非常详细呢,不过循序渐进,不同阶段 ...
- 洛谷P3613 睡觉困难综合征(LCT)
题目: P3613 睡觉困难综合症 解题思路: LCT,主要是维护链上的多位贪心答案,推个公式:分类讨论入0/1的情况,合并就好了(公式是合并用的) 代码(我不知道之前那个为啥一直wa,改成结构体就好 ...
- 【Codeforces Round #428 (Div. 2) C】Journey
[Link]:http://codeforces.com/contest/839/problem/C [Description] 给一棵树,每当你到一个点x的时候,你进入x的另外一每一个出度的概率都是 ...
- Oracle实现数据不存在则插入,数据存在则更新(insert or update)
思路是写一个函数,先按条件查询数据,假设查询到数据则更新.假设没有查询到数据则插入: create or replace function fn_merge_index(statdate in dat ...
- OR1200指令Cache使用举例
下面内容摘自<步步惊芯--软核处理器内部设计分析>一书 12.4 ICache中的特殊寄存器 通过ICache的接口可知其具有特殊寄存器,而且是不可读的特殊寄存器,OR1200处理器中IC ...
- 使用Intent的Flag设置启动參数
Intent中关于激活Activity的Flag Intent类定义了一批常量,用于配置激活Activity时的相关參数; 在Intent中设置Flag ·调用Intent的setFlags()或ad ...
- JNI之——Can't load IA 32-bit .dll on a AMD 64-bit platform错误的解决
转载自:http://blog.csdn.net/l1028386804/article/details/46605003 在JNI开发中,Java程序需要调用操作系统动态链接库时,报错信息:Can' ...
- 【Codeforces Round #433 (Div. 1) C】Boredom(二维线段树)
[链接]我是链接 [题意] 接上一篇文章 [题解] 接(点我进入)上一篇文章. 这里讲一种用类似二维线段树的方法求矩形区域内点的个数的方法. 我们可以把n个正方形用n棵线段树来维护. 第i棵线段树维护 ...
- Oracle中暂时表空间的清理
作者:iamlaosong Oracle暂时表空间主要用来做查询和存放一些缓冲区数据. 暂时表空间消耗的主要原因是须要对查询的中间结果进行排序.暂时表空间的主要作用: 索引create或rebuild ...
- UVA 10970 - Big Chocolate 洪水@。@
先横着切m-1刀,矩形巧克力就变成了1*n (有m个)然后每个都要切n-1下,所以有 m*(n-1) +(m-1)= n*m-1 #include<cstdio> int main() { ...