Рабочая область SuperMap iObjects C++, источник данных, управление наборами данных

Добавить Автора

1. История

  SuperMap iObjects C++Это базовое ядро ​​программного обеспечения серии SuperMap GIS, которое разработано с использованием стандартного C++ и интегрирует высокопроизводительную кросс-платформенную технологию SuperMap. Предоставьте пользователям базовые функции ГИС в виде C++ API.

  Хотя компонент iObjects C++ обладает высокой производительностью, пример разработки DEMO, представленный в компоненте iObjects C++, меньше, чем у компонента iObjects .NET/Java.Разработка компонентов iObjects C++ для заказчиков затруднена, поэтому данное руководство и соответствующий образец DEMO предоставляются для справки.

  Это руководство основано на SuperMap iObjects C++компонентах 11i для реализации функций управления рабочим пространством, источником данных и набором данных, включая: новое рабочее пространство, открытие, сохранение, сохранение, закрытие; новый источник данных, открытие, сохранение, закрытие; точка, линия, поверхность, трехмерная точка. , 3D-линия, 3D-поверхность, CAD, модель, растр, изображение, таблица атрибутов и другие наборы данных могут быть созданы и закрыты.

  Эти функции являются частью модуля iObjects C++Core Components, поэтому для надлежащего использования требуется только лицензия Core Components. iObjects C++Детали модуля лицензии компонента следующие:
Сравнительная таблица модулей лицензий iObjects C++.png

2. Настройка среды разработки

2.1 Зависимости среды разработки

Программные продукты Версия ссылка для скачивания Примечание
SuperMap iObjects C++ 11и Адрес загрузки SuperMap iObjects C++ 11i Рекомендуется использовать компоненты SuperMap iObjects C++ версии 11i.
Визуальная студия 2022 Адрес загрузки Visual Studio 2022 Community Edition При установке Visual Studio 2022 вам необходимо следовать библиотеке C++

2.2. Сборка проекта MFC

  • Создание приложений MFC из Visual Studio 2022 Community Edition Visual Studio 2022 Новое приложение MFC.png

  • Создайте MFC на основе диалога , выберите тип приложения и нажмите «Готово». Создание диалогового приложения MFC.png

  После выполнения двух вышеуказанных шагов простейшая прикладная программа MFC успешно создана.Далее необходимо дополнительно настроить зависимости среды разработки компонента от созданной прикладной программы MFC .SuperMap iObjects C++ 11i

