arcgis engine中圖層與資料表之間的join操作
阿新 • • 發佈:2019-02-05
在進行join之前,請確認資料庫可以連線
try
{
//使用oledb連線資料庫,連線到sys.基本資訊表
IWorkspaceFactory pWorkspaceFactory = new OLEDBWorkspaceFactory();
IPropertySet pPropSet = new PropertySet();
pPropSet.SetProperty("CONNECTSTRING","Provider=sqloledb;Data Source=" + this.instanceBox.Text + ";Initial Catalog=sys;User Id=sa;Password=sa;");
IWorkspace pWorkspace = pWorkspaceFactory.Open(pPropSet,0);
IFeatureWorkspace pFeatureWorkspace = (IFeatureWorkspace)pWorkspace;
ITable pForeignTable = pFeatureWorkspace.OpenTable("sys.基本資訊表");
//開啟已經修復好資料來源的temp.mxd
IMapDocument pMapDocument = new MapDocumentClass();
pMapDocument.Open(startPath + @"/temp.mxd",null);
IMap pMap = pMapDocument.get_Map(0);
//獲取圖層
ILayer pLayer = null;
for (int i = 0; i < pMap.LayerCount; i++)
{
if (pMap.get_Layer(i).Name == "點位")
{
pLayer = pMap.get_Layer(i);
}
}
if (pLayer == null)
{
MessageBox.Show("開啟地圖檔案(.mxd)失敗");
return;
}
//join
IFeatureLayer pFLayer = (IFeatureLayer)pLayer;
IFeatureClass pFClass2 = pFLayer.FeatureClass;
IMemoryRelationshipClassFactory pMemRelClassFactory = new MemoryRelationshipClassFactoryClass();
IRelationshipClass pRelaClass = pMemRelClassFactory.Open("TableJoin1",pFClass2,"點位編號",(IObjectClass)pForeignTable,"點位編號","forward","backward",esriRelCardinality.esriRelCardinalityOneToOne);
IDisplayRelationshipClass pDisplayRelationshipC = (IDisplayRelationshipClass)pFLayer;
pDisplayRelationshipC.DisplayRelationshipClass(pRelaClass,esriJoinType.esriLeftOuterJoin);
pMapDocument.Save(false,true);
pMapDocument.Close();
}
catch (System.Exception ex4)
{
MessageBox.Show(ex4.Message);
return;
}
try
{
//使用oledb連線資料庫,連線到sys.基本資訊表
IWorkspaceFactory pWorkspaceFactory = new OLEDBWorkspaceFactory();
IPropertySet pPropSet = new PropertySet();
pPropSet.SetProperty("CONNECTSTRING","Provider=sqloledb;Data Source=" + this.instanceBox.Text + ";Initial Catalog=sys;User Id=sa;Password=sa;");
IWorkspace pWorkspace = pWorkspaceFactory.Open(pPropSet,0);
IFeatureWorkspace pFeatureWorkspace = (IFeatureWorkspace)pWorkspace;
ITable pForeignTable = pFeatureWorkspace.OpenTable("sys.基本資訊表");
//開啟已經修復好資料來源的temp.mxd
IMapDocument pMapDocument = new MapDocumentClass();
pMapDocument.Open(startPath + @"/temp.mxd",null);
IMap pMap = pMapDocument.get_Map(0);
//獲取圖層
ILayer pLayer = null;
for (int i = 0; i < pMap.LayerCount; i++)
{
if (pMap.get_Layer(i).Name == "點位")
{
pLayer = pMap.get_Layer(i);
}
}
if (pLayer == null)
{
MessageBox.Show("開啟地圖檔案(.mxd)失敗");
return;
}
//join
IFeatureLayer pFLayer = (IFeatureLayer)pLayer;
IFeatureClass pFClass2 = pFLayer.FeatureClass;
IMemoryRelationshipClassFactory pMemRelClassFactory = new MemoryRelationshipClassFactoryClass();
IRelationshipClass pRelaClass = pMemRelClassFactory.Open("TableJoin1",pFClass2,"點位編號",(IObjectClass)pForeignTable,"點位編號","forward","backward",esriRelCardinality.esriRelCardinalityOneToOne);
IDisplayRelationshipClass pDisplayRelationshipC = (IDisplayRelationshipClass)pFLayer;
pDisplayRelationshipC.DisplayRelationshipClass(pRelaClass,esriJoinType.esriLeftOuterJoin);
pMapDocument.Save(false,true);
pMapDocument.Close();
}
catch (System.Exception ex4)
{
MessageBox.Show(ex4.Message);
return;
}