带有多个字段Excel表格显示XY并存储为点图层

重点提示!!!shapefile图层的属性表字段名称是限长的(具体多长可以在ArcGIS里看一下),Excel中字段名称不要过长,否则,读取表格创建featureClass时会判断出错。
如将上述Excel数据处理成点图层(.shp)如将上述Excel数据处理成点图层(.shp)

函数及说明
(1)
功能:Excel数据创建IFeatureClass
输入数据:Excel全路径
输出数据:IfeatureClass

public IFeatureClass getExcelTable(string path)
        {
            string name = System.IO.Path.GetFileNameWithoutExtension(path);
            ESRI.ArcGIS.esriSystem.IPropertySet proset = new ESRI.ArcGIS.esriSystem.PropertySetClass();
            string strcon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + path + @";Extended Properties=Excel 8.0";
            proset.SetProperty("CONNECTSTRING", strcon);

            IWorkspaceFactory workspf = new ESRI.ArcGIS.DataSourcesOleDB.OLEDBWorkspaceFactoryClass();
            IFeatureWorkspace fworkfac = workspf.Open(proset, 0) as IFeatureWorkspace;    
            IQueryDef myQueryDef = fworkfac.CreateQueryDef();
            myQueryDef.Tables = "["+name+"$]";
            myQueryDef.SubFields = "*";
            myQueryDef.WhereClause = "";    
            ICursor myCursor = myQueryDef.Evaluate();
            IFields myfields = myCursor.Fields;    
            IRow myRow;
            IPoint point = new PointClass();
            
            IFeatureClass newfeatureclass = creatFeatureClass(myfields,name);
            ISpatialReferenceFactory srFactory = new SpatialReferenceEnvironmentClass();
            ISpatialReference sr1;
            IGeographicCoordinateSystem pcs = srFactory.CreateGeographicCoordinateSystem((int)esriSRGeoCSType.esriSRGeoCS_WGS1984);
            sr1 = pcs;

            while ((myRow = myCursor.NextRow()) != null)
            {
                string str="",strr="";
                point.PutCoords(double.Parse(str=myRow.get_Value(3).ToString()), double.Parse(strr=myRow.get_Value(4).ToString()));
                point.SpatialReference = sr1;
                IFeatureCursor m_cursor = newfeatureclass.Insert(true);
                IFeatureBuffer m_buffer = newfeatureclass.CreateFeatureBuffer();
                m_buffer.Shape = point;
                for (int i = 0; i < myfields.FieldCount; i++)
                {
                    string sttt = "";
                    if (myfields.get_Field(i).Name.Equals("经度(度)") || myfields.get_Field(i).Name.Equals("纬度(度)") || myfields.get_Field(i).Name.Equals("海拔(米)") || myfields.get_Field(i).Name.Equals("V13305") || myfields.get_Field(i).Name.Equals("V12001_701") || myfields.get_Field(i).Name.Equals("总辐射"))
                    {
                        double a;
                        m_buffer.set_Value(newfeatureclass.FindField(sttt = myfields.get_Field(i).Name), a=double.Parse(myRow.get_Value(i).ToString()));
                    }
                    else
                    {
                        m_buffer.set_Value(newfeatureclass.FindField(sttt = myfields.get_Field(i).Name), myRow.get_Value(i).ToString());                            
                    }                        
                }
                m_cursor.InsertFeature(m_buffer);
                m_cursor.Flush();
            }            
            return newfeatureclass;
        }

(2)
功能:函数(1)调用的子函数,创建FeatureClass
输入数据:获取的表格的字段和Excel表格名称或工作表名称(表格名称或工作表名称作为FeatureClass的名称,表格字段作为新建FeatureClass的字段)。
输出函数:IFeatureClass