2.3 Настройка зависимостей среды разработки компонентов iObjects C++ 11i

  • Настроить среду C/C++

    • Добавьте каталог iObjects C++\include и каталог iObjects C++\include\private в элемент C/C++ Additional Include Directorys.Настроить дополнительный каталог включения MFC.png

    • Настройте _UGUNICODE на C/C++ " элемент определения препроцессораНастроить определение препроцессора MFC.png

    • Настройте WChar_t как встроенный тип в элементе языка C/C++.Рассматривайте WChar_t как встроенный type.png

    • Добавьте /bigobj в элемент командной строки C/C++.Настройка командной строки MFC.png

  • Настройка среды компоновщика

    • Добавьте каталог iObjects C++\lib\lib_x64 в элемент Linker >Additional Library Directorys.Настроить каталог дополнительной библиотеки MFC.png

    • Добавьте следующие файлы библиотеки в элемент «Дополнительные зависимости» компоновщика.

      SuAllocation.lib
      SuAnalyst3D.lib
      SuAnimation.lib
      SuBase.lib
      SuBase3D.lib
      SuBGDataCompiler.lib
      SuBPlusTree.lib
      SuCacheBuilder.lib
      SuCacheBuilder3D.lib
      SuCacheFile.lib
      SuChartBase.lib
      SuChartToolkit.lib
      SuCompactFile.lib
      SuCVToolkit.lib
      SuDataCheck.lib
      SuDataExchange.lib
      SuDB2CI.lib
      SuDCPackager.lib
      SuDCToolkits.lib
      SuDrawing.lib
      SuDrawing3D.lib
      SuDrawingLayout.lib
      SuElement.lib
      SuEngine.lib
      SuEngineBaiduMaps.lib
      SuEngineBingMaps.lib
      SuEngineDB2.lib
      SuEngineES.lib
      SuEngineExtendFile.lib
      SuEngineGanos.lib
      SuEngineGaoDeMaps.lib
      SuEngineGBase.lib
      SuEngineGoogleMaps.lib
      SuEngineImagePlugin.lib
      SuEngineMapWorldMaps.lib
      SuEngineMySQL.lib
      SuEngineODBC.lib
      SuEngineOGC.lib
      SuEngineOGDC.lib
      SuEngineOpenStreetMaps.lib
      SuEngineOracle.lib
      SuEnginePG.lib
      SuEnginePGis.lib
      SuEngineRest.lib
      SuEngineSCV.lib
      SuEngineSMCloud.lib
      SuEngineSpatialite.lib
      SuEngineSQLPLUS.lib
      SuEngineSsp.lib
      SuEngineUDB.lib
      SuEngineXYZTile.lib
      SuFileParser.lib
      SuFileParser3DModel.lib
      SuFileParser3ds.lib
      SuFileParserAcad.lib
      SuFileParserBitMap.lib
      SuFileParserCSV.lib
      SuFileParserDEM.lib
      SuFileParserE00.lib
      SuFileParserENC.lib
      SuFileParserFME.lib
      SuFileParserGDAL.lib
      SuFileParserKML.lib
      SuFileParserLidar.lib
      SuFileParserMAPGIS.lib
      SuFileParserMitab.lib
      SuFileParserNetCDF.lib
      SuFileParserOGR.lib
      SuFileParserPointCloud.lib
      SuFileParserRAW.lib
      SuFileParserS3MB.lib
      SuFileParserSCV.lib
      SuFileParserSGM.lib
      SuFileParserTEMS.lib
      SuFMELicense.lib
      SuGeneralization.lib
      SuGeoCode.lib
      SuGeometricNetwork.lib
      SuGeometry.lib
      SuGeometry3D.lib
      SuGeometryCAD.lib
      SuGeometryConverter.lib
      SuGeometryLayout.lib
      SuGeometryPlot.lib
      SuGeoOperation.lib
      SuGeoOperation3D.lib
      SuGraphics.lib
      SuGraphics3D.lib
      SuGraphics3DGameEngine.lib
      SuGraphics3DOGRE.lib
      SuGraphicsPDF.lib
      SuGraphicsPS.lib
      SuGraphicsW.lib
      SuGridAnalyst.lib
      SuGridAnalystOpenCL.lib
      SuGridModeling.lib
      SuLayer3DDataset.lib
      SuLayer3DDatasetModel.lib
      SuLayer3DFile.lib
      SuLayer3DMap.lib
      SuLayer3DTree.lib
      SuLayoutEditor.lib
      SuLinearReference.lib
      SuLogistics.lib
      SuMap.lib
      SuMapEditor.lib
      SuMapMatching.lib
      SuMapServiceStub.lib
      SuMGAnimationExp.lib
      SuMGAuxiliaryPlotting.lib
      SuMGCommon.lib
      SuMGMapData.lib
      SuMGMovingTarget.lib
      SuMGObjects.lib
      SuMGSituation.lib
      SuMGSituationMonitor.lib
      SuMGSituationSimulation.lib
      SuMongoCI.lib
      SuMosaic.lib
      SuMosaicOpenCV.lib
      SuMySQLCI.lib
      SuNetToolkit.lib
      SuNetworkBuilder.lib
      SuNetworkEnvironment.lib
      SuNTopoDataCompiler.lib
      SuNTopoIndexTree.lib
      SuODBCCI.lib
      SuOGCParser.lib
      SuOGDC.lib
      SuOracleCI.lib
      SuOverlay.lib
      SuParticleSystem.lib
      SuPathAnalyst.lib
      SuPathAnalystCH.lib
      SuPathNavi.lib
      SuPluginCommon.lib
      SuPluginGECache.lib
      SuPluginGlobalCache.lib
      SuPluginGridCache.lib
      SuPluginMapCache.lib
      SuPluginMapCache50.lib
      SuPluginWebCache.lib
      SuPostgreSQLCI.lib
      SuProjection.lib
      SuProjectionProj.lib
      SuProjectionWKT.lib
      SuProximity.lib
      SuPublicTransport.lib
      SuRasterData.lib
      SuRectify.lib
      SuRender.lib
      SuRepresentation.lib
      SuRStarTree.lib
      SuScene.lib
      SuSceneEditor.lib
      SuSpatialIndex.lib
      SuSpatialQuery.lib
      SuSQLiteCI.lib
      SuStream.lib
      SuSymbol.lib
      SuSymbolAlgo1.lib
      SuSymbolAlgo2.lib
      SuSymbolAlgo3.lib
      SuSymbolAlgo4.lib
      SuSymbolAlgo5.lib
      SuSymbolAlgo6.lib
      SuSymbolAlgo7.lib
      SuSymbolExchange.lib
      SuSymbolMarker3D.lib
      SuTheme3DBase.lib
      SuTileStorage.lib
      SuToolkit.lib
      SuToolkit3D.lib
      SuToolkitPointCloud.lib
      SuToolkitVDB.lib
      SuTopoBase.lib
      SuTopoBuilder.lib
      SuVRDevices.lib
      SuWorkspace.lib
      SuWrapc.lib
      SuAlgorithm.lib
      SuAlgorithm3D.lib
      

