Qgis 开发初级 《数据库和图层》

news2024/11/15 11:17:59

Qgis 可以加载很多数据源,像shapefile 文件, gdb文件等,还可以直接链接企业数据库。在这里,我只介绍比较常用的本地数据库 gdb。gdb 是esri 开发的数据库,gdb数据库不是开源的,qigs用了OpenFileGdb的驱动读写的,这个驱动目前是支持读写的。Qgis 读写数据库做了一层封装的,读写都是通过Qgis 的图层类实现,所以这里和图层一起介绍。

1、数据库操作

1.1、数据库的读取

读取数据库里面的某个表,从数据库的表到Qgis的QgsVectorLayer 矢量图层类中。参数表示 读取 D盘 test.gdb 的 名为 point 的表。注意这里 |layername= 附近 不要有空格,否则可能会读取失败。

QString layerName="point";
QString dbPath="D:\\test.gdb"+"|layername="+layerName;
QgsVectorLayer* gdbLayer = new QgsVectorLayer(dbPath, layerName, QStringLiteral("ogr"));

1.2、数据库的写入

这里会将QgsVectorLayer 写入到gdb中。

QgsVectorFileWriter::SaveVectorOptions options;
options.actionOnExistingFile = QgsVectorFileWriter::AppendToLayerNoNewFields;
options.driverName = "openFileGDB";
options.layerName = layerName;

QgsCoordinateTransform ct;
ct = QgsCoordinateTransform(vectorlayer->crs(), vectorlayer->crs(), vectorlayer->transformContext());
ptions.ct = ct;
QgsVectorFileWriter::writeAsVectorFormatV3(vectorlayer, cds.workSpacePath(), vectorlayer->transformContext(), options);

其中QgsVectorFileWriter::AppendToLayerNoNewFields是个枚举值。 通过它来确定数据库记录是覆盖还是增加。

  enum ActionOnExistingFile
    {
      //! Create or overwrite file
      CreateOrOverwriteFile,

      //! Create or overwrite layer
      CreateOrOverwriteLayer,

      //! Append features to existing layer, but do not create new fields
      AppendToLayerNoNewFields,

      //! Append features to existing layer, and create new fields if needed
      AppendToLayerAddFields
    };

2、图层的操作

Qgis的图层是Qgis封装的通用类,Qgis 用它屏蔽了数据源的不同,使用它可以操作所有的数据源。数据库的字段和记录都是通过Qgis的图层来实现的。Qgis 里面有各种类型的图层,跟gdb 有关的主要是QgsVectorLayer的矢量图层。

2.1、 图层的新建和添加

        图层第一种创建方式就是从数据库读取的图层。这个时候图层是与数据库表同步的。获取方法参考 1.1 数据库的读取。

        图层第二种创建是直接创建内存图层, 创建一个名字叫 test的点图层,并设置坐标系。

QgsVectorLayer* layer=new QgsVectorLayer("PointZ", "test", "memory");
layer->setCrs(QgsProject::instance()->crs());

这种创建的第一个参数是Qgis 的类型,该类型是个枚举,点,线,面都可以创建,枚举如下,创建的时候直接写字符串就可以。

enum Type
    {
      Unknown = 0,
      Point = 1,
      LineString = 2,
      Polygon = 3,
      Triangle = 17,
      MultiPoint = 4,
      MultiLineString = 5,
      MultiPolygon = 6,
      GeometryCollection = 7,
      CircularString = 8,
      CompoundCurve = 9,
      CurvePolygon = 10, //13, //should be 10. Seems to be correct in newer PostGIS versions
      MultiCurve = 11,
      MultiSurface = 12,
      NoGeometry = 100, //attributes only
      PointZ = 1001,
      LineStringZ = 1002,
      PolygonZ = 1003,
      TriangleZ = 1017,
      MultiPointZ = 1004,
      MultiLineStringZ = 1005,
      MultiPolygonZ = 1006,
      GeometryCollectionZ = 1007,
      CircularStringZ = 1008,
      CompoundCurveZ = 1009,
      CurvePolygonZ = 1010,
      MultiCurveZ = 1011,
      MultiSurfaceZ = 1012,
      PointM = 2001,
      LineStringM = 2002,
      PolygonM = 2003,
      TriangleM = 2017,
      MultiPointM = 2004,
      MultiLineStringM = 2005,
      MultiPolygonM = 2006,
      GeometryCollectionM = 2007,
      CircularStringM = 2008,
      CompoundCurveM = 2009,
      CurvePolygonM = 2010,
      MultiCurveM = 2011,
      MultiSurfaceM = 2012,
      PointZM = 3001,
      LineStringZM = 3002,
      PolygonZM = 3003,
      MultiPointZM = 3004,
      MultiLineStringZM = 3005,
      MultiPolygonZM = 3006,
      GeometryCollectionZM = 3007,
      CircularStringZM = 3008,
      CompoundCurveZM = 3009,
      CurvePolygonZM = 3010,
      MultiCurveZM = 3011,
      MultiSurfaceZM = 3012,
      TriangleZM = 3017,
      Point25D = 0x80000001,
      LineString25D,
      Polygon25D,
      MultiPoint25D,
      MultiLineString25D,
      MultiPolygon25D
    };

