ArcEngine 数据导入经验(转载)

转自原文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 = 1;
string[] SDELayerNames = { "SDE.StationEquipment", "SDE.StationLine", "SDE.StationFrame" };
string[] MDBLayerNames = { "StationEquipment", "StationLine", "StationFrame" };

//加载SDE图层
OpenSDE(SDELayerNames);

//循环分批导入MDB,每次复制100个站房数据到一个拷贝的MDB中
while (start > 0)
{
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", 0) 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, 10);
_MDBLayerList.Clear();

//结束编辑
WorkSpaceStopEdit(featureWorkspace as IWorkspace);

Marshal.ReleaseComObject(workspaceFactory);
return stop;
}
时间: 2024-11-08 19:17:03

ArcEngine 数据导入经验(转载)的相关文章

Java实现Excel导入数据库,数据库中的数据导入到Excel。。转载

自学资料总结 实现的功能: Java实现Excel导入数据库,如果存在就更新 数据库中的数据导入到Excel 1.添加jxl.jar mysql-connector-java.1.7-bin.jar包到项目的lib目录下­ 2.Excel文件目录:D://book.xls 3.数据库名:javenforexcel 4.表名:stu 5.编写类:连接mysql的字符串方法.插入的方法.实体类­­ 表结构如下 : 连接数据库的工具类 package com.javen.db; import java

DB2数据导入的四大注意事项

在将数据库投入生产使用之前,数据库管理员往往需要先往数据库中导入大量的数据.数据库中只有大量的基础数据,建立在数据库上的应用软件才能够发挥效益. 本文主要谈的就是在将数据从外部文件导入导数据库过程中的一些注意事项.也许这些内容能够帮助管理员解决难题. 一.默认值与空值的争夺战. 在数据库表设计的时候,为了数据的完整性,往往会对某些列设置一些默认值.特别是某个字段不允许为空时,要设置默认值.当用户没有输入对应的值的时候,就利用默认值来填充.如有一张销售订单的表.这个表上有一个字段是"订单日期&qu

ImportTsv-HBase数据导入工具

一.概述 HBase官方提供了基于Mapreduce的批量数据导入工具:Bulk load和ImportTsv.关于Bulk load大家可以看下我另一篇博文. 通常HBase用户会使用HBase API导数,但是如果一次性导入大批量数据,可能占用大量Regionserver资源,影响存储在该Regionserver上其他表的查询,本文将会从源码上解析ImportTsv数据导入工具,探究如何高效导入数据到HBase. 二.ImportTsv介绍 ImportTsv是Hbase提供的一个命令行工具

不同mysql版本数据导入出现的问题

原mysql的版本是:3.4.10.1deb1,目标mysql的版本是:5.0.51b-community-nt-log,导入数据时出现了一下问题: 1.DELIMITER You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DELIMITER //' at line 1 goog

10.Solr4.10.3数据导入(DIH全量增量同步Mysql数据)

转载请出自出处:http://www.cnblogs.com/hd3013779515/ 1.创建MySQL数据 create database solr; use solr; DROP TABLE IF EXISTS student; CREATE TABLE student ( id char(10) NOT NULL, stu_name varchar(50) DEFAULT NULL, stu_sex int(1) DEFAULT NULL, stu_address varchar(20

excel数据导入导出数据库

第一种方法: 先把Excel另存为.csv格式文件,如test.csv,再编写一个insert.ctl 用sqlldr进行导入! insert.ctl内容如下: load data          --1.控制文件标识 infile ‘my.csv‘          --2.要输入的数据文件名为my.csv append into table "tbl_test"   --3.向表table_name中追加记录 fields terminated by ‘,‘          

Excel数据导入___你hold住么(二)

小编在上一篇博文中描述了Excel数据导入的大致流程和一个Demo实例 Excel数据导入___你hold住么(一)          在本篇将带领大家一同了解 导入Excel流程和问题解决方案: 导入Excel流程和步骤 需要注意的是在Server端的Web Config 中添加这几行代码 <!-- 导入Excel 徐露 -2015-7-8 --> <appSettings> <addkey="DbContextFactoryclassFulleName"

Skysense-Insar之数据导入

前段时间参加了首届Insar测绘应用及产业化高峰论坛,意外获得会议承办方(具体是哪个公司就不说了,免得说是打广告,还是非常感谢提供了很好用的产品及技术支持)Insar数据处理软件,经过帮助文档和短时间的摸索,基本掌握了软件使用,为了巩固自己技能和经验,也希望对他人有帮助,计划写一个系列的数据处理的文章,今天主要讲下如何导入SLC数据. 处理过InSar数据的人都知道,天上飞着各种Sar卫星,地下也有退休下来的卫星,这样就有各种各样的卫星数据,每个卫星的数据组织不同,参数文件不同(论标准化的重要性

【源】从零自学Hadoop(16):Hive数据导入导出,集群数据迁移上

阅读目录 序 导入文件到Hive 将其他表的查询结果导入表 动态分区插入 将SQL语句的值插入到表中 模拟数据文件下载 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写的,SourceLink 序 上一篇,我们介绍了Hive的表操作做了简单的描述和实践.在实际使用中,可能会存在数据的导入导出,虽然可以使用sqoop等工具进行关系型数据导入导出操作,但有的时候只需要很简便的方式进行导入导出即可   下面我们开始