IGeoDBDataTransfer - копировать класс в набор

0 голосов
спросил 16 Янв, 13 от aleksey.shulga (1,160 баллов) в категории Программные продукты Esri
    Всем привет!
По теме копирования данных из одной БГД в другую нашёл в хелпе хорошую статью "Copying and pasting geodatabase datasets". Реализовал копирование, результат такой:
1) копирование набора целиком - ок
2) копирование класса из корня - ок
3) копирование класса из набора - проблема: во второй БГД класс оказывается в корне. В связи с этим вопросы:
Как заставить Trasfer копировать класс в соответствующий набор, который УЖЕ имеется в базе-приемнике? А если его нет - создать.

Вот чего имею сейчас:

            // Get the first GDB.
            IGPValue parameterValue = m_GPUtilities.UnpackGPValue(paramvalues.get_Element(_InWorkspaceID));
            IDataset workspace_par = m_GPUtilities.OpenDataset(parameterValue);

            // Get the second GDB.
            parameterValue = m_GPUtilities.UnpackGPValue(paramvalues.get_Element(_InChildID));
            IDataset workspace_ch = m_GPUtilities.OpenDataset(parameterValue);

            // for transfer classes
            IWorkspaceName sourceWorkspaceName = (IWorkspaceName)workspace_par.FullName;
            IWorkspaceName targetWorkspaceName = (IWorkspaceName)workspace_ch.FullName;
            IName targetName = (IName)targetWorkspaceName;
            // Create an enumerator for source datasets.
            IEnumName sourceEnumName = new NamesEnumeratorClass();
            IEnumNameEdit sourceEnumNameEdit = (IEnumNameEdit)sourceEnumName;

            // New feature class or table
            parameterValue = m_GPUtilities.UnpackGPValue(paramvalues.get_Element(_InFeaturesID));
            IGPMultiValue multiValue = parameterValue as IGPMultiValue;

            for (int i = 0; i < multiValue.Count; i++)
            {
               IFeatureClass fc; IQueryFilter qf;
               m_GPUtilities.DecodeFeatureLayer(multiValue.Value, out fc, out qf);

               IDatasetName sourceDatasetName = (IDatasetName)(fc as IDataset).FullName;
               IName sourceName = (IName)sourceDatasetName;
               // Add the name object for the source class to the enumerator.
               sourceEnumNameEdit.Add(sourceName);
            }

            // Create a GeoDBDataTransfer object and a null name mapping enumerator.
            IGeoDBDataTransfer geoDBDataTransfer = new GeoDBDataTransferClass();
            IEnumNameMapping enumNameMapping = null;

            // Use the data transfer object to create a name mapping enumerator.
            Boolean conflictsFound = geoDBDataTransfer.GenerateNameMapping(sourceEnumName, targetName, out enumNameMapping);
            enumNameMapping.Reset();

            if (conflictsFound)
            { ...
            }
            
            // Start the transfer.
            geoDBDataTransfer.Transfer(enumNameMapping, targetName);

1 Ответ

0 голосов
ответил 16 Янв, 13 от aleksey.shulga (1,160 баллов)
вроде решение нашел: если исх.класс внутри набора, ищу такой же набор во второй БГД. Если нахожу набор, то устанавливаю его в targetName:

            for (int i = 0; i < multiValue.Count; i++)
            {
               IFeatureClass fc; IQueryFilter qf;
               m_GPUtilities.DecodeFeatureLayer(multiValue.Value, out fc, out qf);

               if (fc.FeatureDataset != null)
               {
                    string fcDatasetName = fc.FeatureDataset.Name.Substring(fc.FeatureDataset.Name.LastIndexOf('.') + 1);
                    IEnumDataset targetDatasets = workspace_ch.Subsets;
                    if (targetDatasets != null)
                    {
                        targetDatasets.Reset();
                        IDataset dataset = null;
                        while ((dataset = targetDatasets.Next()) != null)
                        {
                            if (dataset.Name.Substring(dataset.Name.LastIndexOf('.') + 1) == fcDatasetName)
                            {
                                targetName = dataset.FullName;
                            }
                        }
                    }
               }
               ...

Правда, теперь придется классы из разных наборов обрабатывать отдельно... или не мучаться, а вызывать Transfer для каждого класса отдельно.
...