Добавить Автора
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++
Детали модуля лицензии компонента следующие:
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
-
Создайте MFC на основе диалога , выберите тип приложения и нажмите «Готово».
После выполнения двух вышеуказанных шагов простейшая прикладная программа 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.
-
Настройте _UGUNICODE на C/C++ " элемент определения препроцессора
-
Настройте WChar_t как встроенный тип в элементе языка C/C++.
-
Добавьте /bigobj в элемент командной строки C/C++.
-
-
Настройка среды компоновщика
-
Добавьте каталог iObjects C++\lib\lib_x64 в элемент Linker >Additional Library Directorys.
-
Добавьте следующие файлы библиотеки в элемент «Дополнительные зависимости» компоновщика.
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
-
Здесь для
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
компонентов Демонстрация выглядит следующим образом:
Если вы внимательно прочитали описанный выше процесс и логику реализации, вы все еще чувствуете, что у вас нет возможности начать. Не беспокойтесь и не беспокойтесь. Образец проекта MFC "Управление рабочей областью, источником данных и набором данных на основе компонентов iObjects C++ 11i", разработки среда согласно этому блогу.