重点提示!!!shapefile图层的属性表字段名称是限长的(具体多长可以在ArcGIS里看一下),Excel中字段名称不要过长,否则,读取表格创建featureClass时会判断出错。
如将上述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);
}
有参考网上代码,文章学习使用,欢迎交流学习。