这种方式再介绍下指定地方坐标系的情况,str 填写的是坐标系的 wkt 字符串。其中layer 是QgsVectorLayer * 的指针对象。

QString str = "";
QgsCoordinateReferenceSystem crs = QgsCoordinateReferenceSystem::fromWkt(str);
layer->setCrs(crs);

这两种图层创建后,其实还没加入到Qgis 工程中。通过QgsProject 加入到工程中。代码如下。

QgsProject::instance()->addMapLayer(layer);

加入到工程中的图层,可以通过名字或者ID 重新获取指针。下面代码是获取名字叫test的图层。mapLayersByName 返回的是QList 列表对象。因为Qgis 多个图层可以叫同一个名字。当然可以通过layer的id获取,再次不多介绍了。

QgsVectorLayer* layer = qobject_cast<QgsVectorLayer*>(QgsProject::instance()->mapLayersByName("test").at(0));

2.2、 图层的删除

其中di 是 图层QgsVectorLayer * 的指针对象 的图层id; 这个里面会自动删除指针对象。

 QgsProject::instance()->removeMapLayer(id);

2.3、添加字段

Qgis 添加字段涉及到 QgsField 的类,如下代码,添加了一个String 类型的 Name 字段,一个Double类型的X 字段和一个Double类型的Y字段。Qgis 是用Qt 开发,经常会用到一些qt的语法。其中layer 是QgsVectorLayer * 的指针对象。

QList<QgsField> fieldList;
fieldList.append(QgsField("Name", QVariant::String));
fieldList.append(QgsField("X", QVariant::Double));
fieldList.append(QgsField("Y", QVariant::Double));

QgsVectorDataProvider* provider=layer->dataProvider();
provider->addAttributes(fieldList);
layer->updateFields();

3 、要素操作

图层和字段创建好了后,就需要对要素做进一步操作。主要实现增删改查,图层的要素编辑其实有两种,一种在编辑模式下,一种不在编辑模式下。两种的区别是编辑模式考虑的用户操作体验,可以做回撤,重做等操作,批处理时,效率相对较低。非编辑模式下直接操作同步数据库,效率比较高。这里先介绍下非编辑模式。Qgis的要素类是QgsFeature。 代表着数据库中的一行记录。

3.1 、添加要素

添加要素的代码如下,首先,创建QgsFature对象,其中layer 是QgsVectorLayer * 的指针对象。

QgsFeature feature = QgsFeature(layer->fields());
QgsVectorDataProvider* provider = layer->dataProvider();
provider->addFeature(feature );

也可以用addFeatures 批量添加,这种方式应该更快一些。QList 可以换成QgsFeatureList 是一样,QgsFeatureList 是QList<QgsFeature> 的宏命令。

QList<QgsFeature> features;
QgsFeature feature = QgsFeature(layer->fields());
features.push_back(feature );
QgsVectorDataProvider* provider = layer->dataProvider();
provider->addFeatures(features);

添加几何字段值,在平面坐标系下这样操作。在setGeometry 的参数是QgsGeometry。这个对象的具体操作会在后面介绍。注意,添加的几何,要与创建的图层一致,图层是点,添加点,图层是线,添加线,

feature.setGeometry(QgsGeometry::fromPointXY(QgsPointXY(1000, 1000)));

添加字段属性值,单个添加。

feature.setAttribute("X", 1000);
feature.setAttribute("Y", 1000);

也可以批量添加属性。但是要注意属性的顺序。

feature.setAttributes(QgsAttributes() << "Point 1");

3.2、要素更新

