QT_QGIS_基本使用


1、新建画布

2、添加矢量图层

​ 1、打开矢量图层

​ 2、新建矢量图层

​ 1、添加几何要素——点

​ 2、添加几何要素——线

3、添加栅格图层

​ 1、打开栅格图层

小demo


1、新建画布

/* #include "QgsMapCanvas"
* class QgsMapCanvas;
* 继承于QWidget,可以直接当成Widget使用
*/
QgsMapCanvas* m_canvas = new QgsMapCanvas; // 实例化画布
QgsMapToolPan * toolPan = new QgsMapToolPan(m_canvas); // 新建移动工具
// QgsMapToolZoom * toolZoom = new QgsMapToolZoom(m_canvas,true); // 放大工具
// m_canvas->setMapTool(toolZoom); m_canvas->setMapTool(toolPan); // 将移动工具设置到画布
m_canvas->freeze(false); // 画布解冻
m_canvas->setCanvasColor(QColor(255,255,255)); // 设置画布颜色
m_canvas->setVisible(true); // 设置可见
m_canvas->enableAntiAliasing(true); // 设置可抗锯齿 QGridLayout * layout = new QGirdLayout(this);
layout->addWidget(m_canvas); // 显示画布

2、添加矢量图层

1、打开矢量图层
QString fileName = QFileDialog::getOpenFileName(this,
tr("Open shape file"),
"",
"*.shp"); // 选择文件
QStringList list = fileName.split("/"); // 通过"/" 分隔获取的路径
Qstring baseName = list.back; // 图层名 /* #include "qgsvectorlayer.h"
* class QgsVectorLayer;
* 继承 QgsMapLayer
* @parameter1 要打开的文件
* @parameter2 图层名称
* @parameter3 数据提供者的名称,"memory"/"postgres"/...
*/
QgsVectorLayer * layer = new QgsVectorLayer(fileName,baseName,"ogr"); // 实例化矢量图层类
if(!layer->isValid()) // 判断图层是否有效
{
return;
}
QList<QgsMapLayer *> m_layers; // 创建一个容器用于保存图层
m_layers.append(layer); // 将打开的图层添加到容器
m_canvas->setLayers(m_layers); // 将容器的中的图层设置到画布
2、新建矢量图层
1、添加几何要素——点
/* @parameter1 组成
* 几何类型:
* 点 "Point?"
* 线 "LineString?"
* 多边形 "Polygon?"
* 参照坐标系:
* "crs=epsg:4326&"
* 添加字段:
* "field=id:integer&field=name:string(50)&"
* 创建索引:
* "index=yes&"
*/
QgsVectorLayer * pointLayer = new QgsVectorLayer("Point?crs=epsg:4326&","MyPoint","memory"); // 实例化矢量图层,作为点图层 pointLayer->startEditing(); // 设置图层状态为开始编辑 /* #include "qgsgeometry.h"
* class QgsGeometry;
* 几何类
*/
QgsGeometry point = QgsGeometry::fromPointXY(QgsPointXY(116.46,39.92)); // 调用静态函数,实例化一个几何点
/* #include "qgsfeature.h"
* class QgsFeature;
* QGis 要素类
*/
QgsFeature feature; // 创建要素
feature.setGeometry(point); // 将几何点设置为要素
feature.setAttributes(QgsAttributes() << QVariant(1) << QVariant("test")); // 设置要素属性 /* #include "qgsvectordataprovider.h"
* class QgsVectorDataProvider;
* 继承于 QgsDataProvider(同样继承于此类的还有 QgsRasterDataProvider)
* 是矢量数据提供者的基类
*/
QgsVectorDataProvider * provider = pointLayer->dataProvider(); // 获取点图层的数据提供者的指针,用于添加要素
provider->addFeature(feature); // 将点要素添加到矢量层
// provider->addFeatures(featureList << feature); // 此方法用于添加多个要素 pointLayer->commitChanges(); // 保存图层
pointLayer->updateExtents(); // 更新图层 m_layer.push_front(pointLayer); // 将设置好的图层添加到保存图层的容器中 m_canvas->setExtent(pointLayer->extent()); // 设置画布范围为当前图层的范围,也就是将图层平铺到画布上
m_canvas->setLayers(m_layer); // 将容器设置到画布
m_canvas->refresh(); // 刷新画布
2、添加几何要素——线
/* 添加线的流程和点基本一样
*/
QgsVectorLayer * pointLayer = new QgsVectorLayer("LineString?crs=epsg:4326","MyPoint","memory"); pointLayer->startEditing(); // 设置图层状态为开始编辑 QgsPolyline l;
l << QgsPoint(116.2448,40.0573) << QgsPoint(116.2448,80)
<< QgsPoint(110,80) << QgsPoint(50,50) << QgsPoint(116,40); // 添加若干坐标,组成一条拆线
QgsGeometry line = QgsGeometry::fromPolyline(line); // 调用静态函数,实例化一条拆线 QgsFeature feature; // 创建要素
feature.setGeometry(line); // 设置几何拆线设置为要素
feature.setAttributes(QgsAttributes() << QVariant(1) << QVariant("test")); // 设置属性 QgsVectorDataProvider * provider = pointLayer->dataProvider(); // 获取一个用于添加要素的指针
provider->addFeature(feature); // 将几何点添加到矢量层
// provider->addFeatures(featureList << feature); // 此方法用于添加多个要素 pointLayer->commitChanges(); // 保存图层
pointLayer->updateExtents(); // 更新图层 m_layer.push_front(pointLayer); // 将设置好的图层添加到保存图层的容器中 m_canvas->setExtent(pointLayer->extent()); // 设置画面范围为图层的范围,也就是将图层平铺到画布上
m_canvas->setLayers(m_layer); // 将容器设置到画布
m_canvas->refresh(); // 刷新画布

