3 votos

Utilizando ArcObjects, ¿cómo convertir una tabla de Access en una tabla propia de una geodatabase?

He heredado una aplicación ArcGIS que crea una serie de tablas de base de datos de acceso. Me gustaría utilizar ArcObjects para convertirlos en tablas geodatabase adecuados, que entiendo que significa simplemente añadir en un ObjectID.

Encontré un ejemplo mostrando cómo hacer esto con Python pero no pude encontrar uno para C#. ¿Podría alguien indicarme cómo hacerlo o explicarme qué hay que hacer?

5voto

auramo Puntos 161

Para ahorrarte un poco de código puedes utilizar el geoprocesador y llamar a DataManagementTools.CopyRows . Véase también: Cómo ejecutar una herramienta de geoprocesamiento

Por ejemplo

// Create the geoprocessor. 
Geoprocessor GP = new Geoprocessor();

// Create the tool process object.
ESRI.ArcGIS.DataManagementTools.CopyRows copyrowsTool = new
    ESRI.ArcGIS.DataManagementTools.CopyRows();

// Set parameter values.
copyrowsTool.in_rows = @"D:\St_Johns\data.mdb\roads_table";
copyrowsTool.out_table = @"D:\St_Johns\data.gdb\roads_table";

// Execute the tool. 
GP.Execute(copyrowsTool, null);

Además, puede utilizar LINQPad para crear rápidamente prototipos de programas que se parecen más a fragmentos como éste, por ejemplo

void Main()
{
    if (ESRI.ArcGIS.RuntimeManager.ActiveRuntime == null)
        ESRI.ArcGIS.RuntimeManager.BindLicense(ESRI.ArcGIS.ProductCode.EngineOrDesktop);
    var gp = new Geoprocessor();
    var copyRowsTool = new CopyRows();
    copyRowsTool.in_rows = @"C:\GISData\Database1.mdb\Table1";
    copyRowsTool.out_table = @"C:\GISData\Database1.gdb\Table1";
    gp.Execute(copyRowsTool, null);
}

LINQPad Screenshot

Añada las referencias necesarias (recuerde mostrar los ensamblados GAC) y los espacios de nombres en las propiedades de la consulta en LINQPad y ¡listo!

Image http://img850.imageshack.us/img850/9576/5878c5bb83924c1b9ab7c92.png Image http://img194.imageshack.us/img194/4394/ca8934bca75f47748eb4840.png

Notas:

  • Si desea utilizar la versión anterior de LINQPad (2.x) orientada a .NET 3.5, y está en un sistema operativo de 64 bits, deberá obtener el archivo LINQPad para .NET Framework 3.5 - x86 versión de LinqPAD de esta página . Esto se debe a que ArcGIS Desktop/Engine es de 32 bits y algunos ensamblados (específicamente el ensamblado ESRI.ArcGIS.Version) no funcionan con el objetivo de compilación del ejecutable LINQPad 2.x estándar AnyCPU en sistemas operativos de 64 bits. LINQPad 4.x (que se dirige a .NET 4.x) no parece tener este problema.

  • Asegúrese también de configurar "Utilice siempre dominios de aplicación nuevos" en Edición-Preferencias-Avanzadas para evitar los errores "El objeto COM que ha sido separado de su RCW subyacente no puede ser utilizado" al ejecutar una consulta/programa por segunda vez.

2voto

Jay Mooney Puntos 904