private IFeatureClass creatFeatureClass(IFields myfields,string name)
        {

            string tempStorePath = @"C:\Users\Administrator\Desktop\newnew\t1";
            IWorkspaceFactory workspacefactory=new ShapefileWorkspaceFactory();
            IFeatureWorkspace featureworkspace = (IFeatureWorkspace)workspacefactory.OpenFromFile(tempStorePath, 0);
            string layerName = name;

            IFields pFields = new FieldsClass();
            IFieldsEdit pFieldsEdit = pFields as IFieldsEdit;

            IField shapeField = new FieldClass();
            IFieldEdit shapeEdit = shapeField as IFieldEdit;
            shapeEdit.Name_2 = "Shape";
            shapeEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;
            IGeometryDef pGeometoryDef = new GeometryDefClass();
            IGeometryDefEdit pGeometoryDefEdit = pGeometoryDef as IGeometryDefEdit;
            pGeometoryDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPoint;
            ISpatialReferenceFactory srFactory = new SpatialReferenceEnvironmentClass();
            ISpatialReference sr1;
            int a = 0;
            IGeographicCoordinateSystem pcs = srFactory.CreateGeographicCoordinateSystem(a=(int)esriSRGeoCSType.esriSRGeoCS_WGS1984);
            sr1 = pcs;
            pGeometoryDefEdit.SpatialReference_2 = sr1;
            shapeEdit.GeometryDef_2 = pGeometoryDefEdit;
            pFieldsEdit.AddField(shapeField);

            //List<Field> fids = new List<Field>();
            for (int i = 0; i < myfields.FieldCount; i++)
            {
                IField x = new FieldClass();
                IFieldEdit xx = x as IFieldEdit;
                xx.Name_2 = myfields.get_Field(i).Name;
                if (myfields.get_Field(i).Name.Equals("经度(度)") || myfields.get_Field(i).Name.Equals("纬度(度)") || myfields.get_Field(i).Name.Equals("海拔(米)") || myfields.get_Field(i).Name.Equals("V13305") || myfields.get_Field(i).Name.Equals("V12001_701") || myfields.get_Field(i).Name.Equals("总辐射"))
                {
                    xx.Type_2 = esriFieldType.esriFieldTypeDouble;
                }
                else
                {
                    xx.Type_2 = esriFieldType.esriFieldTypeString;
                }                
                pFieldsEdit.AddField(x);    
            }

(3)
功能:将获得的IFeatureClass导出至点图层
输入数据:IFeatureClass和文件夹路径(导出的结果将存储在此文件夹下)

public void ExportFeature(IFeatureClass pInFeatureClass, string pPath)
        {   
            IWorkspaceFactory pWorkspaceFactory = new ShapefileWorkspaceFactoryClass();
            string parentPath = pPath.Substring(0, pPath.LastIndexOf('\\'));
            string fileName = pPath.Substring(pPath.LastIndexOf('\\') + 1, pPath.Length - pPath.LastIndexOf('\\') - 1);
            IWorkspaceName pWorkspaceName = pWorkspaceFactory.Create(parentPath, fileName, null, 0);   
            IName name = (IName)pWorkspaceName;  
            IWorkspace pOutWorkspace = (IWorkspace)name.Open();    
            IDataset pInDataset = pInFeatureClass as IDataset;
            IFeatureClassName pInFCName = pInDataset.FullName as IFeatureClassName;
            IWorkspace pInWorkspace = pInDataset.Workspace;
            IDataset pOutDataset = pOutWorkspace as IDataset;
            IWorkspaceName pOutWorkspaceName = pOutDataset.FullName as IWorkspaceName;
            IFeatureClassName pOutFCName = new FeatureClassNameClass();
            IDatasetName pDatasetName = pOutFCName as IDatasetName;
            pDatasetName.WorkspaceName = pOutWorkspaceName;
            pDatasetName.Name = pInFeatureClass.AliasName;
            IFieldChecker pFieldChecker = new FieldCheckerClass();
            pFieldChecker.InputWorkspace = pInWorkspace;
            pFieldChecker.ValidateWorkspace = pOutWorkspace;
            IFields pFields = pInFeatureClass.Fields;
            IFields pOutFields;
            IEnumFieldError pEnumFieldError;
            pFieldChecker.Validate(pFields, out pEnumFieldError, out pOutFields);
            IFeatureDataConverter pFeatureDataConverter = new FeatureDataConverterClass();
            pFeatureDataConverter.ConvertFeatureClass(pInFCName, null, null, pOutFCName, null, pOutFields, "", 100, 0);
        }

有参考网上代码,文章学习使用,欢迎交流学习。

猜你喜欢

转载自blog.csdn.net/qq_40821274/article/details/84312007
今日推荐