コード例 #1
0
        /////////////////////////////////////////////////////////////////////////////////////////////
        // 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;
        }