ArcGIS离线数据编辑【一】

 

ArcGIS  GeoDataBase支持离线数据编辑,通过与ArcPadArcMobile等移动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);
            }
        }

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值