예제 #1
0
 public static bool TableIsJoinLayer(ITable itable_0, ITable itable_1)
 {
     try
     {
         IDisplayTable table = itable_0 as IDisplayTable;
         if (table != null)
         {
             ITable displayTable = table.DisplayTable;
             string str          = (itable_1 as IDataset).Name.ToLower();
             while (displayTable is IRelQueryTable)
             {
                 IRelQueryTable table3 = displayTable as IRelQueryTable;
                 if ((table3.DestinationTable as IDataset).Name.ToLower() == str)
                 {
                     return(true);
                 }
                 displayTable = table3.SourceTable;
             }
         }
         return(false);
     }
     catch (COMException exception)
     {
         MessageBox.Show(exception.Message, "COM Error: " + exception.ErrorCode.ToString(), MessageBoxButtons.OK,
                         MessageBoxIcon.Exclamation);
     }
     catch (Exception exception2)
     {
         MessageBox.Show(exception2.Message, ".NET Error: ", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
     }
     return(false);
 }
예제 #2
0
        /// <summary>
        /// This function will check to make sure that the passed in layer is a valid SDE layer.
        /// It ensures that the layer is not:
        ///      and that it is not
        ///         1). an XY event layer
        ///         2). in a relationship with a RESPONDER layer
        /// </summary>
        /// <param name="pLayer">the layer to validate</param>
        /// <returns>true / false (is valid / not valid)</returns>
        public static bool IsValidGisLayer(ILayer pLayer)
        {
            if (pLayer.Valid && pLayer is IGeoFeatureLayer)
            {
                // Skip the feature if it is an XY Event Source
                IGeoFeatureLayer pGfLayer = pLayer as IGeoFeatureLayer;
                if (pGfLayer.FeatureClass is IXYEventSource)
                {
                    return(false);
                }

                // Skip the feature if it is joined to a Responder table
                IDisplayTable pDispTable = pLayer as IDisplayTable;
                if (pDispTable != null)
                {
                    ITable pTable = pDispTable.DisplayTable;
                    var    table  = pTable as IRelQueryTable;
                    if (table != null)
                    {
                        IRelQueryTable pRelQueryTable = table;
                        IObjectClass   pClass         = pRelQueryTable.DestinationTable as IObjectClass;
                        if (pClass == null)
                        {
                            return(false);
                        }
                    }
                }
                //// See if the feature name is for a Service Location
                //string sName = pGfLayer.FeatureClass.AliasName;
                //if (sName == layerName)
                return(true);
            }
            return(false);
        }
예제 #3
0
        /// <summary>
        ///     Creates an enumeration of the <see cref="IRelQueryTable" />.
        /// </summary>
        /// <param name="source">The source.</param>
        /// <returns>Returns a <see cref="IEnumerable{IRelQueryTable}" /> representing the collection of tables.</returns>
        public static IEnumerable <IRelQueryTable> AsEnumerable(this IRelQueryTable source)
        {
            IRelQueryTable table = source;

            while (table != null)
            {
                yield return(table);

                table = table.SourceTable as IRelQueryTable;
            }
        }
예제 #4
0
        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;
                    }
                }
            }
        }
예제 #5
0
 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
     {
     }
 }
예제 #6
0
        /// <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);
        }
예제 #7
0
        private void btnStatistics_Click(object sender, EventArgs e)
        {
            if (m_pCurFeaCls == null)
            {
                return;
            }

            this.Cursor = Cursors.WaitCursor;
            try
            {
                //空间过滤
                IQueryFilter pQueryFilter = null;
                if (m_pGeometry != null)
                {
                    ISpatialFilter pSpatialFilter = new SpatialFilterClass();
                    pSpatialFilter.Geometry   = m_pGeometry;
                    pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;
                    pQueryFilter = pSpatialFilter as ISpatialFilter;
                }
                else
                {
                    pQueryFilter = new QueryFilterClass();
                }
                //属性条件
                pQueryFilter.WhereClause = this.txtSQL.Text;

                IFeatureClass pFeaCls = m_pCurFeaCls;

                IRelQueryTable pRelQueryTable = pFeaCls as IRelQueryTable;
                if (pRelQueryTable != null)
                {
                    IRelationshipClass pRelShip = pRelQueryTable.RelationshipClass;
                    pFeaCls = pRelShip.OriginClass as IFeatureClass;
                }

                //初始化表
                DataTable dt = InitDataTalbe(pFeaCls);

                //绑定 以便动态显示
                this.gridRes.DataSource = dt;

                IFeatureCursor pFeaCursor = pFeaCls.Search(pQueryFilter, false);
                IFeature       pFea       = pFeaCursor.NextFeature();

                while (pFea != null)
                {
                    InsterFeaToTable(pFea, dt, m_pGeometry);
                    pFea = pFeaCursor.NextFeature();
                }

                System.Runtime.InteropServices.Marshal.ReleaseComObject(pFeaCursor);
                pFeaCursor = null;

                //计算面积综合
                GetSum(dt, pFeaCls);

                //修饰表格
                EditGrid(pFeaCls);

                //初始统计图的combobox
                InitChartWhere();
            }
            catch (Exception ex)
            {
            }

            this.Cursor = Cursors.Default;
        }