Настройка дополнительных зависимостей MFC.png

  Здесь для SuperMap iObjects C++удобства все зависимости прямо добавлены в зависимости приложения MFC . Если вы чувствуете SuperMap iObjects C++, что зависимостей слишком много , вы можете добавить некоторые зависимости .

3. Реализация функции

  Далее идет основной интерфейс вызова функции и логика реализации управления рабочим пространством, источником данных и набором данных.Для конкретной реализации кода см. непосредственно следующий код реализации.

3.1. Откройте рабочее пространство

  Операция открытия рабочей области в основном состоит из двух шагов: 1. Создание информации о подключении к рабочей области (путь к рабочей области, версия, тип и имя) 2. Открытие указанной рабочей области в соответствии с созданной информацией о подключении к рабочей области. Подробное кодирование может относиться к следующей реализации:

// 构建工作空间连接信息
UGWorkspaceConnection workspaceConnection = UGWorkspaceConnection();
workspaceConnection.m_strServer = workspaceFilePath;
workspaceConnection.m_nVersion = UG_WORKSPACE_VERSION_20120328;
workspaceConnection.m_nWorkspaceType = GetWorkspaceType(workspaceFileExt);
workspaceConnection.m_bFailIfExists = false;
workspaceConnection.m_strWorkspaceName = workspaceFileName;

// 打开工作空间
m_workspace = new UGWorkspace();
if (m_workspace->Open(workspaceConnection))
{
    
    
    m_workspace->SetName(workspaceConnection.m_strWorkspaceName);
    m_workspace->SetCaption(workspaceConnection.m_strWorkspaceName);
}

3.2 Сохранить рабочее пространство как другое

  Операционный процесс сохранения рабочей области такой же, как и при открытии рабочей области.Для подробного кодирования см. следующую реализацию:

// 构建工作空间连接信息
UGWorkspaceConnection workspaceConnection = UGWorkspaceConnection();
workspaceConnection.m_strServer = workspaceFilePath;
workspaceConnection.m_nVersion = UG_WORKSPACE_VERSION_20120328;
workspaceConnection.m_nWorkspaceType = GetWorkspaceType(workspaceFileExt);
workspaceConnection.m_bFailIfExists = false;
workspaceConnection.m_strWorkspaceName = workspaceFileName;

m_workspace->SetName(workspaceConnection.m_strWorkspaceName);
m_workspace->SetCaption(workspaceConnection.m_strWorkspaceName);

// 另存工作空间
if (m_workspace->SaveAs(workspaceConnection)) {
    
    }

3.3 Создайте новый источник данных файлового типа

  Чтобы создать новый файловый источник данных, необходимо указать путь к файлу, псевдоним файла и тип источника данных, среди которых UGEngineType::Spatialite соответствует файловому источнику данных UDBX , а UGEngineType::UDB соответствует источник данных типа файла UDB.Рекомендуется установить соответствующий тип источника данных в соответствии с фактическими потребностями.

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

// 构建数据源信息
UGDataSource* datasource = UGDataSourceManager::CreateDataSource(UGEngineType::Spatialite);
UGDsConnection& dsConn = datasource->GetConnectionInfo();
dsConn.m_strServer = filePath;
dsConn.m_strAlias = fileTitle;
dsConn.m_nType = UGEngineType::Spatialite;

// 新建数据源
if (!datasource->Create())
{
    
    
  datasource->Close();
  delete datasource;
}
else
{
    
    
  // 数据源新建成功,添加到当前工作空间中
  if (!m_workspace->m_DataSources.Insert(dsConn.m_strAlias, datasource) || !m_workspace->Save()) {
    
    }
}

3.4. Открыть файловый источник данных

  Операционный процесс открытия источника данных файлового типа аналогичен процессу создания нового источника данных файлового типа Подробное кодирование см. в следующей реализации:

