2 votos

¿Crear join entre feature class y tabla creada con InMemoryWorkspaceFactory?

Estoy intentando unir una featureclass contenida dentro de un pgdb con una tabla creada con un InMemory Workspace.

La tabla en memoria contiene los resultados que quiero utilizar para definir la simbología en la featureclass.

La creación de la tabla va bien, puedo ver los datos calculados, pero la IRelationshipClass creada no devuelve ningún registro. He intentado utilizar múltiples campos para unir los datos sin éxito. También he añadido la tabla creada a ArcMap para crear la unión directamente en ArcMap, sin éxito. Pasa todas las validaciones, pero no devuelve ningún registro.

Intenté unir mi tabla inmemory con un shapefile featureclass en su lugar y funcionó.

He aquí un ejemplo de código

            // Create an in-memory workspace factory.
            IWorkspaceFactoryPtr ipWorkspaceFactory(CLSID_InMemoryWorkspaceFactory);

            // Create a new in-memory workspace. This returns a name object.
            IWorkspaceNamePtr ipWorkspaceName;
            ipWorkspaceFactory->Create(NULL, L"ValeursCalculees", NULL, 0, &ipWorkspaceName);

            INamePtr ipName(ipWorkspaceName);

            // Open the workspace through the name object.
            IUnknownPtr ipWorkspaceUnk;
            ipName->Open(&ipWorkspaceUnk);
            IWorkspacePtr ipWorkspace(ipWorkspaceUnk);

            IFeatureWorkspacePtr ipMemoryFeatureWorkspace(ipWorkspace);

            IDatasetPtr ipFeatureClassDataset(ipFeatureClass);
            CComBSTR strNomFC;
            ipFeatureClassDataset->get_Name(&strNomFC);

            IFieldsEditPtr ipFieldsEdit(CLSID_Fields);

                      ... Field creation code ...

            ITablePtr ipTable;
            ipMemoryFeatureWorkspace->CreateTable("InMemoryTable", ipFieldsEdit, NULL, NULL, NULL, &ipTable);

                     ... Table Filling code ...

            //IRelQueryTable
            IFeatureWorkspacePtr ipFeatureWorkspace(CTools::GetWorkspaceFromFeatureClass(ipFeatureClass));
            IObjectClassPtr ipObjectClass(ipTable);

            IMemoryRelationshipClassFactoryPtr ipMemoryRelationshipClassFactory(CLSID_MemoryRelationshipClassFactory);
            IRelationshipClassPtr ipRelClass;
            HRESULT hr = ipMemoryRelationshipClassFactory->Open(L"Join", ipFeatureClass, L"Numero_AD", ipObjectClass, L"NumeroAD", L"forward", L"backward", esriRelCardinalityOneToMany, &ipRelClass);

            IDisplayRelationshipClassPtr ipDisplayRelationshipClass(ipFeatureLayer);
            ipDisplayRelationshipClass->DisplayRelationshipClass(ipRelClass, esriLeftOuterJoin);

            //Add the table to ArcMap
            IStandaloneTableCollectionPtr ipStandaloneTableCollection(CTools::GetMap(ipMxDocument));
            IStandaloneTablePtr ipStandaloneTable(CLSID_StandaloneTable);
            ipStandaloneTable->putref_Table(ipTable);
            hr = ipStandaloneTableCollection->AddStandaloneTable(ipStandaloneTable);
            ipMxDocument->UpdateContents();

¿Estoy intentando hacer algo imposible?

2voto

Simon Puntos 11

Sí ES POSIBLE.

Yo trabajo con Java, pero tenía el mismo problema.

Solución: añadir UID a una tabla :

" UID uid1 = nuevo UID(); uid1.setValue("esriGeoDatabase.Object"); tbl = featureWorkspace.createTable("miTabla", campos, uid1, null, null);"

1voto

Goldorak84 Puntos 893

Después de experimentar, no, no es posible crear un join válido entre una feature class y una tabla creada con un InMemoryWorkspaceFactory. La unión se crea pero no devuelve ningún registro. Parece ser una limitación en la interacción entre InMemoryWorkspace y Geodatabase workspace.

He encontrado una solución sustituyendo el InMemoryWorkspaceFactory por un ArchivoGDBScratchWorkspaceFactory . Es un espacio de trabajo temporal de FileGDB almacenado en la carpeta temporal del usuario.

El código es el siguiente

// Create a scratch (temporary) workspace factory.
IScratchWorkspaceFactory2Ptr ipWorkspaceFactory(CLSID_FileGDBScratchWorkspaceFactory);

// Create a new scratch (temporary) workspace. This returns a name object.
IWorkspaceNamePtr ipWorkspaceName;
IWorkspacePtr ipWorkspace;
ipWorkspaceFactory->CreateNewScratchWorkspace(&ipWorkspace);

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