예제 #8
0
        /// <summary>
        /// 初始化符号信息
        /// </summary>
        protected override void InitialSymbol()
        {
            base.InitialSymbol();

            if (m_pUniqueRender == null || m_pFeatureLayer == null)
            {
                return;
            }
            //是否是多个字段
            bool bNoSepFieldVal = false;
            //是否是连接表
            bool bIsJoined = false;

            try
            {
                IDisplayTable pDisplayTable = m_pFeatureLayer as IDisplayTable;
                ITable        pTable        = pDisplayTable.DisplayTable;
                IDataset      objDataset    = m_FeatureClass as IDataset;
                //是否是关系表
                if (pTable is IRelQueryTable)
                {
                    bIsJoined = true;
                }

                if (FieldCount > 1)
                {
                    bNoSepFieldVal = true;
                }
                //唯一值字段有多个
                if (bNoSepFieldVal)
                {
                    //数据源为SHAPE文件
                    if (objDataset.Workspace.Type == esriWorkspaceType.esriFileSystemWorkspace)
                    {
                        for (int i = 1; i <= FieldCount; i++)
                        {
                            FieldNames.Add(m_pUniqueRender.Field[i - 1].ToLower());
                        }

                        CommStaticClass.GimmeUniqueValuesFromShape(m_FeatureClass as ITable, FieldNames);
                    }
                    //数据源为其他
                    else
                    {
                        for (int i = 1; i <= FieldCount; i++)
                        {
                            FieldNames.Add(m_pUniqueRender.Field[i - 1].ToLower());
                            //属性表有连接表
                            if (pTable is IRelQueryTable)
                            {
                                IRelQueryTable pRelQueryTable     = default(IRelQueryTable);
                                ITable         pDestTable         = default(ITable);
                                IDataset       pDataSet           = default(IDataset);
                                IList <string> alJoinedTableNames = new List <string>();
                                while (pTable is IRelQueryTable)
                                {
                                    pRelQueryTable = pTable as IRelQueryTable;
                                    pDestTable     = pRelQueryTable.DestinationTable;
                                    pDataSet       = pDestTable as IDataset;

                                    pTable = pRelQueryTable.SourceTable;
                                    alJoinedTableNames.Add(pDataSet.Name);
                                }
                                CommStaticClass.GimmeUniqeValuesForFieldname(m_FeatureClass as ITable, m_pUniqueRender.Field[i - 1], alJoinedTableNames);
                                pTable = pDisplayTable.DisplayTable;
                            }
                            //属性表没有连接表
                            else
                            {
                                CommStaticClass.GimmeUniqeValuesForFieldname(m_FeatureClass as ITable, m_pUniqueRender.Field[i - 1]);
                            }
                        }
                    }
                }
                //唯一值字段只有一个
                else
                {
                    FieldNames.Add(m_pUniqueRender.Field[FieldCount - 1].ToLower());
                }

                //开始解析符号
                for (int j = 0; j <= ValueCount - 1; j++)
                {
                    ISymbol         pSymbol      = m_pUniqueRender.get_Symbol(m_pUniqueRender.get_Value(j));
                    ptSymbolFactory pSymbolFac   = new ptSymbolFactory(pSymbol);
                    ptSymbolClass   pSymbolClass = pSymbolFac.GetSymbolClass(m_pUniqueRender.Label[m_pUniqueRender.get_Value(j)], CommStaticClass.getUVFieldValues(m_pUniqueRender, j)
                                                                             , 0, 0);
                    SymbolList.Add(pSymbolClass);
                }
            }
            catch (Exception ex)
            {
                ptLogManager.WriteMessage(string.Format("方法名称:{0}{1}{2}{3}{4}", "InitialSymbol", Environment.NewLine, ex.Message, Environment.NewLine, ex.StackTrace));
            }
        }
