• 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数据操作/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();

        }

    }

    2.5 示例截图

  • 相关阅读:
    App集成支付宝
    关于Objective-c和Java下DES加密保持一致的方式
    Android开发规范
    android 屏幕适配问题
    Android AES加密算法及其实现
    linux文件系统调用(1)---mount
    Java(Android)解析KML文件
    【Akka】在并发程序中使用Future
    函数指针问题,求解答
    android旋转动画的两种实现方式
  • 原文地址:https://www.cnblogs.com/PIESat/p/12371978.html
Copyright © 2020-2023  润新知