ArcGIS离线数据编辑【一】

0
分享 2014-01-30

ArcGIS GeoDataBase支持离线数据编辑,通过与ArcPad、ArcMobile等移动GIS(可用于外业数据采集)相配合为国土、测绘、管线、规划等众多行业提供一套完整的数据更新解决方案。
离线编辑:先将要更新的数据从数据库下载到本地,然后通过其他的软件或工具对下载的数据进行编辑,最后上传到数据库完成对服务器数据的更新。
本篇主要说明功能本身的实现,至于复合数据类型(拓扑、几何网络、…)的处理、SDE版本编辑冲突等问题将在后续篇章中陆续介绍。
数据下载时在当前数据访问的SDE版本下创建一个临时的子版本,在上传更新时提交并回收子版本。
主要代码如下:
 public void DataCheckOut(IMap pMap, enumDataCheck eDataCheck,IGeometry pGeometry, bool bUserZone)
{
try
{
string sFile = “”;
string sPath = “”;
IWorkspaceFactory pWorkspaceFactory = null;
if (eDataCheck == enumDataCheck.GDB)
{
pWorkspaceFactory = newESRI.ArcGIS.DataSourcesGDB.FileGDBWorkspaceFactoryClass();
SaveFileDialog pDialog = new SaveFileDialog();
pDialog.Filter = “数据库名(*.*)|*.*”;
if (pDialog.ShowDialog() != DialogResult.OK) return;
sFile = pDialog.FileName;
sPath = sFile.Substring(0, sFile.LastIndexOf(“\”) + 1);
sFile = sFile.Substring(sPath.Length);
}
else
{
pWorkspaceFactory = newESRI.ArcGIS.DataSourcesGDB.AccessWorkspaceFactoryClass();
SaveFileDialog pDialog = new SaveFileDialog();
pDialog.Filter = “Access数据库(*.mdb)|*.mdb”;
if (pDialog.ShowDialog() != DialogResult.OK) return;
sFile = pDialog.FileName;
sPath = sFile.Substring(0, sFile.LastIndexOf(“\”) + 1);
sFile = sFile.Substring(sPath.Length);
}
try
{
System.IO.File.Delete(sPath + sFile);
}
catch { }
IWorkspaceName pWorkspaceName = pWorkspaceFactory.Create(sPath, sFile, null,0);
IEnumNameEdit pEnumNameEdit = new NamesEnumeratorClass();
for (int i = 0; i < pMap.LayerCount; ++i)
{
IFeatureLayer pFeatureLayer = pMap.get_Layer(i) as IFeatureLayer;
IDataset pDataset = pFeatureLayer.FeatureClass as IDataset;
IFeatureClassName pFeatureClassName = pDataset.FullName as IFeatureClassName;
IWorkspace pWorkSpace = pDataset.Workspace;
if (pWorkSpace.Type != esriWorkspaceType.esriRemoteDatabaseWorkspace) continue;
//未注册版本的图层不能进行离线编辑
IVersionedObject pVerObj = pFeatureLayer.FeatureClass as IVersionedObject;
if (!pVerObj.IsRegisteredAsVersioned) continue;
IName pName = null;
pName = pFeatureClassName as IName;
pEnumNameEdit.Add(pName);
}

IReplicaDescription pReplicaDes = new ReplicaDescriptionClass();
IEnumName pEnName = pEnumNameEdit as IEnumName;
pReplicaDes.Init(pEnName, pWorkspaceName, false,esriDataExtractionType.esriDataCheckOut);
pReplicaDes.ReplicaModelType = esriReplicaModelType.esriModelTypeFullGeodatabase;
if (bUserZone)
{
IReplicaFilterDescriptionEdit pRepFilterDescEdit =(IReplicaFilterDescriptionEdit)pReplicaDes;
for (int i = 0; i < pReplicaDes.TableNameCount; ++i)
{
pRepFilterDescEdit.set_RowsType(i, esriRowsType.esriRowsTypeFilter);
pRepFilterDescEdit.set_TableUsesQueryGeometry(i, !(pGeometry == null));
}
pRepFilterDescEdit.Geometry = pGeometry;
pRepFilterDescEdit.SpatialRelation =esriSpatialRelEnum.esriSpatialRelIntersects;
}
ICheckOut pCheckOut = new CheckOutClass();
//第三个参数是创建的临时数据库版本,同时存在SDE数据库和导出的本地数据库中因此不可以与已有的版本同名。
pCheckOut.CheckOutData(pReplicaDes, false, “DataCheckOut” + GetTimeWithNum());
MessageBox.Show(“下载成功!”, “提示”, MessageBoxButtons.OK, MessageBoxIcon.Information);

}
catch(Exception pEr)
{
MessageBox.Show(pEr.Message, “提示”,MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
}
public void DataCheckIn(IMap pMap, enumDataCheckeDataCheck)
{
try
{
string sFile = “”;
string sPath = “”;
IWorkspaceFactory pWorkspaceFactory = null;
if (eDataCheck == enumDataCheck.GDB)
{
pWorkspaceFactory = new FileGDBWorkspaceFactoryClass();
FolderBrowserDialog pDialog = new FolderBrowserDialog();
if (pDialog.ShowDialog() != DialogResult.OK) return;
sFile = pDialog.SelectedPath;
sPath = sFile.Substring(0, sFile.LastIndexOf(“\”) + 1);
sFile = sFile.Substring(sPath.Length);
}
else
{
pWorkspaceFactory = new AccessWorkspaceFactoryClass();
OpenFileDialog pDialog = new OpenFileDialog();
pDialog.Filter = “Access数据库(*.mdb)|*.mdb”;
if (pDialog.ShowDialog() != DialogResult.OK) return;
sFile = pDialog.FileName;
sPath = sFile.Substring(0, sFile.LastIndexOf(“\”) + 1);
sFile = sFile.Substring(sPath.Length);
}
IPropertySet pPropSet = new PropertySetClass();
pPropSet.SetProperty(“Database”, sPath + sFile);
IWorkspace pWorkspace = pWorkspaceFactory.Open(pPropSet, 0);
IDataset pDataset = pWorkspace as IDataset;
IWorkspaceName pWorkspaceName = pDataset.FullName as IWorkspaceName;
IWorkspaceReplicas pWorkspaceReplicas = pWorkspace as IWorkspaceReplicas;
IReplica pReplica = pWorkspaceReplicas.Replicas.Next();
//如导出的数据库中表GDB_Replicas没有记录信息,说明导入的数据已经导入过或该数据库不是下载的数据库
if (pReplica == null)
{
MessageBox.Show(“没有导出信息,无法导入”, “提示”,MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return;
}
pDataset = clsPublic.G_pWS as IDataset;
IWorkspaceName ppWorkspaceName = pDataset.FullName as IWorkspaceName;
ICheckIn pCheckIn = new CheckInClass();
pCheckIn.CheckInFromGDB(ppWorkspaceName, pReplica.Name, pWorkspaceName, true,false);
MessageBox.Show(“上传成功!”, “提示”, MessageBoxButtons.OK, MessageBoxIcon.Information);

}
catch
{
MessageBox.Show(“上传失败!”, “提示”, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
}

文章来源:http://blog.csdn.net/sydbc/article/details/17349675

0 个评论

要回复文章请先登录注册