要素更新,主要更新地理字段和属性字段。可以使用下面的方法批量添加地理字段和属性字段。其中index 是字段的所在字段索引,id 是QgsFeature的 id ,layer  是 QgsVectorLayer * 的指针对象。 类型是QgsFeatureId。其中geo 和 amap 的不在举例子了。

	QgsGeometry geo;
    QgsAttributeMap amap;
    amap.insert(index, 1000);

    QgsChangedAttributesMap camap;
	QgsGeometryMap geoMap;
    camap.insert(id,amap);
    geoMap.insert(id,geo);

	layer->dataProvider()->changeFeatures(camap, geoMap);

3.3、要素删除

        通过以下方法删除要素

QgsFeatureIds ids;
layer->dataProvider()->deleteFeatures(ids);

4、小节

        我们介绍了数据库的操作,图层和要素的操作,其中图层和要素实在非编辑模式下的操作,也是比较高效率的操作。编辑模式下的操作其实类似,在后面qigs的编辑功能里面在介绍。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1996422.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ThreadPoolExecutor 理解

参数的理解&#xff1a; 核心和最大池大小 Core and maximum pool sizes ThreadPoolExecutor将根据corePoolSize 和 maximumPoolSize 设置的边界自动调整线程池大小&#xff0c;在方法execute&#xff08;Runnable&#xff09;中提交新任务时&#xff0c;如果运行的线程数少于…

http参数污染利用php小特性绕过贷齐乐waf

