1. /// <summary>
  2.         /// //设置投影的XYDoMain的功能 通过this.DefaultWorkSpace属性 
  3.         /// 这需要先执行OpenSDEConnection()方法
  4.         /// </summary>
  5.         /// <param name="pMinX"></param>
  6.         /// <param name="pMinY"></param>
  7.         /// <param name="pMaxX"></param>
  8.         /// <param name="pMaxY"></param>
  9.         /// <returns></returns>
  10.         public bool SetSpatialReferenceXYDoMainToDB(double pMinX, double pMinY, double pMaxX, double pMaxY)
  11.         {
  12.             bool rbc = false;
  13.             if (this.DefaultWorkSpace == null)
  14.             {
  15.                 rbc = false;
  16.                 return rbc;
  17.             }
  18.             List<IDataset> AllGisDataSetList = new List<IDataset>();
  19.             //获取本空间连接通道中的所有要素类和要素集对象
  20.             IWorkspace ws = this.DefaultWorkSpace;
  21.             IEnumDataset topEnumDataset = this.getEnumDataset(ws);
  22.             if (topEnumDataset != null)
  23.             {
  24.                 topEnumDataset.Reset();
  25.                 IDataset ds = topEnumDataset.Next();
  26.                 while (ds != null)
  27.                 {
  28.                     switch (ds.Type)
  29.                     {
  30.                         case esriDatasetType.esriDTFeatureDataset:
  31.                             //--
  32.                             AllGisDataSetList.Add(ds);
  33.                             //--
  34.                             IEnumDataset subEnumDs = this.getEnumSubDataset(ds);
  35.                             IDataset subds = subEnumDs.Next();
  36.                             while (subds != null)
  37.                             {
  38.                                 switch (subds.Type)
  39.                                 {
  40.                                     case esriDatasetType.esriDTFeatureClass:
  41.                                         rbc=this.SetDataSetByXYDoMain(subds, pMinX, pMinY, pMaxX, pMaxY);
  42.                                         break;
  43.                                 }
  44.                                 subds = subEnumDs.Next();
  45.                             }
  46.                             rbc = this.SetDataSetByXYDoMain(ds, pMinX, pMinY, pMaxX, pMaxY);
  47.                             break;
  48.                         case esriDatasetType.esriDTFeatureClass:
  49.                             //--
  50.                             rbc = this.SetDataSetByXYDoMain(ds, pMinX, pMinY, pMaxX, pMaxY);
  51.                             //--
  52.                             break;
  53.                     }
  54.                     ds = topEnumDataset.Next();
  55.                 }
  56.             }
  57.             return rbc;
  58.         }

  59.         private bool SetDataSetByXYDoMain(IDataset ds, double pMinX, double pMinY, double pMaxX, double pMaxY)
  60.         {
  61.             bool rbc = false;
  62.             ISpatialReference sr = null;
  63.             IGeoDataset geods = null;

  64.             geods = ds as IGeoDataset;
  65.             sr = geods.SpatialReference;
  66.             //---
  67.             if (geods is IFeatureClassManage && geods is ISchemaLock)
  68.             {
  69.                 ISchemaLock schemaLock = (ISchemaLock)geods;
  70.                 try
  71.                 {
  72.                     schemaLock.ChangeSchemaLock(esriSchemaLock.esriExclusiveSchemaLock);
  73.                     IFeatureClassManage featureClassManage = (IFeatureClassManage)geods;
  74.                     featureClassManage.UpdateExtent();

  75.                     schemaLock.ChangeSchemaLock(esriSchemaLock.esriSharedSchemaLock);
  76.                     AppLogErrWrite.WriteErrLog("updateExtent_Update完成:" + (geods as IDataset).Name);

  77.                 }
  78.                 catch (Exception k)
  79.                 {   //error occured            
  80.                     schemaLock.ChangeSchemaLock(esriSchemaLock.esriSharedSchemaLock);
  81.                     AppLogErrWrite.WriteErrLog("updateExtent_" + k.Message + " " + (geods as IDataset).Name);
  82.                 }
  83.             }
  84.             //---modify xydomain
  85.             //设置范围值
  86.             if (sr is ISpatialReference2GEN)
  87.             {
  88.                 (sr as ISpatialReference2GEN).SetDomain(pMinX, pMaxX, pMinY, pMaxY);
  89.             }
  90.             else
  91.             {
  92.                 sr.SetDomain(pMinX, pMaxX, pMinY, pMaxY);
  93.             }
  94.             //---
  95.             if ((geods as IDataset).Type == esriDatasetType.esriDTFeatureDataset
  96.                         && geods is IGeoDatasetSchemaEdit
  97.                         && geods is ISchemaLock)
  98.             {
  99.                 //设置目标投影
  100.                 IGeoDatasetSchemaEdit schemaEdit = geods as IGeoDatasetSchemaEdit;
  101.                 if (schemaEdit.CanAlterSpatialReference == true)
  102.                 {
  103.                     ISchemaLock schemaLock = (ISchemaLock)geods;
  104.                     try
  105.                     {
  106.                         schemaLock.ChangeSchemaLock(esriSchemaLock.esriExclusiveSchemaLock);
  107.                         schemaEdit.AlterSpatialReference(sr);

  108.                         schemaLock.ChangeSchemaLock(esriSchemaLock.esriSharedSchemaLock);
  109.                         rbc = true;
  110.                         AppLogErrWrite.WriteErrLog("修改投影XYDoMain完成:" + (geods as IDataset).Name);

  111.                     }
  112.                     catch (Exception ex)
  113.                     {
  114.                         schemaLock.ChangeSchemaLock(esriSchemaLock.esriSharedSchemaLock);
  115.                         AppLogErrWrite.WriteErrLog("修改投影XYDoMain出错:" + (geods as IDataset).Name + "/r/b" + ex.ToString());

  116.                     }
  117.                 }
  118.                 else
  119.                 {
  120.                     AppLogErrWrite.WriteErrLog((geods as IDataset).Name + "图层没权限修改空间投影!");
  121.                 }
  122.             }
  123.             return rbc;
  124.         }
  125.         private IEnumDataset getEnumDataset(IWorkspace ws)
  126.         {
  127.             return ws.get_Datasets(esriDatasetType.esriDTAny);
  128.         }
  129.         private IEnumDataset getEnumSubDataset(IDataset ods)
  130.         {
  131.             IEnumDataset oEnumSubds = null;
  132.             if (ods.Type == esriDatasetType.esriDTFeatureDataset)
  133.             {
  134.                 oEnumSubds = ods.Subsets;
  135.             }
  136.             return oEnumSubds;
  137.         }

  138.         //-------------

  139.         public bool SetSpatialReferenceToDB(ISpatialReference sr)
  140.         {
  141.             bool rbc = false;
  142.             if (this.DefaultWorkSpace == null)
  143.             {
  144.                 rbc = false;
  145.                 return rbc;
  146.             }
  147.             List<IDataset> AllGisDataSetList = new List<IDataset>();
  148.             //获取本空间连接通道中的所有要素类和要素集对象
  149.             IWorkspace ws = this.DefaultWorkSpace;
  150.             IEnumDataset topEnumDataset = this.getEnumDataset(ws);
  151.             if (topEnumDataset != null)
  152.             {
  153.                 topEnumDataset.Reset();
  154.                 IDataset ds = topEnumDataset.Next();
  155.                 while (ds != null)
  156.                 {
  157.                     switch (ds.Type)
  158.                     {
  159.                         case esriDatasetType.esriDTFeatureDataset:
  160.                             //--
  161.                             AllGisDataSetList.Add(ds);
  162.                             //--
  163.                             IEnumDataset subEnumDs = this.getEnumSubDataset(ds);
  164.                             IDataset subds = subEnumDs.Next();
  165.                             while (subds != null)
  166.                             {
  167.                                 switch (subds.Type)
  168.                                 {
  169.                                     case esriDatasetType.esriDTFeatureClass:
  170.                                         rbc = this.SetSpatialReference(subds,sr);
  171.                                         break;
  172.                                 }
  173.                                 System.Runtime.InteropServices.Marshal.ReleaseComObject(subds);
  174.                                 subds = subEnumDs.Next();
  175.                             }
  176.                             rbc = this.SetSpatialReference(ds, sr);
  177.                             break;
  178.                         case esriDatasetType.esriDTFeatureClass:
  179.                             //--
  180.                             rbc = this.SetSpatialReference(ds, sr);
  181.                             //--
  182.                             break;
  183.                     }
  184.                     System.Runtime.InteropServices.Marshal.ReleaseComObject(ds);
  185.                     ds = topEnumDataset.Next();
  186.                 }
  187.                 System.Runtime.InteropServices.Marshal.ReleaseComObject(topEnumDataset);
  188.             }
  189.             return rbc;
  190.         }

  191.         private bool SetSpatialReference(IDataset ds, ISpatialReference sr)
  192.         {
  193.             bool rbc = false;
  194.             IGeoDataset geods = null;

  195.             geods = ds as IGeoDataset;
  196.             if ((geods as IDataset).Type == esriDatasetType.esriDTFeatureDataset
  197.                         && geods is IGeoDatasetSchemaEdit
  198.                         && geods is ISchemaLock)
  199.             {
  200.                 //设置目标投影
  201.                 IGeoDatasetSchemaEdit schemaEdit = geods as IGeoDatasetSchemaEdit;
  202.                 if (schemaEdit.CanAlterSpatialReference == true)
  203.                 {
  204.                     ISchemaLock schemaLock = (ISchemaLock)geods;
  205.                     try
  206.                     {
  207.                         schemaLock.ChangeSchemaLock(esriSchemaLock.esriExclusiveSchemaLock);
  208.                         schemaEdit.AlterSpatialReference(sr);

  209.                         schemaLock.ChangeSchemaLock(esriSchemaLock.esriSharedSchemaLock);
  210.                         rbc = true;
  211.                         AppLogErrWrite.WriteErrLog("修改投影完成:" + (geods as IDataset).Name);

  212.                     }
  213.                     catch (Exception ex)
  214.                     {
  215.                         schemaLock.ChangeSchemaLock(esriSchemaLock.esriSharedSchemaLock);
  216.                         AppLogErrWrite.WriteErrLog("修改投影出错:" + (geods as IDataset).Name + "/r/b" + ex.ToString());

  217.                     }
  218.                 }
  219.                 else
  220.                 {
  221.                     AppLogErrWrite.WriteErrLog((geods as IDataset).Name + "图层没权限修改空间投影!");
  222.                 }
  223.             }
  224.             return rbc;
  225.         }