PIE-SDK For C++打开矢量数据
1、功能简介
GIS将地理空间数据表示为矢量数据和栅格数据。矢量数据模型使用点、线和多边形来表示具有清晰空间位置和边界的空间要素,如控制点、河流和宗地等,每个要素被赋予一个ID,以便与其属性相关联。栅格数据模型使用一个格网和格网元胞(像元)代表空间要素,元胞值表示该元胞位置的空间要素属性。栅格数据模型适用于表示连续的要素,如海拔和降水量。
[矢量数据模型]
[栅格数据模型]
PIE支持多种矢量数据的打开,下面我们就介绍如何在PIE中打开Shape类型的矢量数据。
2、功能实现说明
2.1 Shape数据介绍
Shapefile是由ESRI开发后被广泛应用的数据格式,它采用文件的方式分开存储数据的控件信息和属性信息,但其不能存储拓扑关系,具有简单、快速显示的优点。一个Shape数据的文件结构如下所示:
[Shape数据文件结构]
编号 |
后缀 |
文件说明 |
1 |
.shp |
基本文件,存储地理要素的几何图形信息; |
2 |
.dbf |
基本文件,存储地理要素的属性信息; |
3 |
.shx |
基本文件,存储图形要素与属性信息的索引; |
4 |
.prj |
可选文件,存储数据的空间参考信息; |
5 |
.sbn/.sbx |
可选文件,存储数据的空间索引信息(ESRI创建的空间索引); |
6 |
.qix |
可选文件,存储数据的空间索引信息(PIE创建的空间索引); |
[Shape数据文件结构说明]
2.2 实现思路及原理说明
第一步 |
根据文件路径打开矢量数据集; |
第二步 |
通过矢量数据集创建矢量图层; |
2.3 核心接口与方法
接口/类 |
方法 |
说明 |
SysDataSource::DatasetFactory |
OpenFeatureDataset |
打开矢量数据集 |
SysCarto::LayerFactory |
CreateDefaultFeatureLayer |
创建矢量图层 |
2.4 示例代码
项目路径 |
百度云盘地址下/PIE示例程序/03.数据加载/01.打开矢量数据 |
数据路径 |
百度云盘地址下/PIE示例数据/矢量数据/Shape/省级行政区.shp |
视频路径 |
百度云盘地址下/PIE视频教程/03.数据加载/01.打开矢量数据.avi |
示例代码 |
|
方法(一) // 获得要打开Shape数据的路径 QString filter = "Shapefiles (*.shp)"; QStringList lstFile = QFileDialog::getOpenFileNames(nullptr, "添加矢量数据", "", filter); if (lstFile.count() < 1) return; //支持批量添加 //直接创建layer进行添加 QList<SysCarto::LayerPtr> lstLayers = SysCarto::LayerFactory::CreateDefaultLayers(lstFile); m_ptrHookHelper->GetFocusMap()->AddLayers(lstLayers); m_ptrHookHelper->GetActiveView()->Refresh(); 方法(二) //通过Featuredataset进行layer创建 QString filter = "Shapefiles (*.shp)"; QStringList lstFile = QFileDialog::getOpenFileNames(nullptr, "添加矢量数据", "", filter); if (lstFile.count() < 1) return; for each (QString _file in lstFile) { SysDataSource::FeatureDatasetPtr featureDatasetPtr = SysDataSource::DatasetFactory::Instance()->OpenFeatureDataset(_file); if (featureDatasetPtr!=nullptr) { SysCarto::FeatureLayerPtr featureLayerPtr = SysCarto::LayerFactory::Instance()->CreateDefaultFeatureLayer(featureDatasetPtr); if (featureLayerPtr!=nullptr) { m_ptrHookHelper->GetFocusMap()->AddLayer(featureLayerPtr); } } } m_ptrHookHelper->GetActiveView()->Refresh(); |