分析源码 GET/POST/REQUEST/COOKIE都会经过这个替换str_ace(array(&, ", <, >,(,)), array(&, ", <, >,&#xff08;,&#xff09;), $string) GET/POST/REQUEST三个变量&#xff0c;都会经过这个正则&#xff1a;select\|insert\|update\|delet…

【Linux】系列入门摘抄笔记-2-语法格式与内置、外部、帮助命令

语法格式与命令 1、命令的语法格式 command [选项] [参数] &#xff08;1&#xff09;command : 称为命令&#xff0c;是必须的&#xff0c;要执行的操作。 &#xff08;2&#xff09;选项&#xff1a;对命令的功能进行微调&#xff0c;决定这个命令将如何执行&#xff0c;同…

xshell连接云服务器 出现“所选的用户密钥未在远程主机上注册”的解决办法

欢迎来到雲闪世界。最近刚刚开启了谷歌云&#xff0c;有空了准备开台小鸡折腾下onedrive索引工具pyone。但是开了台小鸡之后&#xff0c;高兴的使用xshell生成密钥&#xff0c;把公钥复制到谷歌云控制台。然后新建主机&#xff0c;输入ip一套操作行云流水&#xff0c;可是出了点…

HarmonyOS Developer之实现点赞效果

待实现效果 点赞按钮通过一个div组件关联click事件实现。div组件包含一个image组件和一个text组件&#xff1a; image组件用于显示未点赞和点赞的效果。click事件函数会交替更新点赞和未点赞图片的路径。text组件用于显示点赞数&#xff0c;点赞数会在click事件的函数中同步更…

解锁多场景,EasyCVR视频汇聚网关赋能业务数字化转型

在信息化高速发展的今天&#xff0c;视频监控系统已成为各行各业不可或缺的一部分。从公共安全到企业管理&#xff0c;从智慧城市建设到个人生活安全&#xff0c;视频监控的覆盖范围日益广泛。而视频汇聚网关&#xff0c;作为视频监控系统中的核心设备&#xff0c;扮演着承上启…

程序员学长 | 超强!六大优化算法全总结

本文来源公众号“程序员学长”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;超强&#xff01;六大优化算法全总结 今天我们将详细讨论一下用于训练神经网络&#xff08;深度学习模型&#xff09;时使用的一些常见优化技术&#…

FlexBV电路查看软件

FlexBV - Macbook, iPhone, PC/Laptop & Electronics BoardViewer with PDF Cross Referencing 免费。 支持tvw&#xff0c;cad格式。 支持Windows,Linux,Mac。 而且我发现cad格式是文本的&#xff01;意味着可以自由编辑&#xff01;

springboot窝窝酒店管理系统-计算机毕业设计源码91798

摘 要 随着时代的进步与发展&#xff0c;互联网技术的应用也变得日益广泛。窝窝酒店管理系统在当今社会体系中扮演了一个非常重要的角色&#xff0c;它能大大地提高效率并减少了资源上的浪费。本文首先介绍了窝窝酒店管理系统的优势以及重要性&#xff1b;然后描述了这个系统的…

学习鸿蒙-构建私有仓储

1.选择 鸿蒙提供ohpm-repo工具用于构建本地私有仓储 ohpm-repo下载 2.环境配置 安装node&#xff0c;ohpm-repo 支持 node.js 18.x 及以上版本 node最新版本下载 3.配置文件及运行 1.解压 ohpm-repo 私仓工具包 2.进入 ohpm-repo 解压目录的 conf 目录内&#xff0c;打开 c…

PyTorch深度学习框架

最近放假在超星总部河北燕郊园区实习&#xff0c;本来是搞前后端开发岗位的&#xff0c;然后带我的副总老大哥比较关照我&#xff0c;了解我的情况后得知我大三选的方向是大数据&#xff0c;于是建议我学学python、Hadoop&#xff0c;Hadoop我看了一下内容比较多&#xff0c;而…

从概念到落地:全面解析DApp项目开发的核心要素与未来趋势

随着区块链技术的迅猛发展&#xff0c;去中心化应用程序&#xff08;DApp&#xff09;逐渐成为Web3时代的重要组成部分。DApp通过智能合约和分布式账本技术&#xff0c;提供了无需信任中介的解决方案&#xff0c;这种去中心化的特性使其在金融、游戏、社交等多个领域得到了广泛…

金融行业如何高效管理新媒体矩阵

金融行业作为经济体系的重要一环&#xff0c;受到社会多方关注和监管。 前有“985大一投行实习日常”的短视频引发大众热议&#xff0c;后有某机构女员工自爆事件牵扯出多家金融机构&#xff0c;将金融行业一度推到了舆论的风口浪尖。 这两件事的接连出现&#xff0c;也把金融新…

飞天发布时刻:大数据AI平台产品升级发布

7月24日&#xff0c;阿里云飞天发布时刻产品发布会围绕阿里云大数据AI平台的新能力和新产品进行详细介绍。人工智能平台PAI、云原生大数据计算服务MaxCompute、开源大数据平台E-MapReduce、实时数仓Hologres、阿里云Elasticsearch、向量检索Milvus等产品均带来了相关发布的深度…

C++必修:STL之forward_list与list的使用

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;C学习 贝蒂的主页&#xff1a;Betty’s blog 1. forward_list与list forward_list 是 C 11 引入的一种容器&#xff0c;它是一…

LQR横向控制及融合PID纵向控制C++实现

目录 简介一、现代控制理论1.1 经典控制理论和现代控制理论的区别1.2 全状态反馈控制系统 二、LQR控制器2.1 连续时间2.1.1 Q、R矩阵的选取2.1.2 推导过程2.1.3 连续时间下的LQR算法步骤 2.2 离散时间2.2.1 连续LQR和离散LQR的区别2.2.2离散时间下的LQR算法步骤 三、LQR实现自动…

AI大模型之旅--安装向量库milvus

milvus&#xff0c;向量索引库 1.milvus部署 milvus的官方文档中看到最新版本的部署方式Install Milvus Standalone with Docker Compose curl -sfL https://raw.githubusercontent.com/milvus-io/milvus/master/scripts/standalone_embed.sh -o standalone_embed.sh &#xf…

stm32f103c8t6与TB6612FNG解耦测试

stm32f103c8t6与TB6612FNG解耦测试 本文操作方式: 忽略底层,只做上层, 所以前面全部照搬步骤,重在调试 文章目录 stm32f103c8t6与TB6612FNG解耦测试本文操作方式:创建基本工程(1)跳转此链接,创建(2)创建电机驱动文件夹(3)PWM原理(4)电机转动控制 oled调试和key调试(5)OLED转速…

C++:奇异递归模板模式(CRTP模式)

奇异递归模板模式 文章目录 奇异递归模板模式理论说明CRTP模式的功能静态多态强制静态接口编译时多态优化解释 理论说明 奇异递归模板模式&#xff08;Curiously Recurring Template Pattern, CRTP&#xff09; 是一种设计模式&#xff0c;其原理很简单&#xff1a; 继承者将自…

工业三防平板赋能自动化产线打造工厂智慧管理

随着工业4.0时代的到来&#xff0c;智能制造成为了众多企业转型升级的必然选择。而MES系统作为智能制造的核心环节&#xff0c;能够有效地整合生产数据&#xff0c;提升生产效率&#xff0c;并实现工厂运营的数字化管理。然而&#xff0c;传统的MES系统大多依赖于PC端操作&…