예제 #9
0
        /// <summary>
        /// 处理设置融合时FID、state不一致问题并修改核心日志记录表
        /// </summary>
        /// <param name="pRelationshipClass">融合要素关系类</param>
        /// <param name="pTargetFeat">保留属性的要素</param>
        /// <param name="pDicFeature">融合要素集合</param>
        /// <param name="pRangeClss">图幅结合表</param>
        private void ChangeFeatureState(IRelationshipClass pRelationshipClass, IFeature pTargetFeat, Dictionary <int, IFeature> pDicFeature, IFeatureClass pRangeClss)
        {
            if (MoData.v_LogTable == null)
            {
                return;
            }
            if (MoData.v_LogTable.DbConn == null)
            {
                return;                                    //日志记录表是否连接
            }
            if (pDicFeature == null || pRelationshipClass == null || pRangeClss == null)
            {
                return;
            }
            Exception      exError            = null;
            IRelQueryTable pJionRelQueryTable = SysCommon.Gis.ModGisPub.GetRelQueryTable(pRelationshipClass, true, null, "STATE", false, true, out exError);
            IFeatureClass  pFeatCls           = pJionRelQueryTable as IFeatureClass;

            if (pFeatCls == null)
            {
                return;
            }

            IDataset pOriginIDataset = pRelationshipClass.OriginClass as IDataset;    //要素类

            if (pOriginIDataset == null)
            {
                return;
            }

            int indexOID   = pFeatCls.Fields.FindField(pOriginIDataset.Name + ".OBJECTID");
            int indexFID   = pFeatCls.Fields.FindField(pOriginIDataset.Name + ".GOFID");
            int indexState = pFeatCls.Fields.FindField(pRelationshipClass.DestinationClass.AliasName + ".STATE");

            if (indexOID == -1 || indexFID == -1 || indexState == -1)
            {
                return;
            }

            object temp = pFeatCls.GetFeature(pTargetFeat.OID).get_Value(indexState);

            if (temp is DBNull)
            {
                temp = -1;                          //表示未变化
            }
            int valueTargetState = Convert.ToInt32(temp);
            int valueTargetFID   = Convert.ToInt32(pFeatCls.GetFeature(pTargetFeat.OID).get_Value(indexFID));

            if (valueTargetState == 1 || valueTargetState == 2)    //为发生变化的要素
            {
                foreach (KeyValuePair <int, IFeature> keyValue in pDicFeature)
                {
                    if (keyValue.Key == pTargetFeat.OID)
                    {
                        continue;                                    //为保留属性的要素则跳到下个要素
                    }
                    IFeature pTempFeature = pFeatCls.GetFeature(keyValue.Key);
                    temp = pTempFeature.get_Value(indexState);
                    if (temp is DBNull)
                    {
                        temp = -1;                          //表示未变化
                    }
                    int valueState = Convert.ToInt32(temp);
                    int valueFID   = Convert.ToInt32(pTempFeature.get_Value(indexFID));

                    if (valueState == 1)
                    {//该要素的State为新建,则删除该要素日志记录表中对应内容
                        string strCon = "LAYERNAME='" + pOriginIDataset.Name + "'and OID=" + pTempFeature.OID + " and STATE=1 and SAVE=1";
                        MoData.v_LogTable.UpdateTable("delete * from UpdateLog where " + strCon, out exError);
                    }
                    else if (valueState == 2)
                    {//该要素的State为修改
                        string strCon = "GOFID=" + valueFID + " and SAVE=1";
                        if (valueFID != valueTargetFID)
                        {//该要素的FID与保留属性要素FID不同,则将该要素日志记录表中对应内容状态修改为删除
                            MoData.v_LogTable.UpdateTable("update UpdateLog set STATE=3 where " + strCon, out exError);
                        }
                        else
                        {//则删除该要素日志记录表中对应内容
                            MoData.v_LogTable.UpdateTable("delete * from UpdateLog where " + strCon, out exError);
                        }
                    }
                    else
                    {     //该要素的State为未变化
                        if (valueFID != valueTargetFID)
                        { //该要素的FID与保留属性要素FID不同,则在日志记录表中增加该要素对应内容状态为删除
                            string strSQL = "insert into UpdateLog(GOFID,STATE,SAVE) values(" + valueFID.ToString() + ",3,1)";
                            MoData.v_LogTable.UpdateTable(strSQL, out exError);
                        }
                    }
                }
            }
            else    //为未发生变化的要素
            {
                bool bAddLog = false;
                foreach (KeyValuePair <int, IFeature> keyValue in pDicFeature)
                {
                    if (keyValue.Key == pTargetFeat.OID)
                    {
                        continue;                                    //为保留属性的要素则跳到下个要素
                    }
                    IFeature pTempFeature = pFeatCls.GetFeature(keyValue.Key);
                    temp = pTempFeature.get_Value(indexState);
                    if (temp is DBNull)
                    {
                        temp = -1;                          //表示未变化
                    }
                    int valueState = Convert.ToInt32(temp);
                    int valueFID   = Convert.ToInt32(pTempFeature.get_Value(indexFID));

                    if (valueState == 1)
                    {//该要素的State为新建,则删除该要素日志记录表中对应内容,并在日志记录表中增加保留属性要素对应内容状态为修改
                        string strCon = "LAYERNAME='" + pOriginIDataset.Name + "'and OID=" + pTempFeature.OID + " and STATE=1 and SAVE=1";
                        MoData.v_LogTable.UpdateTable("delete * from UpdateLog where " + strCon, out exError);

                        if (bAddLog == false) //(只增加一次)在日志记录表中增加保留属性要素对应内容状态为修改
                        {
                            string strSQL = "insert into UpdateLog(GOFID,LAYERNAME,OID,STATE,SAVE) values(" + valueTargetFID.ToString() + ",'" + pOriginIDataset.Name + "'," + pTargetFeat.OID + ",2,1)";
                            MoData.v_LogTable.UpdateTable(strSQL, out exError);
                            bAddLog = true;
                        }
                    }
                    else if (valueState == 2)
                    {//该要素的State为修改
                        string strCon = "GOFID=" + valueFID + " and SAVE=1";
                        if (valueFID != valueTargetFID)
                        {//该要素的FID与保留属性要素FID不同,则将该要素日志记录表中对应内容状态修改为删除
                            MoData.v_LogTable.UpdateTable("update UpdateLog set STATE=3 where " + strCon, out exError);
                        }
                        else
                        {//则删除该要素日志记录表中对应内容
                            MoData.v_LogTable.UpdateTable("delete * from UpdateLog where " + strCon, out exError);
                        }

                        if (bAddLog == false) //(只增加一次)在日志记录表中增加保留属性要素对应内容状态为修改
                        {
                            string strSQL = "insert into UpdateLog(GOFID,LAYERNAME,OID,STATE,SAVE) values(" + valueTargetFID.ToString() + ",'" + pOriginIDataset.Name + "'," + pTargetFeat.OID + ",2,1)";
                            MoData.v_LogTable.UpdateTable(strSQL, out exError);
                            bAddLog = true;
                        }
                    }
                    else
                    {     //该要素的State为未变化,则增加日志记录表中对应内容状态为删除
                        if (valueFID != valueTargetFID)
                        { //该要素的FID与保留属性要素FID不同,则在日志记录表中增加该要素应内容状态为删除
                            string strSQL = "insert into UpdateLog(GOFID,STATE,SAVE) values(" + valueFID.ToString() + ",3,1)";
                            MoData.v_LogTable.UpdateTable(strSQL, out exError);
                        }

                        if (bAddLog == false) //(只增加一次)在日志记录表中增加保留属性要素对应内容状态为修改
                        {
                            string strSQL = "insert into UpdateLog(GOFID,LAYERNAME,OID,STATE,SAVE) values(" + valueTargetFID.ToString() + ",'" + pOriginIDataset.Name + "'," + pTargetFeat.OID + ",2,1)";
                            MoData.v_LogTable.UpdateTable(strSQL, out exError);
                            bAddLog = true;
                        }
                    }
                }
            }
        }