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. CF724C Ray Tracing 扩展欧几里得 平面展开

    LINK:Ray Tracing 虚这道题很久了 模拟赛考了一个加强版的 瞬间就想到了这道简化版的. 考虑做法 暴力模拟可能可以 官方正解好像就是这个. 不过遇到这种平面问题可以考虑把平面给无限的展开 ...

  2. 5.21 省选模拟赛 luogu P4207 [NOI2005]月下柠檬树 解析几何 自适应辛普森积分法

    LINK:月下柠檬树 之前感觉这道题很鬼畜 实际上 也就想到辛普森积分后就很好做了. 辛普森积分法的式子不再赘述 网上多的是.值得一提的是 这道题利用辛普森积分法的话就是一个解析几何的问题 而并非计算 ...

  3. 4.9 省选模拟赛 生成树求和 变元矩阵树定理 生成函数 iDFT 插值法

    有同学在loj上找到了加强版 所以这道题是可以交的.LINK:生成树求和 加强版 对于30分 爆搜 可实际上我爆搜只过了25分 有同学使用按秩合并并茶几的及时剪枝通过了30分. const int M ...

  4. 史上最简单操作!!!!!!!Window Server2012 修改远程桌面端口号

    Window Server2012 修改远程桌面端口号   Win + R 输入 regedit 打开注册表编辑器 在注册表编辑器中找到 PortNumber 双击 PortNumber,选择10进制 ...

  5. C#LeetCode刷题之#367-有效的完全平方数(Valid Perfect Square)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3869 访问. 给定一个正整数 num,编写一个函数,如果 num ...

  6. Web优化躬行记(4)——用户体验和工具

    一.用户体验 用户体验(UE/UX)是指一个人使用一个特定产品.系统或服务时的行为.情绪与态度,还包含用户对于系统的功能.易用和效率的感受,因此用户体验在本质上可以视为一个人对于系统的主观感受与主观想 ...

  7. Java多线程编程(6)--线程间通信(下)

      因为本文的内容大部分是以生产者/消费者模式来进行讲解和举例的,所以在开始学习本文介绍的几种线程间的通信方式之前,我们先来熟悉一下生产者/消费者模式.   在实际的软件开发过程中,经常会碰到如下场景 ...

  8. Jmeter(二十一) - 从入门到精通 - JMeter断言 - 上篇(详解教程)

    1.简介 最近由于宏哥在搭建自己的个人博客可能更新的有点慢.断言组件用来对服务器的响应数据做验证,常用的断言是响应断言,其支持正则表达式.虽然我们的通过响应断言能够完成绝大多数的结果验证工作,但是JM ...

  9. CSS动画实例:升空的气球

    1.制作一个气球 设页面中有<div class="balloon"></div>,为. balloon设置样式规则如下: .balloon { heigh ...

  10. SpringMVC实现客户端跳转

    之前无论是/index跳转到index.jsp 还是/addProduct 跳转到showProduct.jsp,都是服务端跳转. 这一篇练习如何进行客户端跳转 @ 目录 修改IndexControl ...