根据DataTable创建IFeatureClass

来源:互联网 发布:知乎怎么打不开 编辑:程序博客网 时间:2024/06/05 16:43

根据DataTable创建IFeatureClass

   /// <summary>
        /// 根据DataTable创建矢量点文件
        /// </summary>
        /// <param name="pFeatureWorkspace"></param>
        /// <param name="pInputDataTable"></param>
        /// <param name="strFileName"></param>
        /// <param name="strXFieldName"></param>
        /// <param name="strYFieldName"></param>
        /// <param name="pSpatialReference"></param>
        /// <returns></returns>
        public static IFeatureClass CreatePointFeatureClassFromDataTable(IFeatureWorkspace pFeatureWorkspace, DataTable pInputDataTable, string strFileName, string strXFieldName, string strYFieldName, ISpatialReference pSpatialReference)
        {
            IFields pFileds = new FieldsClass();
            IFieldsEdit pFieldsEdit = (IFieldsEdit)pFileds;
            IField pField;
            IFieldEdit pFieldEdit;
            DataColumnCollection pColumns = pInputDataTable.Columns;
            for (int i = 0; i < pColumns.Count; i++)
            {
                pField = new FieldClass();
                pFieldEdit = (IFieldEdit)pField;
                pFieldEdit.Name_2 = pColumns[i].ColumnName;
                //判断字段类型
                if (pColumns[i].DataType.ToString().Trim() == "System.String")
                    pFieldEdit.Type_2 = ESRI.ArcGIS.Geodatabase.esriFieldType.esriFieldTypeString;
                else
                    if (pColumns[i].DataType.ToString().Trim() == "System.Single")
                        pFieldEdit.Type_2 = ESRI.ArcGIS.Geodatabase.esriFieldType.esriFieldTypeSingle;
                    else
                        if (pColumns[i].DataType.ToString().Trim() == "System.DateTime")
                            pFieldEdit.Type_2 = esriFieldType.esriFieldTypeDate;
                        else
                            if (pColumns[i].DataType.ToString().Trim() == "System.Decimal")
                                pFieldEdit.Type_2 = esriFieldType.esriFieldTypeDouble;
                            else
                                if (pColumns[i].DataType.ToString().Trim() == "System.Byte" ||
                                    pColumns[i].DataType.ToString().Trim() == "System.Int16" ||
                                    pColumns[i].DataType.ToString().Trim() == "System.Int32" ||
                                    pColumns[i].DataType.ToString().Trim() == "System.Int64")
                                   
                                    pFieldEdit.Type_2 = esriFieldType.esriFieldTypeInteger;

                pFieldsEdit.AddField(pField);
            }

            IGeometryDef pGeometryDef = new GeometryDefClass();
            IGeometryDefEdit pGeometryDefEdit = pGeometryDef as IGeometryDefEdit;
            pGeometryDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPoint;
            pGeometryDefEdit.SpatialReference_2 = pSpatialReference;
            pField = new FieldClass();
            pFieldEdit = (IFieldEdit)pField;
            pFieldEdit.Name_2 = "shape";
            pFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;
            pFieldEdit.GeometryDef_2 = pGeometryDefEdit;
            pFieldsEdit.AddField(pFieldEdit);

            IFeatureClass pOutFeatureClass = pFeatureWorkspace.CreateFeatureClass(strFileName, pFieldsEdit, null, null, esriFeatureType.esriFTSimple, "shape", "");

            //添加内容
            IFeatureCursor pFeatureCursor = pOutFeatureClass.Insert(true);
            DataRowCollection pRows = pInputDataTable.Rows;
            int iXFieldIndex = pOutFeatureClass.Fields.FindField(strXFieldName);
            int iYFieldIndex = pOutFeatureClass.Fields.FindField(strYFieldName);
           
            for (int i = 0; i < pRows.Count; i++)
            {
                string strXValue = pRows[i][strXFieldName].ToString();
                string strYValue = pRows[i][strYFieldName].ToString();
                if (!string.IsNullOrEmpty(strXFieldName) && !string.IsNullOrEmpty(strYFieldName))
                {
                    double dXValue = Convert.ToDouble(strXValue);
                    double dYValue = Convert.ToDouble(strYValue);
                    IPoint pPoint = new PointClass();
                    pPoint.X = dXValue;
                    pPoint.Y = dYValue;
                    IFeatureBuffer pFeatureBuffer = pOutFeatureClass.CreateFeatureBuffer();
                    pFeatureBuffer.Shape = pPoint;
                    for (int j = 0; j < pColumns.Count; j++)
                    {
                        string strFiledName = pColumns[j].ColumnName;

                        if (pRows[i][j]==System.DBNull.Value) continue;
                        pFeatureBuffer.set_Value(pOutFeatureClass.Fields.FindField(strFiledName), pRows[i][j]);
                    }
                    pFeatureCursor.InsertFeature(pFeatureBuffer);
                }
                pFeatureCursor.Flush();

            }
            System.Runtime.InteropServices.Marshal.ReleaseComObject(pFeatureCursor);
            return pOutFeatureClass;
        }

#Arcgis Engine
原创粉丝点击