• PIE-SDK For C++矢量数据的创建


    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数据操作/01.矢量数据的创建

    视频路径

    百度云盘地址下/PIE视频教程/04数据操作/01.矢量数据的创建.avi

    示例代码

    /** 创建矢量数据

    * @brief

    * @param[in] bool checked 是否选中

    * @return

    */

    void PIEMainWindow::On_ActionCreateShpFile_Triggered(bool checked)

    {

        QString saveFilePath = QFileDialog::getSaveFileName(this, "选择存储路径", "../", "ShapeFile (*.shp)");

        if (saveFilePath.isEmpty())

        {

            return;

        }

        //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(saveFilePath, fields,SysGeometry::GeometryType::GeometryPoint, spPtr, "Shape");

        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);

        if (layer!=nullptr)

        {

            m_pCurrentControl->GetMap()->AddLayer(layer);

            m_pCurrentControl->GetActiveView()->Refresh();

        }

    }

    2.5示例截图

       生成的shape文件,格式如下:

  • 相关阅读:
    网络游戏
    嘎嘎
    Failed to install *.apk on device 'emulator-5554': timeout
    安卓开发真机遇到Failed to install Spaceassault.apk on device 'HT1CKV205198': timeout 测试机没有问题
    java匿名内部类
    TextView tv01=(TextView)this.findViewById(R.id.TextView01); tv01.setText("设置文字背景色");
    android 项目中出现红色感叹号的解决方法
    使用block来解决实现switch解决字符串
    oc中的block
    不可变数组或者可变数组进行排序
  • 原文地址:https://www.cnblogs.com/PIESat/p/12371229.html
Copyright © 2020-2023  润新知