Qt+QGIS二次开发:QGIS中使用QgsRubberBand类创建临时图形
1 概述
临时图形Rubberband主要用于高亮显示、交互绘制等情况下。
2 原理
临时图形是在一个底色透明的图层(顶层)上,添加已有的几何元素或者创建一个几何元素(临时图形),可以设置相应的样式,并在图层的最上层叠加显示。
3 使用方法
QgsRubberBand用于显示临时图形。可以显示点、线、面等所有类型。由于在交互绘制时,可能需要高亮显示节点,所以本类也可以设置不同的IconType来显示不同的节点样式(只能在点类型时起作用)。
生成对象后可以完成操作所有的属性,如几何元素、样式等。
setWidth():设置画笔宽度。
setIconSize():设置icon的宽度(高度)。
addGeometry():添加已有的Geometry。注意:第二个参数为vectorlayer,用途是将Geometry按照此layer的crs与mapcanvas的crs进行坐标转换,如果此为NULL,则不转换。参见Qgis开发12-读取矢量元素.docx
特别要注意:mapcanvas在显示之前各种参数都不确定,一定要在mapcanvas渲染结束之后再进行坐标转换之类的操作。
示例:
//xx.cpp
connect(m_pMapCanvas,SIGNAL(xyCoordinates(QgsPoint)),this,SLOT(showMousePoint(QgsPoint))); /**
*@briefMainWindow::initialMapCanvas
*
*initializewhenmapcanvaspaintfinished.
*@authorsf2gis@163.com
*@date2014-08-2222:31:24
*/
voidMainWindow::initialMapCanvas()
{
createRubberBand(m_pMapCanvas);
} /**
*@briefMainWindow::createRubberBand
*
*createrubberband.
*@parampMapCanvas
*@authorsf2gis@163.com
*@date2014-08-2222:32:30
*/ voidMainWindow::createRubberBand(QgsMapCanvas*pMapCanvas)
{
{//line
QgsRubberBand*pRubber=newQgsRubberBand(pMapCanvas,QGis::Line);
pRubber->setColor(QColor(,,));
pRubber->setWidth();
constQgsMapToPixel*pM2PTransform=pMapCanvas->getCoordinateTransform();
QgsPointpt1=pM2PTransform->toMapCoordinates(,);
QgsPointpt2=pM2PTransform->toMapCoordinates(,);
QgsPointpt3=pM2PTransform->toMapCoordinates(,);
QgsPointpt4=pM2PTransform->toMapCoordinates(,);
pRubber->addPoint(pt1,false);
pRubber->addPoint(pt2,false);
pRubber->addPoint(pt3,false);
pRubber->addPoint(pt4,true);
} {//polygon QgsRubberBand*pRubber=newQgsRubberBand(pMapCanvas,QGis::Polygon);
pRubber->setColor(QColor(,,));
pRubber->setWidth();
constQgsMapToPixel*pM2PTransform=pMapCanvas->getCoordinateTransform();
QgsPointpt1=pM2PTransform->toMapCoordinates(,);
QgsPointpt2=pM2PTransform->toMapCoordinates(,);
QgsPointpt3=pM2PTransform->toMapCoordinates(,);
QgsPointpt4=pM2PTransform->toMapCoordinates(,);
pRubber->addPoint(pt1,false);
pRubber->addPoint(pt2,false);
pRubber->addPoint(pt3,false);
pRubber->addPoint(pt4,true);
} {//point
QgsRubberBand*pRubber=newQgsRubberBand(pMapCanvas,QGis::Point);
pRubber->setColor(QColor(,,));
pRubber->setWidth();
pRubber->setIcon(QgsRubberBand::ICON_CROSS);
pRubber->setIconSize();
constQgsMapToPixel*pM2PTransform=pMapCanvas->getCoordinateTransform();
QgsPointpt1=pM2PTransform->toMapCoordinates(,);
pRubber->addPoint(pt1,true);
}
}
Qt+QGIS二次开发:QGIS中使用QgsRubberBand类创建临时图形的更多相关文章
- Qt Qgis 二次开发——鼠标点击识别矢量要素
Qt Qgis 二次开发--鼠标点击识别矢量要素 介绍: 识别矢量要素需要用到QGis的一个工具类:QgsMapToolIdentifyFeature 一个QgsMapTool的子类的子类,官方文档描 ...
- Qt+QGIS二次开发:自定义类实现查询矢量数据的属性字段值(图查属性)
在GIS领域,有两种重要的查询操作,图查属性和属性查图. 本文主要介绍如何在QGIS中通过从QgsMapToolIdentify中派生自定义类实现查询矢量数据的属性字段值(图查属性). 重点参考资料: ...
- Qt+QGIS二次开发:开发环境搭建(超级详细)
原文链接: 1.qgis二次开发环境搭建(超级详细) 2.QGIS开发教程(1)——QGIS开发准备工作 3.QGIS(2.18.15 源码)+Qt(5/5.9.3)+VS2015(X64)编译
- Qt+QGis二次开发:加载栅格图层和矢量图层
一.加载栅格图像 加载栅格图像的详细步骤在下面代码里: //添加栅格数据按钮槽函数 void MainWindow::addRasterlayers() { //步骤1:打开文件选择对话框 QStri ...
- Qt+QGis二次开发:打开S-57格式(*.000)电子海图数据,并设置多边形要素的显示风格
不过多的废话了,直接上源码: addChartlayers()方法时“打开海图”按钮的triggered()信号所绑定的槽函数. //添加海图数据小按钮槽函数 void MainWindow::add ...
- Qt+QGis二次开发:矢量图层的显示样式
原文链接:QGis二次开发基础 -- 矢量图层的显示样式
- Qt+QGis二次开发:创建临时图层并添加要素
开发环境:Win10 + VS2010 + Qt 4.8.6 + QGis 2.14.4 其实本文实现的功能类似于QGis中“添加文本数据图层”的一个简化版,本文不会涉及到对话框的使用,不通过与用户互 ...
- Qt+Qgis二次开发:地理实体抽象
1 概述 地理实体抽象是指点.线.面及其组合而成的,用于描述实际地物的数据结构. 其中包含几何实体和属性数据. GIS中进行几何操作,以各种实体类为基础进行操作. 在OGC中,地理实体可以由WKT表 ...
- 研究QGIS二次开发笔记(一)
为了在QT程序中嵌入一个地图,最终选择了QGIS来干这件事.选型阶段真是呵呵.我折腾的是QGIS2.4.0. 首先,到官方网站下载安装QGIS.如果你跟我一样懒的话,可能希望下载一个已经编译好的win ...
随机推荐
- 使用git push命令如何忽略不想提交的文件夹或者文件
如下场景是在window下的操作. 在使用node的时候有个node_modules文件夹很大,一般情况下不想提交,忽略的办法如: 方法一(来自评论区):直接在仓库根目录:执行命令echo 'node ...
- Docker 修改存储路径
Docker 版本 1.13 及以下 systemctl stop docker.service cp /usr/lib/systemd/system/docker.service /home/doc ...
- ajax文件上传-FormData()
HTML: <form action=""> <input type="file" id="file1" name=&qu ...
- js小知识
1.重新声明js变量,变量值不丢失 2.background-color 使用jquery获取样式中的background-color的值时发现在获取到的颜色值在IE中与Chrome.Firefox显 ...
- 中软高科WEB前端面试题
一个朋友面试的题目,百度了一下这个中软高科貌似是一个培训机构...以下答案是我本人的理解,仅供参考 HTML+CSS 1.你能解释一下css的盒子模型吗? 有两种盒子模型:IE盒子模型,W3C盒子模型 ...
- 解决git did not exit cleanly (exit code 128)
最近在用git提交代码到部门服务器上的时候,总是有 提示 git did not exit cleanly (exit code 128).网上有2种解决方式: 1.替换路径 1.鼠标右键 -> ...
- Android系统启动流程(一)解析init进程启动过程
整体流程大致如下: 1.init简介 init进程是Android系统中用户空间的第一个进程,作为第一个进程,它被赋予了很多极其重要的工作职责,比如创建zygote(孵化器)和属性服务等.in ...
- (网页)SQLserver中在上线的项目中遇到科学计数法怎么办?
遇到这个问题,首先上线的数据能清除吗?显然是不能的. 1.首先要去找这些科学计数法的数字是哪里来的. 2.怎么在不改变数据的情况下去操作这张表.可以使用convert()转一下Decimal.
- TensorFlow实现梯度下降
# -*- coding: utf-8 -*- """ Created on Mon Oct 15 17:38:39 2018 @author: zhen "& ...
- Python鸢尾花分类实现
#coding:utf-8 from sklearn.datasets import load_irisfrom sklearn.model_selection import train_test_s ...