1.功能简介
GIS将地理空间数据表示为矢量数据和栅格数据。矢量数据模型使用点、线和多边形来表示具有清晰空间位置和边界的空间要素,如控制点、河流和宗地等,每个要素被赋予一个ID,以便与其属性相关联。栅格数据模型使用一个格网和格网元胞(像元)代表空间要素,元胞值表示该元胞位置的空间要素属性。栅格数据模型适用于表示连续的要素,如海拔和降水量。
[矢量数据模型] [栅格数据模型]
PIE支持多种矢量数据的创建,下面对矢量数据格式的内存矢量数据创建功能进行介绍。
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 |
CreateFeatureDataset(…) |
创建要素数据集 |
SysCarto::LayerFactory |
CreateDefaultFeatureLayer(…) |
创建矢量图层 |
SysGeometry::SpatialReferenceFactory |
CreateSpatialReference(int Code) |
创建空间参考 |
SysDataSource::Field |
Name,AliasName,DefaultValue |
字段属性 |
SysDataSource::Fields |
AddField(IField ptrField) |
添加字段 |
SysDataSource::Feature |
SetValue(int nIndex, object field) |
设置字段值 |
SysDataSource::FeatureDataset |
AddFeature(IFeature ptrFeature) |
添加要素 |
2.4 示例代码
项目路径 |
百度云盘地址下/PIE示例程序/04数据操作/02.内存矢量数据的创建 |
视频路径 |
百度云盘地址下/PIE PIE视频教程/04数据操作/02.内存矢量数据的创建.avi |
示例代码 |
|
/** 创建内存矢量 * @brief * @param[in] bool checked 是否选中 * @return */ void PIEMainWindow::On_ActionCreateMEMShp_Triggered(bool checked) { //1 建立字段 SysDataSource::FieldsPtr fields = new SysDataSource::Fields(); SysDataSource::FieldPtr name_Field = new SysDataSource::Field("name", SysDataSource::FieldType::OFTString, 20, 4); name_Field->SetAliasName("名称"); //2 建立空间参考 SysGeometry::SpatialReferencePtr spPtr = SysGeometry::SpatialReferenceFactory::CreateSpatialReference(4326); //3 创建矢量数据集 SysDataSource::FeatureDatasetPtr featureDataSetPtr = SysDataSource::DatasetFactory::Instance()->CreateFeatureDataset(nullptr, fields, SysGeometry::GeometryType::GeometryPoint, spPtr, "MEM"); if (featureDataSetPtr == nullptr) return;
//4 写入要素 SysDataSource::FeaturePtr newFeaturePtrA = featureDataSetPtr->CreateNewFeature(); SysGeometry::PointPtr point = new SysGeometry::Point(); point->SetX(116.4); point->SetY(39.9); newFeaturePtrA->SetGeometry(point); newFeaturePtrA->SetValue(0, "北京市"); featureDataSetPtr->AddFeature(newFeaturePtrA);
SysDataSource::FeaturePtr newFeaturePtrB = featureDataSetPtr->CreateNewFeature(); SysGeometry::PointPtr pointB = new SysGeometry::Point(); pointB->SetX(121.48); pointB->SetY(31.22); newFeaturePtrB->SetGeometry(pointB); newFeaturePtrB->SetValue(0, "上海市"); featureDataSetPtr->AddFeature(newFeaturePtrB); //5 保存要素 featureDataSetPtr->Save(); featureDataSetPtr->CreateSpatialIndex(); //6 创建图层 SysCarto::LayerPtr layer = SysCarto::LayerFactory::Instance()->CreateDefaultFeatureLayer(featureDataSetPtr); layer->SetName("内存图层"); if (layer != nullptr) { m_pCurrentControl->GetMap()->AddLayer(layer); m_pCurrentControl->GetActiveView()->Refresh(); } } |