// 构建数据源信息
UGDataSource* datasource = UGDataSourceManager::CreateDataSource(UGEngineType::Spatialite);
UGDsConnection& dsConn = datasource->GetConnectionInfo();
dsConn.m_strServer = filePath;
dsConn.m_strAlias = fileTitle;
dsConn.m_nType = UGEngineType::Spatialite;

// 打开数据源
if (!datasource->Open())
{
    
    
  datasource->Close();
  delete datasource;
}
else
{
    
    
  // 数据源打开成功,添加到当前工作空间中
  if (!m_workspace->m_DataSources.Insert(dsConn.m_strAlias, datasource) || !m_workspace->Save()) {
    
    }
}

3.5 Создайте новый набор векторных данных

  Процесс создания нового набора векторных данных такой же, отличается только тип набора данных, поэтому следующие интерфейсы просто инкапсулированы для повторного использования и создания различных типов наборов векторных данных, включая: 2D-точечный ( UGC::UGDataset:: Point ) , 2D-линия ( UGC::UGDataset::Line ), 2D-область ( UGC::UGDataset::Region ), 3D-точка ( UGC::UGDataset::PointZ ), 3D-линия ( UGC::UGDataset::LineZ ), 3D поверхность ( UGC::UGDataset::RegionZ ), модель ( UGC::UGDataset::Model ), САПР ( UGC::UGDataset::CAD ), таблица атрибутов ( UGC::UGDataset::Tabular ) и т. д.

/// <summary>
/// 创建矢量数据集
/// </summary>
/// <param name="workspace">工作空间</param>
/// <param name="datasetType">数据集类型</param>
/// <param name="datasetName">数据集名称</param>
/// <returns>是否创建成功</returns>
UGbool CWDDManagerDlg::CreateDefaultDatasetVector(UGWorkspace* workspace, UGDataset::DatasetType datasetType, std::string datasetName)
{
    
    
  UGbool isCreated = FALSE;
  int datasourcesCount = workspace->m_DataSources.GetCount();
  if (datasourcesCount > 0)
  {
    
    
    UGString datasourceAlias;
    UGDataSource* datasource;
    if (workspace->m_DataSources.GetAt(0, datasourceAlias, datasource) && datasource != nullptr)
    {
    
    
      // 获取可用的数据集名称
      UGString strName;
      strName = GetAvailableDatasetName(datasource, strName.FromStd(datasetName));

      // 构建矢量数据集信息
      UGDatasetVectorInfo datasetVectorInfo;
      datasetVectorInfo.m_strName = strName;
      datasetVectorInfo.m_strTableName = strName;
      datasetVectorInfo.m_nCodecType = UGDataCodec::CodecType::envNONE;
      datasetVectorInfo.m_nSmIDType = UGDataset::SmIDType::INT64;
      datasetVectorInfo.m_nType = datasetType;

      // 根据矢量数据集信息新建矢量数据集
      UGDatasetVectorPtr datasetVector = datasource->CreateDatasetVector(datasetVectorInfo);
      if (datasetVector == nullptr)
      {
    
    
        return isCreated;
      }
      else
      {
    
    
        isCreated = TRUE;
      }
    }
  }
  return isCreated;
}

3.6 Создайте новый набор растровых данных

  Создание нового набора растровых данных аналогично созданию нового набора векторных данных.Следующие интерфейсы могут быть инкапсулированы для создания простых одноканальных наборов растровых ( UGC::UGDataset::Grid ) и изображений ( UGC::UGDataset::Image ) данных.

