1  概述

地理实体抽象是指点、线、面及其组合而成的,用于描述实际地物的数据结构。

其中包含几何实体和属性数据。

GIS中进行几何操作,以各种实体类为基础进行操作。

在OGC中,地理实体可以由WKT表示。在Qgis中使用GEOS和WKT两种方式表示,并在逐步将GEOS全部转化为WKT表示。在内存中,以WKB格式存储。

WKT:使用文本存储几何对象。

WKB:使用结构进行存储。

属性数据一般与几何数据分开存储,两者通过相应的id进行联系,属性数据在QGIS中使用QVector进行存储。

WKT与WKB参见:..\wkb与wkt.docx

参考:http://www.gaia-gis.it/gaia-sins/spatialite-cookbook/html/wkt-wkb.html
2 原理

点、线、面等几何类型,具有相似的功能,点组成线、线组成面、部分组成整体。不同的几何类型之间还要进行分析。在处理上,可以使用独立的类表示,但要为每种类构造各自操作。可以使用一个相同的操作类,以各种数据类型为参数,统一进行操作。

Qgis就使用了一个统一的操作类QgsGeometry。
3 方法

QGIS中的将所有的类型,以QgsVector<T>为模板,以QgsPoint为基础进行组织实现,QgsRectangle单独实现。

QgsVector<T>:向量抽象,实现通用功能,如向量-*/,旋转等操作。在QgsPoint.h中实现。

QgsPoint:点抽象,实现点的功能。如:距离,方位角,运算,测试与线的关系等。

QgsRectangle:矩形抽象,实现缩放,测试(包含等),合并,融合等。

/** polyline is represented as a vector of points */

typedef QVector<QgsPoint> QgsPolyline;

/** polygon: first item of the list is outer ring, innerrings (if any) start from second item */

typedef QVector<QgsPolyline> QgsPolygon;

/** a collection of QgsPoints that share a common collectionof attributes */

typedef QVector<QgsPoint> QgsMultiPoint;

/** a collection of QgsPolylines that share a commoncollection of attributes */

typedef QVector<QgsPolyline>QgsMultiPolyline;

/** a collection of QgsPolygons that share a commoncollection of attributes */

typedef QVector<QgsPolygon>QgsMultiPolygon;

QgsGeometry:所有实体的抽象,用于将上述所有实现进行几何操作的统一平台。并与GEOS库交互,进行几何分析功能。

4 带有属性的地理实体抽象QgsFeature
  QgsFeature是矢量要素的抽象。QgsGeometry是几何部分的抽象。属性部分的属性名由QgsFields(是QgsField的集合操作类)抽象。属性值由QgsAttributes抽象。

QgsFeature用于抽象一个带有属性的地理实体,由其联系几何和属性两部分。几何部分由QgsGeometry抽象。属性部分由QgsFields和QgsAttributes抽象。

QgsField:属性名抽象,可以操作属性名的各个成员。

QgsFields:是QgsField的集合操作类,。

QgsFeatureIds:QgsFeatureId的集合。

QgsFeatureId:用于唯一标准一个QgsFeature的id。当前是64位Int。

QgsFeatureMap: typedef QMap<QgsFeatureId,QgsFeature> QgsFeatureMap;

QgsGeometryMap: typedef QMap<QgsFeatureId,QgsGeometry> QgsGeometryMap;

QgsAttributes:QVector<QVarient>,表示属性的值。

QgsAbstractFeatureIterator: QgsFeature迭代器的虚基类,由DataProvider驱动实现。用于进行元素获取。

QgsFeatureIterator:QgsFeature迭代器的包装类,用于操作QgsAbstractFeatureIterator。

QgsAbstractFeatureSource:由驱动实现,提供元素获取。

QgsAbstractFeatureFromSource<T>:抽象模板,继承QgsAbstractFeatureIterator,操作QgsAbstractFeatureSource。用于获取驱动(T),并进行读写开关操作(QgsAbstractFeatureIterator)。

QgsVectorLayerFeatureIterator:QgsFeature迭代器的矢量图层实现,每个矢量图层必须实现本类。

