1、arcgis工程文件mxd格式保存图层信息
2、当图层保存在oracle数据库时,遇到数据库ip地址变更时
3、原有工程文件无法打开图层
4、需要手动切换数据源
5、如果工程文件很多,手动切换数据源费时间,麻烦
6、用c#写程序实现1到5所存在的问题
private void SetDataSource(string sMxdPath, string sTargetPath)
{
获取MapDocment
IMapDocument pMapDocument = new MapDocumentClass();
pMapDocument.Open(sMxdPath, "");
创建一个MapControl
IMapControl2 pMapControl = new MapControlClass();
string sFileName = sMxdPath;
pMapControl.LoadMxFile(sFileName, null, null);
创建一个工作空间
IWorkspaceFactory pWorkFactory = new AccessWorkspaceFactoryClass();
IWorkspace pWorkspace = pWorkFactory.OpenFromFile(sTargetPath, 0);
获取工作空间中的全部Dataset
IEnumDataset pEnumDataSet = pWorkspace.get_Datasets(esriDatasetType.esriDTFeatureDataset);
IDataset pDataSet = pEnumDataSet.Next();
ISpatialReference pRef = (pDataSet as IGeoDataset).SpatialReference;
string sDistrictCode = string.Empty;
string sScale = string.Empty;
if (pDataSet != null)
{
UID uid = new UIDClass();
uid.Value = "{" + typeof(IFeatureLayer).GUID.ToString() + "}";
IEnumLayer pEnumLayer = pMapControl.Map.get_Layers(uid, true);
IFeatureLayer pFeaLyr = pEnumLayer.Next() as IFeatureLayer;
IFeatureWorkspace pFeaClsWks = pWorkspace as IFeatureWorkspace;
while (pFeaLyr != null)
{
string sDsName = ((pFeaLyr as IDataLayer).DataSourceName as IDatasetName).Name;
if ((pWorkspace as IWorkspace2).get_NameExists(esriDatasetType.esriDTFeatureClass, sDsName))
{
pFeaLyr.FeatureClass = pFeaClsWks.OpenFeatureClass(sDsName);
pFeaLyr.Name = pFeaLyr.Name;
}
pFeaLyr = pEnumLayer.Next() as IFeatureLayer;
}
//释放资源,防止出现Ox80040228,出现资源锁定错误
ESRI.ArcGIS.ADF.ComReleaser.ReleaseCOMObject(pWorkspace);
ESRI.ArcGIS.ADF.ComReleaser.ReleaseCOMObject(pFeaClsWks);
pMapControl.Map.SpatialReference = pRef;
IMxdContents pMxdC;
pMxdC = pMapControl.Map as IMxdContents;
pMapDocument.Open((pMapControl as IMapControl3).DocumentFilename, "");
pMapDocument.ReplaceContents(pMxdC);
pMapDocument.Save(true, true);
}
}