QT_QGIS_基本使用
QT_QGIS_基本使用
2、添加矢量图层
1、打开矢量图层
2、新建矢量图层
1、添加几何要素——点
2、添加几何要素——线
3、添加栅格图层
1、打开栅格图层
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_基本使用的更多相关文章
随机推荐
- luogu P1973 [NOI2011]NOI 嘉年华 dp
LINK:NOI 嘉年华 一道质量非常高的dp题目. 考虑如何求出第一问 容易想到dp. 按照左端点排序/右端点排序状态还是很难描述. 但是我们知道在时间上肯定是一次选一段 所以就可以直接利用时间点来 ...
- 开源后端数据校验插件Validate.Net,类似Validate.js
介绍 Validate.Net将Validate.js移植到.Net平台,可以更方便.更快捷的校验实体内属性值是否合法.内置多种常规数据校验规则(校验必填.校验字符串长度区间.校验最大最小值.校验值区 ...
- OWL本体语言和Protege本体编辑器
OWL本体语言和Protege本体编辑器 演讲稿原作者:Wala Abdulaziz译者:Wu Di (pimgeek)转载.编辑:Tan Liwei原文发布日期:2013年6月5号原文链接:http ...
- 注重代码习惯,Python零基础从这本书籍开始!
笨办法学 Python是Zed Shaw 编写的一本Python入门书籍.适合对计算机了解不多,没有学过编程,但对编程感兴趣的朋友学习使用.这本书以习题的方式引导读者一步一步学习编 程,从简单的打印一 ...
- javascript 简单、繁杂类型、栈、堆笔记
简单数据类型 值类型:在存储变量中的是值本身 简单数据类型 null返回的是空的对象 string,number,Boolean,undefined,null 繁杂数据类型 ...
- JVM与Java体系结构
参考笔记:https://blog.csdn.net/weixin_45759791/article/details/107322503 前言 作为Java工程师的你曾被伤害过吗?你是否也遇到过这些问 ...
- python_appium使用原理
一. appium介绍 Appium是一个开源测试自动化框架,可用于原生,混合和移动Web应用程序测试. 它使用WebDriver协议驱动iOS,Android和Windows应用程序. 多平台支持: ...
- 【LifecycleException】: org.apache.catalina.LifecycleException: A child container failed during start 解决
看了好多种解决方案: 第一种:从tomcat remove project -> clean project -> reboot project; 第二种:说用到的 jasper jsp解 ...
- LeetCode 115.不同的子序列 详解
题目详情 给定一个字符串 S 和一个字符串 T,计算在 S 的子序列中 T 出现的个数. 一个字符串的一个子序列是指,通过删除一些(也可以不删除)字符且不干扰剩余字符相对位置所组成的新字符串.(例如, ...
- go 字符串
目录 前言 1.声明/赋值 2.遍历 3.操作 1.截取 2.修改 3.连接 4.比较 5.查长 6.格式化输出 4.字符串优势 跳转 前言 不做文字的搬运工,多做灵感性记录 这是平时学习总结的地方, ...
