/// <summary> /// Sets a join based on the specified relationship class and join type. /// </summary> /// <param name="source">The source.</param> /// <param name="foreignClass">The join.</param> /// <param name="layerKeyField">Name of the layer field.</param> /// <param name="foreignKeyField">Name of the join field.</param> /// <param name="cardinality">The cardinality.</param> /// <param name="joinType">Type of the join.</param> /// <returns> /// Returns a <see cref="IRelQueryTable" /> represents the table and feature join. /// </returns> public static IRelQueryTable Add(this IFeatureLayer source, IObjectClass foreignClass, string layerKeyField, string foreignKeyField, esriRelCardinality cardinality, esriJoinType joinType) { IRelQueryTable result; IRelationshipClass relClass; var table = ((IDisplayTable)source).DisplayTable as IRelQueryTable; if (table != null) { result = source.Add(table, foreignClass, string.Format("{0}.{1}", ((IDataset)source.FeatureClass).Name, layerKeyField), foreignKeyField, cardinality, joinType); relClass = result.RelationshipClass; } else { var layer = (IFeatureClass)((IDisplayTable)source).DisplayTable; relClass = layer.Join(foreignClass, layerKeyField, foreignKeyField, cardinality, null); var factory = new RelQueryTableFactoryClass(); result = factory.Open(relClass, true, null, null, "", true, joinType == esriJoinType.esriLeftInnerJoin); } IDisplayRelationshipClass display = (IDisplayRelationshipClass)source; display.DisplayRelationshipClass(relClass, joinType); return(result); }
/// <summary> /// Join Urban-rural Devide Table /// </summary> /// <param name="layer"></param> /// <param name="year"></param> /// <author>Shen Yongyuan</author> /// <date>20091111</date> public static void JoinDevideTable(ILayer layer, int year, string city) { //Add Fields IFieldsEdit allFields = new FieldsClass(); IFieldEdit field1 = new FieldClass(); field1.Name_2 = "ID"; field1.Type_2 = esriFieldType.esriFieldTypeString; allFields.AddField(field1); IFieldEdit field2 = new FieldClass(); field2.Name_2 = Town.Constant.Constant.TmpFieldName; field2.Type_2 = esriFieldType.esriFieldTypeString; allFields.AddField(field2); //Create Table IWorkspaceFactory workspaceFactory = new InMemoryWorkspaceFactoryClass(); IWorkspaceName workspaceName = workspaceFactory.Create("", "Temporary WorkSpace In Memory", null, 0); IFeatureWorkspace workspace = ((IName)workspaceName).Open() as IFeatureWorkspace; ITable table = workspace.CreateTable(Town.Constant.Constant.TmpTableDevide, allFields, null, null, ""); //Import Data IWorkspaceEdit workspaceEdit = workspace as IWorkspaceEdit; workspaceEdit.StartEditing(false); workspaceEdit.StartEditOperation(); ICursor cursor = table.Insert(true); int fldField1 = cursor.Fields.FindField("ID"); int fldField2 = cursor.Fields.FindField(Town.Constant.Constant.TmpFieldName); //Query and Import Dictionary <int, string> devideResult = DataLib.DA_Devide.GetDevideResult(year, city); foreach (KeyValuePair <int, string> d in devideResult) { IRowBuffer buffer = table.CreateRowBuffer(); buffer.set_Value(fldField1, d.Key.ToString()); buffer.set_Value(fldField2, d.Value); cursor.InsertRow(buffer); } cursor.Flush(); workspaceEdit.StartEditOperation(); workspaceEdit.StopEditing(true); System.Runtime.InteropServices.Marshal.ReleaseComObject(cursor); //Join IMemoryRelationshipClassFactory pMemRelFact = new MemoryRelationshipClassFactory(); IFeatureLayer feaLayer = layer as IFeatureLayer; ITable originTable = feaLayer.FeatureClass as ITable; IRelationshipClass pRelClass = pMemRelFact.Open("Join", originTable as IObjectClass, "ID", table as IObjectClass, "ID", "forward", "backward", esriRelCardinality.esriRelCardinalityOneToOne); IDisplayRelationshipClass pDispRC = feaLayer as IDisplayRelationshipClass; pDispRC.DisplayRelationshipClass(null, esriJoinType.esriLeftOuterJoin); pDispRC.DisplayRelationshipClass(pRelClass, esriJoinType.esriLeftOuterJoin); }
private static IUniqueValueRenderer GenerateUniqueValueRenderer(IFeatureLayer featureLayer) { IFeatureWorkspace featureWorkspace = ((IDataset)featureLayer.FeatureClass).Workspace as IFeatureWorkspace; ITable table = featureWorkspace.OpenTable(TableName); string relClassName = string.Format("{0}_{1}", ((IDataset)featureLayer.FeatureClass).Name, ((IDataset)table).Name); IRelationshipClass relClass = featureWorkspace.OpenRelationshipClass(relClassName); IDisplayRelationshipClass displayRelClass = featureLayer as IDisplayRelationshipClass; if (displayRelClass == null) { return(null); } displayRelClass.DisplayRelationshipClass(relClass, esriJoinType.esriLeftOuterJoin); IUniqueValueRenderer uvRenderer = new UniqueValueRendererClass { FieldCount = 1 }; uvRenderer.Field[0] = string.Format("{0}.{1}", ((IDataset)table).Name, JoinField); IFeatureCursor cursor = ((IGeoFeatureLayer)featureLayer).SearchDisplayFeatures(null, true); DataStatisticsClass dataStatistics = new DataStatisticsClass { Field = uvRenderer.Field[0], Cursor = cursor as ICursor }; IEnumerator pEnumerator = dataStatistics.UniqueValues; pEnumerator.Reset(); Random random = new Random(); while (pEnumerator.MoveNext()) { string value = Convert.ToString(pEnumerator.Current); RgbColorClass fillColor = new RgbColorClass { Red = random.Next(0, 255), Green = random.Next(0, 255), Blue = random.Next(0, 255) }; SimpleFillSymbolClass fillSymbol = new SimpleFillSymbolClass { Color = fillColor }; uvRenderer.AddValue(value, "ZONE", fillSymbol); } Marshal.ReleaseComObject(cursor); return(uvRenderer); }
private void btnRemoveJoining_Click(object sender, EventArgs e) { IDisplayTable table = this.itable_0 as IDisplayTable; ITable displayTable = table.DisplayTable; if (displayTable is IRelQueryTable) { string str = this.JoiningDataList.SelectedItem.ToString(); while (displayTable is IRelQueryTable) { IRelQueryTable table3 = displayTable as IRelQueryTable; if ((table3.DestinationTable as IDataset).Name == str) { break; } displayTable = table3.SourceTable; } if (displayTable is IRelQueryTable) { IRelQueryTable table5 = displayTable as IRelQueryTable; displayTable = table5.SourceTable; IDisplayRelationshipClass class2 = this.itable_0 as IDisplayRelationshipClass; if (displayTable is IRelQueryTable) { table5 = displayTable as IRelQueryTable; IRelQueryTableInfo info = table5 as IRelQueryTableInfo; class2.DisplayRelationshipClass(table5.RelationshipClass, info.JoinType); } else { class2.DisplayRelationshipClass(null, esriJoinType.esriLeftInnerJoin); } this.JoiningDataList.Items.Clear(); if (this.OnJoinAndRelationChange != null) { this.OnJoinAndRelationChange(); } this.method_1(this.itable_0); if (this.JoiningDataList.Items.Count > 0) { this.btnRemoveAllJoining.Enabled = true; } else { this.btnRemoveAllJoining.Enabled = false; } } } }
private void btnRemoveAllJoining_Click(object sender, EventArgs e) { IDisplayRelationshipClass class2 = this.itable_0 as IDisplayRelationshipClass; if (class2 != null) { class2.DisplayRelationshipClass(null, esriJoinType.esriLeftInnerJoin); this.JoiningDataList.Items.Clear(); if (this.OnJoinAndRelationChange != null) { this.OnJoinAndRelationChange(); } this.btnRemoveAllJoining.Enabled = false; } }
private void method_2(IDisplayRelationshipClass idisplayRelationshipClass_0, IRelQueryTable irelQueryTable_0) { try { IRelationshipClass relationshipClass = irelQueryTable_0.RelationshipClass; if (relationshipClass != null) { idisplayRelationshipClass_0.DisplayRelationshipClass(relationshipClass, idisplayRelationshipClass_0.JoinType); } } catch { } }
/// <summary> /// Sets a join based on the specified relationship class and join type. /// </summary> /// <param name="source">The source.</param> /// <param name="table">The table.</param> /// <param name="foreignClass">The join.</param> /// <param name="layerKeyField">Name of the layer field.</param> /// <param name="foreignKeyField">Name of the join field.</param> /// <param name="cardinality">The cardinality.</param> /// <param name="joinType">Type of the join.</param> /// <returns> /// Returns a <see cref="IRelQueryTable" /> represents the table and feature join. /// </returns> public static IRelQueryTable Add(this IFeatureLayer source, IRelQueryTable table, IObjectClass foreignClass, string layerKeyField, string foreignKeyField, esriRelCardinality cardinality, esriJoinType joinType) { if (source != null) { var factory = new RelQueryTableFactoryClass(); var origin = factory.Open(table.RelationshipClass, true, null, null, "", true, ((IRelQueryTableInfo)table).JoinType == esriJoinType.esriLeftInnerJoin); var join = ((IObjectClass)origin).Join(foreignClass, string.Format("{0}.{1}", ((IDataset)table.SourceTable).Name, layerKeyField), foreignKeyField, cardinality, null); var result = factory.Open(join, true, null, null, "", true, joinType == esriJoinType.esriLeftInnerJoin); IDisplayRelationshipClass display = (IDisplayRelationshipClass)source; display.DisplayRelationshipClass(result.RelationshipClass, joinType); return(result); } return(null); }
/// <summary> /// Removes all of the joins on the feature layer. /// </summary> /// <param name="source">The source.</param> public static void RemoveAll(this IFeatureLayer source) { IDisplayRelationshipClass display = (IDisplayRelationshipClass)source; display.DisplayRelationshipClass(null, esriJoinType.esriLeftInnerJoin); }
private void frmSetLabel_Load(object sender, EventArgs e) { //获取字段 IFields pFields = null; string FieldName = ""; if (pGeoFeatLayer != null) { IDisplayRelationshipClass pDisResCls = pGeoFeatLayer as IDisplayRelationshipClass; if (pDisResCls.RelationshipClass != null) { //如果进行了联表查询,则图层的字段名称发生了变化,通过将“层名”和“原字段名称”组合起来形成新的字段名称 //加载到CmbFields中 string pLayerName = pGeoFeatLayer.Name;//获得图层名 pFields = pGeoFeatLayer.FeatureClass.Fields; for (int i = 0; i < pFields.FieldCount; i++) { //遍历图层的字段,将“图层名”和“字段名”组合起来 FieldName = pFields.get_Field(i).Name; if (FieldName.ToLower() == "shape") { continue; //如果是几何字段,则过滤掉 } if (FieldName.ToLower() == "objectid") { continue; //如果是ID过滤 } FieldName = pLayerName + "." + FieldName; CmbFields.Items.Add(FieldName); } } else { //没有进行联表查询,则直接将字段的名称加载到CmbFields中 pFields = pGeoFeatLayer.FeatureClass.Fields; for (int i = 0; i < pFields.FieldCount; i++) { FieldName = pFields.get_Field(i).Name; if (FieldName.ToLower() == "shape") { continue; } if (FieldName.ToLower() == "objectid") { continue;//如果是ID过滤 } CmbFields.Items.Add(FieldName); } } CmbFields.SelectedIndex = 0; } //获取字体名称 System.Drawing.Text.InstalledFontCollection FontsCol = new System.Drawing.Text.InstalledFontCollection(); foreach (System.Drawing.FontFamily family in FontsCol.Families) { CmbFontName.Items.Add(family.Name); } //获取字体大小 for (int i = 1; i < 30; i++) { CmbFontSize.Items.Add(i); } }
/// <summary> /// Join Complex Index Table /// </summary> /// <param name="layer"></param> /// <param name="year"></param> /// <author>Shen Yongyuan</author> /// <date>20091111</date> public static void JoinComplexTable(ILayer layer, int year, string city, bool normal) { //Add Fields IFieldsEdit allFields = new FieldsClass(); IFieldEdit field1 = new FieldClass(); field1.Name_2 = "ID"; field1.Type_2 = esriFieldType.esriFieldTypeString; allFields.AddField(field1); IFieldEdit field2 = new FieldClass(); field2.Name_2 = "Ecology"; field2.Type_2 = esriFieldType.esriFieldTypeDouble; allFields.AddField(field2); IFieldEdit field3 = new FieldClass(); field3.Name_2 = "Social"; field3.Type_2 = esriFieldType.esriFieldTypeDouble; allFields.AddField(field3); IFieldEdit field4 = new FieldClass(); field4.Name_2 = "Economic"; field4.Type_2 = esriFieldType.esriFieldTypeDouble; allFields.AddField(field4); //Create Table IWorkspaceFactory workspaceFactory = new InMemoryWorkspaceFactoryClass(); IWorkspaceName workspaceName = workspaceFactory.Create("", "Temporary WorkSpace In Memory", null, 0); IFeatureWorkspace workspace = ((IName)workspaceName).Open() as IFeatureWorkspace; ITable table = workspace.CreateTable(Town.Constant.Constant.TmpTableIndex, allFields, null, null, ""); //Import Data IWorkspaceEdit workspaceEdit = workspace as IWorkspaceEdit; workspaceEdit.StartEditing(false); workspaceEdit.StartEditOperation(); ICursor cursor = table.Insert(true); int fldField1 = cursor.Fields.FindField("ID"); int fldField2 = cursor.Fields.FindField("Ecology"); int fldField3 = cursor.Fields.FindField("Social"); int fldField4 = cursor.Fields.FindField("Economic"); IQueryable <DataLib.I_INDEX> indexCollect = DataLib.DA_Index.QueryIndex(year, city); List <int> OIDList = new List <int>(); foreach (DataLib.I_INDEX i in indexCollect) { if (OIDList.Contains(i.I_ZONE.OID) == false) { double EcologyValue = indexCollect.Where(c => c.Name.Equals("生态子系统综合指标") && c.Zone == i.Zone).Single().Value; double SocialValue = indexCollect.Where(c => c.Name.Equals("社会子系统综合指标") && c.Zone == i.Zone).Single().Value; double EconomicValue = indexCollect.Where(c => c.Name.Equals("经济子系统综合指标") && c.Zone == i.Zone).Single().Value; //if (normal == true) //{ // EcologyValue += Math.Abs(DataLib.DA_Index.QueryIndex("生态子系统综合指标", city).Min(c => c.Value)) + 1; // SocialValue += Math.Abs(DataLib.DA_Index.QueryIndex("社会子系统综合指标", city).Min(c => c.Value)) + 1; // EconomicValue += Math.Abs(DataLib.DA_Index.QueryIndex("经济子系统综合指标", city).Min(c => c.Value)) + 1; //} EcologyValue = Math.Abs(EcologyValue); SocialValue = Math.Abs(SocialValue); EconomicValue = Math.Abs(EconomicValue); IRowBuffer buffer = table.CreateRowBuffer(); buffer.set_Value(fldField1, i.I_ZONE.OID); buffer.set_Value(fldField2, EcologyValue); buffer.set_Value(fldField3, SocialValue); buffer.set_Value(fldField4, EconomicValue); cursor.InsertRow(buffer); OIDList.Add(i.I_ZONE.OID); } } cursor.Flush(); workspaceEdit.StartEditOperation(); workspaceEdit.StopEditing(true); System.Runtime.InteropServices.Marshal.ReleaseComObject(cursor); //Join IMemoryRelationshipClassFactory pMemRelFact = new MemoryRelationshipClassFactory(); IFeatureLayer feaLayer = layer as IFeatureLayer; ITable originTable = feaLayer.FeatureClass as ITable; IRelationshipClass pRelClass = pMemRelFact.Open("Join", originTable as IObjectClass, "ID", table as IObjectClass, "ID", "forward", "backward", esriRelCardinality.esriRelCardinalityOneToOne); IDisplayRelationshipClass pDispRC = feaLayer as IDisplayRelationshipClass; pDispRC.DisplayRelationshipClass(null, esriJoinType.esriLeftOuterJoin); pDispRC.DisplayRelationshipClass(pRelClass, esriJoinType.esriLeftOuterJoin); }
/// <summary> /// Join Index /// </summary> /// <param name="layer"></param> /// <param name="year"></param> /// <author>Shen Yongyuan</author> /// <date>20091111</date> public static void JoinIndexTable(ILayer layer, string indexName, int year, string city, bool normal) { //Add Fields IFieldsEdit allFields = new FieldsClass(); IFieldEdit field1 = new FieldClass(); field1.Name_2 = "ID"; field1.Type_2 = esriFieldType.esriFieldTypeString; allFields.AddField(field1); IFieldEdit field2 = new FieldClass(); field2.Name_2 = Town.Constant.Constant.TmpFieldName; field2.Type_2 = esriFieldType.esriFieldTypeDouble; allFields.AddField(field2); //Create Table IWorkspaceFactory workspaceFactory = new InMemoryWorkspaceFactoryClass(); IWorkspaceName workspaceName = workspaceFactory.Create("", "Temporary WorkSpace In Memory", null, 0); IFeatureWorkspace workspace = ((IName)workspaceName).Open() as IFeatureWorkspace; ITable table = workspace.CreateTable(Town.Constant.Constant.TmpTableIndex, allFields, null, null, ""); //Import Data IWorkspaceEdit workspaceEdit = workspace as IWorkspaceEdit; workspaceEdit.StartEditing(false); workspaceEdit.StartEditOperation(); ICursor cursor = table.Insert(true); int fldField1 = cursor.Fields.FindField("ID"); int fldField2 = cursor.Fields.FindField(Town.Constant.Constant.TmpFieldName); IQueryable <DataLib.I_INDEX> indexCollect = DataLib.DA_Index.QueryIndex(indexName, city).Where(c => c.FromDate.Year == year); foreach (DataLib.I_INDEX index in indexCollect) { IRowBuffer buffer = table.CreateRowBuffer(); buffer.set_Value(fldField1, index.I_ZONE.OID); if (normal == false) { buffer.set_Value(fldField2, index.Value); } else if (normal == true && DataLib.DA_Index.QueryIndex(indexName, city).Min(c => c.Value) > 0) { buffer.set_Value(fldField2, index.Value); } else { buffer.set_Value(fldField2, index.Value + Math.Abs(DataLib.DA_Index.QueryIndex(indexName, city).Min(c => c.Value)) + 1); } cursor.InsertRow(buffer); } cursor.Flush(); workspaceEdit.StartEditOperation(); workspaceEdit.StopEditing(true); System.Runtime.InteropServices.Marshal.ReleaseComObject(cursor); //Join IMemoryRelationshipClassFactory pMemRelFact = new MemoryRelationshipClassFactory(); IFeatureLayer feaLayer = layer as IFeatureLayer; ITable originTable = feaLayer.FeatureClass as ITable; IRelationshipClass pRelClass = pMemRelFact.Open("Join", originTable as IObjectClass, "ID", table as IObjectClass, "ID", "forward", "backward", esriRelCardinality.esriRelCardinalityOneToOne); IDisplayRelationshipClass pDispRC = feaLayer as IDisplayRelationshipClass; pDispRC.DisplayRelationshipClass(null, esriJoinType.esriLeftOuterJoin); pDispRC.DisplayRelationshipClass(pRelClass, esriJoinType.esriLeftOuterJoin); }
//======================================================================================== //陈胜鹏 2009-08-19 添加 /// <summary> /// 融合选择集中的要素 /// </summary> /// <param name="pSelectionSet">选择集对象,从中取出需要融合的要素</param> /// <param name="pMergeLayer">发生融合的要素所在图层</param> /// <param name="OID">被保留的要素OID</param> private void MergeSelectedFeature(ISelectionSet pSelectionSet, IFeatureLayer pMergeLayer, int OID) { //判断是否满足融合条件 bool CanMerge = JudgeCondition(); //OID = 0; //如果满足融合的判定条件才能开始进行融合(这里主要分几何条件和属性条件) if (CanMerge) { IEnumIDs pEnumIDs; //枚举要素变量 Dictionary <int, IFeature> pDicFeature = new Dictionary <int, IFeature>(); //存储多个需要融合的要素的字典 int FtID = 0; //要素OID IGeometry pGeoTemp = null; //存储融合后的要素图形 ITopologicalOperator pTopoOperator; IFeature pFt = null; int pTempFeatID = 0; IFeatureClass pFeatCls = pMergeLayer.FeatureClass; pEnumIDs = pSelectionSet.IDs; FtID = pEnumIDs.Next(); //初始化临时要素图形 pTempFeatID = FtID; pGeoTemp = pFeatCls.GetFeature(pTempFeatID).Shape; pDicFeature.Add(FtID, pFeatCls.GetFeature(pTempFeatID)); //记录遍历到的要素ID FtID = pEnumIDs.Next(); while (FtID != -1) { //获得需要融合的第二个要素 pFt = pFeatCls.GetFeature(FtID); pDicFeature.Add(FtID, pFt); //记录遍历到的要素ID //融合要素的图形 pTopoOperator = pGeoTemp as ITopologicalOperator; pGeoTemp = pTopoOperator.Union(pFt.ShapeCopy); //临时图形进行简单化 pTopoOperator = pGeoTemp as ITopologicalOperator; pTopoOperator.Simplify(); //下一个要素 FtID = pEnumIDs.Next(); } //获取第一个保留的要素,赋给它融合后的图形,并保存 pFt = pFeatCls.GetFeature(OID); pFt.Shape = pGeoTemp; //处理设置FID、state不一致问题 wjj 20090903 IDisplayRelationshipClass pDisResCls = pMergeLayer as IDisplayRelationshipClass; if (pDisResCls.RelationshipClass != null) //是否与日志记录表做了联表查询 { //获取图幅结合表 IFeatureLayer pFeatLay = ModPublic.GetLayerOfGroupLayer(myHook.MapControl, "范围", "图幅范围") as IFeatureLayer; if (pFeatLay != null) { ChangeFeatureState(pDisResCls.RelationshipClass, pFt, pDicFeature, pFeatLay.FeatureClass); } } pFt.Store(); //删除被融合的要素 foreach (KeyValuePair <int, IFeature> var in pDicFeature) { if (var.Key != OID) { pFt = pFeatCls.GetFeature(var.Key); pFt.Delete(); } } pDicFeature = null; } }
void IJoin.Perform() { _relClassEdit = (IRelationshipClassCollectionEdit)_featureLayer; _relClassEdit.RemoveAllRelationshipClasses(); _geoFeatureLayer = (IGeoFeatureLayer)_featureLayer; _dspRel = (IDisplayRelationshipClass)_geoFeatureLayer; _memRelFact = new MemoryRelationshipClassFactoryClass(); IObjectClass tblObj = (IObjectClass)_table; _relClass = _memRelFact.Open("test", _geoFeatureLayer.FeatureClass, _joinFieldOnLayer, tblObj, _joinFieldOnTable, "Forwards", "Backwards", _cardinality); _dspRel.DisplayRelationshipClass(_relClass, _type); }