///////////////////////////////////////////////////////////////////////////////////////////// // create a shapefile public IFeatureClass CreateShapefile(string strShapeFolder, FeatureSource selLayer, string shpFileName) { Console.WriteLine(shpFileName); // prepared the shapefile fodler try { if (!System.IO.Directory.Exists(strShapeFolder)) System.IO.Directory.CreateDirectory(strShapeFolder); } catch (Exception ex) { MessageBox.Show(ex.ToString()); } // if shapefile already exists, overwrite? string shpfileName = strShapeFolder + "\\" + shpFileName + ".shp"; string dbffileName = strShapeFolder + "\\" + shpFileName + ".dbf"; string shxfileName = strShapeFolder + "\\" + shpFileName + ".shx"; if (File.Exists(shpfileName) || File.Exists(dbffileName) || File.Exists(shxfileName)) { if (MessageBox.Show("shape file: " + strShapeFolder + "\\" + selLayer.Name + " already exists", "overwrite?", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) return null; else { File.Delete(shpfileName); File.Delete(dbffileName); File.Delete(shxfileName); } } // create workspace IWorkspaceFactory pWSF = new ShapefileWorkspaceFactoryClass(); IFeatureWorkspace pWS = (IFeatureWorkspace)pWSF.OpenFromFile(strShapeFolder, 0); // get the feature table FeatureDataTable ftable = selLayer.GetDataTable(); int rowCount = ftable.Rows.Count; int colCount = ftable.Columns.Count; int geometryColIndex = ftable.GeometryColumnIndex; // create fields //fields ESRI.ArcGIS.Geodatabase.IFields pFields = new FieldsClass(); IFieldsEdit pFieldsEdit = (IFieldsEdit)pFields; pFieldsEdit.FieldCount_2 = colCount; Console.WriteLine("Colume Counts = " + colCount.ToString()); //field IField pField; IFieldEdit pFieldEdit; string shpFldName = ""; for (int col = 0; col < colCount; col++) { DataColumn dc = ftable.Columns[col]; pField = new FieldClass(); pFieldEdit = (IFieldEdit)pField; String colname = dc.ColumnName; if (colname.Length > 10) { colname = colname.Substring(0, 8) + col.ToString(); } pFieldEdit.AliasName_2 = colname; pFieldEdit.Name_2 = colname; pFieldEdit.IsNullable_2 = true; pFieldEdit.Editable_2 = true; Type dt = dc.DataType; Console.WriteLine(dc.ColumnName + "\t\t" + colname + "\t\t" + dt.ToString()); if (dt == typeof(String)) pFieldEdit.Type_2 = esriFieldType.esriFieldTypeString; else if ((dt == typeof(Boolean))) pFieldEdit.Type_2 = esriFieldType.esriFieldTypeSmallInteger; else if ((dt == typeof(Int16)) || (dt == typeof(Int32)) || (dt == typeof(Int64))) pFieldEdit.Type_2 = esriFieldType.esriFieldTypeInteger; else if (dt == typeof(Double)) pFieldEdit.Type_2 = esriFieldType.esriFieldTypeDouble; else if (dt == typeof(Single)) pFieldEdit.Type_2 = esriFieldType.esriFieldTypeSingle; else if (dt == typeof(DateTime)) pFieldEdit.Type_2 = esriFieldType.esriFieldTypeDate; else if (dt == typeof(Guid)) //pFieldEdit.Type_2 = esriFieldType.esriFieldTypeGUID; // not supported by shapefile pFieldEdit.Type_2 = esriFieldType.esriFieldTypeString; else if (dt == typeof(ESRI.ArcGIS.Mobile.GlobalId)) pFieldEdit.Type_2 = esriFieldType.esriFieldTypeString; //pFieldEdit.Type_2 = esriFieldType.esriFieldTypeGlobalID; // not supported by shapefile else if (dt == typeof(Bitmap)) // raster or blob, not supported by shapefile, { Console.WriteLine(dc.ColumnName + ": raster field found\n"); string folder = strShapeFolder + "\\" + dc.ColumnName; try { if (!Directory.Exists(folder)) Directory.CreateDirectory(folder); } catch (Exception ex) { MessageBox.Show(ex.ToString()); return null; } pFieldEdit.Type_2 = esriFieldType.esriFieldTypeString; } else if (dt == typeof(System.Byte[])) // raster or blob, not supported by shapefile, { Console.WriteLine(dc.ColumnName + ": blob field found\n"); pFieldEdit.Type_2 = esriFieldType.esriFieldTypeString; } else if (dt == typeof(Bitmap)) // raster or blob, not supported by shapefile, { Console.WriteLine(dc.ColumnName + ": raster field found\n"); string folder = strShapeFolder + "\\" + dc.ColumnName; try { if (!Directory.Exists(folder)) Directory.CreateDirectory(folder); } catch (Exception ex) { MessageBox.Show(ex.ToString()); return null; } pFieldEdit.Type_2 = esriFieldType.esriFieldTypeString; } else if (dt == typeof(System.Byte[])) // raster or blob, not supported by shapefile, { Console.WriteLine(dc.ColumnName + ": blob field found\n"); pFieldEdit.Type_2 = esriFieldType.esriFieldTypeString; } else if (dt == typeof(ESRI.ArcGIS.Mobile.Geometries.Geometry)) { Console.WriteLine("geometry field found\n"); shpFldName = dc.ColumnName; pFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry; IGeometryDef pGeoDef = new GeometryDefClass(); IGeometryDefEdit pGeoDefEdit = (IGeometryDefEdit)pGeoDef; pGeoDefEdit.GeometryType_2 = (ESRI.ArcGIS.Geometry.esriGeometryType)selLayer.GeometryType; pGeoDefEdit.SpatialReference_2 = new ESRI.ArcGIS.Geometry.UnknownCoordinateSystemClass(); pFieldEdit.GeometryDef_2 = pGeoDef; } else { throw (new Exception("different data type found, modify the code")); } // add the field to fields pFieldsEdit.set_Field(col, pFieldEdit); } for (int ii = 0; ii < pFields.FieldCount; ii++) { Console.WriteLine(pFields.get_Field(ii).Name + "\t\t" + pFields.get_Field(ii).Type.ToString()); } //create shapefile IFeatureClass fc = null; try { fc = pWS.CreateFeatureClass(shpFileName, pFields, null, null, esriFeatureType.esriFTSimple, shpFldName, ""); } catch (Exception ex) { MessageBox.Show(ex.ToString()); } if (fc != null) return fc; else return null; }