Yo hago esto... pero probablemente no sea el mejor enfoque.

   public bool CreateFileGDB(ref string error, string fullshapefilepath, String shapeFileDirectory, String shapeFileName, string badfields, ShapefileType shapefiletype, string Style )
        {
            try
            {
                string projectionfile = fullshapefilepath.ToUpper().Replace(".SHP", ".PRJ");
                string dbffile = fullshapefilepath.ToUpper().Replace(".SHP", ".DBF");

                ISpatialReference spREF = null;
                if (File.Exists(projectionfile))
                    spREF = MapLibrary.Get().srFactory.CreateESRISpatialReferenceFromPRJFile(projectionfile);
                else  //assume standard coords
                    spREF = MapLibrary.Get().standardSpatialReference;

                string GDBPath = shapeFileDirectory + shapeFileName.Replace(".shp", ".gdb");

                if (!Directory.Exists(GDBPath))
                {
                    string InputFields = badfields;

                    string RequiredFields = string.Empty;
                    if (shapefiletype == ShapefileType.Point || shapefiletype == ShapefileType.Polygon)
                        RequiredFields = US_One_Address_with_Zone_Required_Fields;
                    else
                        RequiredFields = US_Streets_with_City_State_ZIP;

                    string[] input = InputFields.Split(splitter);
                    string[] output = RequiredFields.Split(splitter, StringSplitOptions.RemoveEmptyEntries);

                    ESRI.ArcGIS.Geodatabase.IWorkspaceFactory pWorkspaceFactory = new FileGDBWorkspaceFactoryClass();
                    string dir = string.Empty;
                    string filename = string.Empty;
                    Util.GetDirectoryFileName(GDBPath, ref dir, ref filename);

                    //input 
                    IWorkspaceName pInShpWorkspaceName = new WorkspaceNameClass() as IWorkspaceName;
                    pInShpWorkspaceName.PathName = shapeFileDirectory;
                    pInShpWorkspaceName.WorkspaceFactoryProgID = "esriCore.ShapefileWorkspaceFactory";
                    IFeatureClassName pFCName = new FeatureClassNameClass() as IFeatureClassName;
                    IDatasetName pShpDatasetName = pFCName as IDatasetName;
                    pShpDatasetName.Name = shapeFileName;//this is your input file 
                    pShpDatasetName.WorkspaceName = pInShpWorkspaceName;
                    IName sourceName = (IName)pFCName;
                    IFeatureClass sourceFeatureClass = (IFeatureClass)sourceName.Open(); //fails
                    IFields sourceFields = sourceFeatureClass.Fields;
                    List<string> fieldnames = GetFieldNames(sourceFields);

                    //output
                    IWorkspaceName pWorkspaceName = new WorkspaceNameClass() as IWorkspaceName;
                    pWorkspaceName.WorkspaceFactoryProgID = "esriDataSourcesGDB.FileGDBWorkspaceFactory";
                    pWorkspaceName.PathName = GDBPath; //output file 
                    IFeatureClassName pOutputFC = new FeatureClassNameClass();
                    IDatasetName pDataSetName = pOutputFC as IDatasetName;
                    pDataSetName.WorkspaceName = pWorkspaceName;
                    pDataSetName.Name = "Streets";
                    IFeatureDataConverter pShpToFc = new FeatureDataConverterClass();

                    for (int i = 0; i < input.Length; i++)
                        RenameColumn(sourceFields, input[i], output[i]);

                    List<string> newfieldnames = GetFieldNames(sourceFields);

                    if(shapefiletype == ShapefileType.Point)
                    {
                        IGeometryDef def = Create_IGeometryDef(spREF, esriGeometryType.esriGeometryPoint);
                        pShpToFc.ConvertFeatureClass(pFCName, null, null, pOutputFC, def, sourceFields, "", 1000, 0);
                    }
                    else if(shapefiletype == ShapefileType.Polygon)
                    {
                        IGeometryDef def = Create_IGeometryDef(spREF, esriGeometryType.esriGeometryPolygon);
                        pShpToFc.ConvertFeatureClass(pFCName, null, null, pOutputFC, def, sourceFields, "", 1000, 0);
                    }
                    else if (shapefiletype == ShapefileType.Polyline)
                    {
                        IGeometryDef def = Create_IGeometryDef(spREF, esriGeometryType.esriGeometryPolyline);
                        pShpToFc.ConvertFeatureClass(pFCName, null, null, pOutputFC, def, sourceFields, "", 1000, 0);
                    }
                    else 
                        pShpToFc.ConvertFeatureClass(pFCName, null, null, pOutputFC, null, sourceFields, "", 1000, 0);
                }

                return true;
            }

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X