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).从别的表中查询 ...
随机推荐
- mysql 表设计时的update_time自动更新
11.3.5 Automatic Initialization and Updating for TIMESTAMP and DATETIME 原文地址:https://dev.mysql.com/d ...
- Android 安卓直播开源: RTMP 推流SDK
前些日子在github上提交了基于GPUImage的iOS直播推流SDK(https://github.com/runner365/GPUImageRtmpPush) 最近整理了Android直播推流 ...
- golang 函数作为类型
golang 函数作为类型 package main import "fmt" type A func(int, int) func (f A)Serve() { fmt.Prin ...
- Linux的一些简单命令操作
防火墙 查看防火墙状态 systemctl status iptables (或service iptables status) 关闭防火墙 systemctl stop iptables(或serv ...
- 八、Docker+RabbitMQ
原文:八.Docker+RabbitMQ 一.下载镜像 docker pull rabbitmq:management 二.运行 docker run -d --name rabbitmq -e TZ ...
- 40.lombok在IntelliJ IDEA下的使用
转自:https://www.cnblogs.com/yjmyzz/p/lombok-with-intellij-idea.html lombok是一款可以精减java代码.提升开发人员生产效率的辅助 ...
- HTML基础第六讲---表格
转自:https://i.cnblogs.com/posts?categoryid=1121494 上一讲,讲了关于<控制表格及其表项的对齐方式>,在这里我要讲讲表格及其属性 ,然后大家在 ...
- 如何将String类型转换成任意基本类型
[原创][C#] 如何将String类型转换成任意基本类型 Posted on 2009-12-02 09:47 YCOE 阅读( 2843) 评论( 14) 编辑 收藏 前几天,在写一个自动 ...
- Cronolog 分割 Tomcat8 Catalina.out日志 (转)
默认情况下,tomcat的catalina.out日志文件是没有像其它日志一样,按日期进行分割,而是全部输出全部写入到一个catalina.out,这样日积月累就会造成.out日志越来越大,给管理造成 ...
- Codeforces_GYM_100741 A
http://codeforces.com/gym/100741/problem/A A. Queries time limit per test 0.25 seconds memory limit ...