/// <summary>
/// 创建栅格数据集
/// </summary>
/// <param name="workspace">工作空间</param>
/// <param name="datasetType">数据集类型</param>
/// <param name="datasetName">数据集名称</param>
/// <returns>是否创建成功</returns>
UGbool CWDDManagerDlg::CreateDefaultDatasetRaster(UGWorkspace* workspace, UGDataset::DatasetType datasetType, std::string datasetName)
{
    
    
  UGbool isCreated = FALSE;
  int datasourcesCount = workspace->m_DataSources.GetCount();
  if (datasourcesCount > 0)
  {
    
    
    UGString datasourceAlias;
    UGDataSource* datasource;
    if (workspace->m_DataSources.GetAt(0, datasourceAlias, datasource) && datasource != nullptr)
    {
    
    
      // 获取可用的数据集名称
      UGString strName;
      strName = GetAvailableDatasetName(datasource, strName.FromStd(datasetName));

      // 构建栅格数据集信息
      UGDatasetRasterInfo datasetRasterInfo;
      datasetRasterInfo.m_strName = strName;
      datasetRasterInfo.m_strTableName = strName;
      datasetRasterInfo.m_rc2Bounds = UGRect2D(-200.0, -200.0, 200.0, 200.0);
      datasetRasterInfo.m_eBlockSize = UGDatasetRasterInfo::IBSizeOption::IBS_64;
      datasetRasterInfo.m_nHeight = 800;
      datasetRasterInfo.m_nWidth = 800;
      datasetRasterInfo.m_nType = datasetType;
      datasetRasterInfo.SetPixelFormat(OGDC::PixelFormat::IPF_DOUBLE);
      datasetRasterInfo.SetNoValue(-9999.0);

      // 构建栅格波段信息
      UGBandInfo bandInfo;
      bandInfo.m_bAvail = TRUE;
      bandInfo.m_dMaxZ = 10000.0;
      bandInfo.m_dMinZ = -1000.0;
      bandInfo.m_nBandID = 1;
      bandInfo.m_nIndex = 1;
      bandInfo.m_nCodecType = UGDataCodec::CodecType::enrNONE;
      bandInfo.SetPixelFormat(OGDC::PixelFormat::IPF_DOUBLE);
      bandInfo.SetNoValue(-9999.0);
      datasetRasterInfo.Add(bandInfo);

      // 根据栅格数据集信息新建栅格数据集
      UGDatasetRasterPtr datasetRaster = datasource->CreateDatasetRaster(datasetRasterInfo);
      if (datasetRaster == nullptr)
      {
    
    
        return isCreated;
      }
      else
      {
    
    
        isCreated = TRUE;
      }
    }
  }
  return isCreated;
}

3.7 Закрытие набора данных

  При закрытии набора данных необходимо выполнить два шага: 1. Закрыть сам набор данных 2. Удалить набор данных из источника данных, где набор данных необходимо закрыть. После выполнения этих двух шагов набор данных полностью закрывается.

  Примечание. Рекомендуется вызывать интерфейс сжатия источника данных (Compact) после закрытия набора данных, иначе размер файла, занимаемый текущим источником данных на диске, не будет обновлен, а размер файла до закрытия набора данных все равно будет сохранен.

/// <summary>
/// 关闭数据集
/// </summary>
/// <param name="workspace">工作空间</param>
/// <param name="datasetType">数据集类型</param>
/// <returns>是否关闭成功</returns>
UGbool CWDDManagerDlg::CloseDataset(UGWorkspace* workspace, UGDataset::DatasetType datasetType)
{
    
    
  if (IsExistedDataset(workspace, datasetType))
  {
    
    
    UGbool isDeleted = FALSE;
    UGint datasourcesCount = workspace->m_DataSources.GetCount();
    for (size_t i = 0; i < datasourcesCount; i++)
    {
    
    
      UGString datasourceAlias;
      UGDataSource* datasource;
      if (workspace->m_DataSources.GetAt(0, datasourceAlias, datasource) && datasource != nullptr)
      {
    
    
        UGint datasetCount = datasource->GetDatasetCount();
        OgdcUnicodeStringArray datasetNames = datasource->GetDatasetNames();
        for (size_t j = 0; j < datasetNames.GetSize(); j++)
        {
    
    
          UGDatasetPtr dataset = datasource->GetDataset(datasetNames.GetAt(j));
          if (dataset->GetType() == datasetType)
          {
    
    
            // 关闭数据集
            dataset->Close();
            
            // 从数据源中删除数据集
            if (!datasource->DeleteDataset(dataset->GetName()) || !datasource->SaveInfo() || !datasource->Compact(TRUE))
            {
    
    
              return isDeleted;
            }
            else
            {
    
    
              isDeleted = TRUE;
              break;
            }
          }
        }
      }
      if (isDeleted)
      {
    
    
        break;
      }
    }
    return isDeleted;
  }
}

4. Резюме

  Благодаря вышеупомянутой логике основной функции управление рабочим пространством, источником данных и набором данных может быть очень легко реализовано на основе SuperMap iObjects C++ 11iкомпонентов Демонстрация выглядит следующим образом:
Демонстрация WDDManager demo.gif

  Если вы внимательно прочитали описанный выше процесс и логику реализации, вы все еще чувствуете, что у вас нет возможности начать. Не беспокойтесь и не беспокойтесь. Образец проекта MFC "Управление рабочей областью, источником данных и набором данных на основе компонентов iObjects C++ 11i", разработки среда согласно этому блогу.

Supongo que te gusta

Origin blog.csdn.net/supermapsupport/article/details/130505033
Recomendado
Clasificación