3、添加栅格图层

1、打开栅格图层
// 还没写

自己写了个小demo,还没写完,代码:https://cloud.189.cn/t/quyYBvq6fiAb(访问码:4uoh)

后续更新...

QT_QGIS_基本使用的更多相关文章

随机推荐

  1. 剑指 Offer 50. 第一个只出现一次的字符

    本题 题目链接 题目描述 我的题解 (方法三应用更广泛:方法一虽有限制,但很好用,此题中该方法效率也最高) 方法一:(适用于范围确定的) 思路分析 该字符串只包含小写字母,即字符种类最多26个 开一个 ...

  2. 不使用spring-boot-starter-parent作为依赖parent

    背景环境 在某些情况下由于某些原因,我们的项目不能使用spring-boot-starter-parent作为<parent>依赖,一定要有自己的<parent>,但同时还希望 ...

  3. 【FZYZOJ】无向图的联通图个数 题解(组合数学)

    题目大意:求无向图的连通图个数.由于个数可能很大,只需要求出结果$mod1000000009$的值.$n\leq 1000$ ------------------------- 对于一个含有$n$个结 ...

  4. Error: Cannot perform an interactive login from a non TTY device

    zhangjiawen@zhangjiawen-PC MINGW64 /d/Docker Toolbox$ docker login --username=绝世随机变量 registry.cn-han ...

  5. 深度学习模型调优方法(Deep Learning学习记录)

    深度学习模型的调优,首先需要对各方面进行评估,主要包括定义函数.模型在训练集和测试集拟合效果.交叉验证.激活函数和优化算法的选择等. 那如何对我们自己的模型进行判断呢?——通过模型训练跑代码,我们可以 ...

  6. 来自灵魂的拷问——知道什么是SQL执行计划吗?

    面试官说:工作这么久了,应该知道sql执行计划吧,讲讲Sql的执行计划吧! 看了看面试官手臂上纹的大花臂和一串看不懂的韩文,吞了吞口水,暗示自己镇定点,整理了一下思绪缓缓的对面试官说:我不会 面试官: ...

  7. 朴素贝叶斯算法java实现(多项式模型)

    网上有很多对朴素贝叶斯算法的说明的文章,在对算法实现前,参考了一下几篇文章: NLP系列(2)_用朴素贝叶斯进行文本分类(上) NLP系列(3)_用朴素贝叶斯进行文本分类(下) 带你搞懂朴素贝叶斯分类 ...

  8. axios的post请求返回状态码400

    设置拦截 axios.interceptors.request.use((config) => { if (config.method === 'post') { if (!config.isF ...

  9. 详解Apache Hudi如何配置各种类型分区

    1. 引入 Apache Hudi支持多种分区方式数据集,如多级分区.单分区.时间日期分区.无分区数据集等,用户可根据实际需求选择合适的分区方式,下面来详细了解Hudi如何配置何种类型分区. 2. 分 ...

  10. unity探索者之安卓微信登录,非第三方插件

    版权声明:本文为原创文章,转载请声明http://www.cnblogs.com/unityExplorer/p/7666348.html 之前写了两篇关于微信分享的博客,其实微信登录.分享.支付博主 ...