Puedo crear con éxito esta featureclass en la geodatabase por defecto de ArcGIS 10 y añadirla al proyecto, pero no se puede editar. He intentado añadir una característica utilizando FeatureClass.CreateFeatureBuffer()
sino que se trata del viejo críptico: {"Error HRESULT E_FAIL has been returned from a call to a COM component."}
Si intento añadir una característica con la barra de herramientas de edición en ArcMap:
No se ha podido completar la tarea de creación de características.
La featureclass SÍ tiene una referencia espacial que coincide con el marco de datos y las otras capas del proyecto.
¿Me estoy perdiendo algo? Debería ser fácil, ¿alguna idea?
private IFeatureClass MakePointFC(IFeatureLayer pLineLayer)
{
try
{
IGxCatalogDefaultDatabase Defaultgdb = ArcMap.Application as IGxCatalogDefaultDatabase;
Type factoryType = Type.GetTypeFromProgID("esriDataSourcesGDB.FileGDBWorkspaceFactory");
IWorkspaceFactory workspaceFactory = (IWorkspaceFactory)Activator.CreateInstance(factoryType);
IWorkspace pWorkspace = workspaceFactory.OpenFromFile(Defaultgdb.DefaultDatabaseName.PathName, 0);
IFeatureWorkspace workspace = pWorkspace as IFeatureWorkspace;
UID CLSID = new UID();
CLSID.Value = "esriGeoDatabase.Object";
IFields pFields = new FieldsClass();
IFieldsEdit pFieldsEdit = pFields as IFieldsEdit;
pFieldsEdit.FieldCount_2 = 2;
IGeoDataset geoDataset = pLineLayer as IGeoDataset;
IGeometryDef pGeomDef = new GeometryDef();
IGeometryDefEdit pGeomDefEdit = pGeomDef as IGeometryDefEdit;
pGeomDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPoint;
pGeomDefEdit.SpatialReference_2 = geoDataset.SpatialReference;
IField pField;
IFieldEdit pFieldEdit;
//pField = new FieldClass();
//pFieldEdit = pField as IFieldEdit;
//pFieldEdit.AliasName_2 = "ObjectID";
//pFieldEdit.Name_2 = "ObjectID";
//pFieldEdit.Type_2 = esriFieldType.esriFieldTypeOID;
//pFieldsEdit.set_Field(0, pFieldEdit);
pField = new FieldClass();
pFieldEdit = pField as IFieldEdit;
pFieldEdit.AliasName_2 = "SHAPE";
pFieldEdit.Name_2 = "SHAPE";
pFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;
pFieldEdit.GeometryDef_2 = pGeomDef;
pFieldsEdit.set_Field(0, pFieldEdit);
pField = new FieldClass();
pFieldEdit = pField as IFieldEdit;
pFieldEdit.AliasName_2 = "Distance";
pFieldEdit.Name_2 = "Distance";
pFieldEdit.Type_2 = esriFieldType.esriFieldTypeDouble ;
pFieldsEdit.set_Field(1, pFieldEdit);
string strFCName = System.IO.Path.GetFileNameWithoutExtension(System.IO.Path.GetRandomFileName());
IFeatureClass pFeatureClass = workspace.CreateFeatureClass(strFCName, pFieldsEdit, CLSID, null, esriFeatureType.esriFTSimple, "SHAPE", "");
return pFeatureClass;
}
catch (Exception ex)
{
return null;
}
}
0 votos
Por cierto, si exporto la featureclass a una nueva featureclass, puedo editarla sin problemas.
1 votos
¿Intentaste hacer un casting
IGxCatalogDefaultDatabase.DefaultDatabaseName
aIName
y llamando aIName.Open
para abrir el espacio de trabajo en lugar de utilizar la fábrica?0 votos
Además, ¿probó con un nombre amigable en lugar del devuelto por
GetRandomFileName
? ¿Por qué se comenta el código del campo OID? Prefiero utilizar IFieldsEdit.AddField en lugar de setfield.0 votos
Gracias Kirk, el problema estaba en el valor del UID. Parece que debería ser "esriGeodatabase.Feature", no "esriGeoDatabase.Object". Tu sugerencia de usar IName me dirigió a un post de un autor conocido en el antiguo foro de ESRI ( forums.esri.com/Thread.asp?c=93&f=1170&t=217820 ) sobre la creación de un InMemoryWorspace (que también funcionará para mis propósitos). Te daré crédito si quieres publicar la respuesta. Además, estaba usando un nombre de archivo aleatorio para evitar errores de sobrescritura en la geodatabase, lo que parece funcionar bien y el campo OID se genereará automáticamente.
2 votos
Eric: si Kirk no añade nada más, no dudes en responder a tu propia pregunta y seleccionarla como la respuesta más correcta. En este sitio se trata de buenas respuestas, no importa de dónde vengan ;-) Está bien elaborar la idea clave de otra persona.