Qt+Qgis二次开发:地理实体抽象的更多相关文章

  1. Qt Qgis 二次开发——鼠标点击识别矢量要素

    Qt Qgis 二次开发--鼠标点击识别矢量要素 介绍: 识别矢量要素需要用到QGis的一个工具类:QgsMapToolIdentifyFeature 一个QgsMapTool的子类的子类,官方文档描 ...

  2. Qt+QGIS二次开发:开发环境搭建(超级详细)

    原文链接: 1.qgis二次开发环境搭建(超级详细) 2.QGIS开发教程(1)——QGIS开发准备工作 3.QGIS(2.18.15 源码)+Qt(5/5.9.3)+VS2015(X64)编译

  3. Qt+QGIS二次开发:自定义类实现查询矢量数据的属性字段值(图查属性)

    在GIS领域,有两种重要的查询操作,图查属性和属性查图. 本文主要介绍如何在QGIS中通过从QgsMapToolIdentify中派生自定义类实现查询矢量数据的属性字段值(图查属性). 重点参考资料: ...

  4. Qt+QGis二次开发:矢量图层的显示样式

    原文链接:QGis二次开发基础 -- 矢量图层的显示样式

  5. Qt+QGis二次开发:加载栅格图层和矢量图层

    一.加载栅格图像 加载栅格图像的详细步骤在下面代码里: //添加栅格数据按钮槽函数 void MainWindow::addRasterlayers() { //步骤1:打开文件选择对话框 QStri ...

  6. Qt+QGis二次开发:打开S-57格式(*.000)电子海图数据,并设置多边形要素的显示风格

    不过多的废话了,直接上源码: addChartlayers()方法时“打开海图”按钮的triggered()信号所绑定的槽函数. //添加海图数据小按钮槽函数 void MainWindow::add ...

  7. Qt+QGis二次开发:创建临时图层并添加要素

    开发环境:Win10 + VS2010 + Qt 4.8.6 + QGis 2.14.4 其实本文实现的功能类似于QGis中“添加文本数据图层”的一个简化版,本文不会涉及到对话框的使用,不通过与用户互 ...

  8. Qt+QGIS二次开发:读取矢量元素及其属性

    1  概述矢量图层内矢量元素组成,矢量图层的加载由驱动实现,驱动必须实现对矢量图层内元素的读写操作功能. 2 原理矢量元素包含几何和属性两部分组成.几何部分用于提供图形相关内容.属性部分提供与几何相关 ...

  9. Qt+QGIS二次开发:QGIS中使用QgsRubberBand类创建临时图形

    1  概述 临时图形Rubberband主要用于高亮显示.交互绘制等情况下.2 原理 临时图形是在一个底色透明的图层(顶层)上,添加已有的几何元素或者创建一个几何元素(临时图形),可以设置相应的样式, ...

随机推荐

  1. ArrayList 原码解析

    基于java1.71.ArrayList 是基于数组实现的 通过源码 我们可以知道 ArrayList 提供了三种构造器用于实例化 /** * Constructs an empty list wit ...

  2. jsp使用servlet实现文件上传

    1.在index.jsp中写入以下代码 <form method="post" action="demo3" enctype="multipar ...

  3. 【读书笔记】iOS-发布你的应用

    一,添加图标 你的应用在iPhone主屏幕上的标准图标(Icon.png)是57像素*57像素的正方形,PNG格式,不能有透明效果或者图层,72DPI.除些之外,你还可以提供一个同样格式的114像素* ...

  4. win7 x64 +vs2015 + cmake3.10.3编译opencv-3.4.1+opencv_contrib-3.4.1源码,并进行配置

    简介: 一直以来都是在ubuntu下使用opencv,最近因为有<图像处理与模式识别>这门课,需要使用vs2015+opencv提交课程作业,因为opencv官方编译好的exe没有cont ...

  5. 2018最新大厂Android面试真题

    前言 又到了金三银四的面试季,自己也不得不参与到这场战役中来,其实是从去年底就开始看,android的好机会确实不太多,但也还好,3年+的android开发经历还是有一些面试机会的,不过确实不像几年前 ...

  6. Kotlin入门(4)声明与操作数组

    上一篇文章介绍了基本变量类型在Kotlin中的用法,不过这只针对单个变量,如果要求把一组相同类型的变量排列起来,形成一个变量数组,那又该如何声明和操作呢? 在Java中声明数组,跟在C语言中声明是一样 ...

  7. http2

    原文转至:https://zhuanlan.zhihu.com/p/26559480 HTTP/2 是 HTTP 协议自 1999 年 HTTP 1.1 发布后的首个更新,主要基于 SPDY 协议.由 ...

  8. [20180403]访问dba_autotask_task无输出问题.txt

    [20180403]访问dba_autotask_task无输出问题.txt --//链接http://www.itpub.net/thread-1911421-1-1.html的讨论,还没注意原先的 ...

  9. SELinux 是什么?

    一.SELinux的历史 SELinux全称是Security Enhanced Linux,由美国国家安全部(National Security Agency)领导开发的GPL项目,它拥有一个灵活而 ...

  10. NetBeans数据库笔记---三层架构

    1.创建数据库,数据表 用MySQL数据库和Navicat for MySQL工具创建表 2.创建实体类——反应表结构(列——变量) 也就是对应表建立的gets和sets方法,实体类的名字一般都与数据 ...