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(0,255,0));
        pRubber->setWidth(2);
        constQgsMapToPixel*pM2PTransform=pMapCanvas->getCoordinateTransform();
        QgsPointpt1=pM2PTransform->toMapCoordinates(0,0);
        QgsPointpt2=pM2PTransform->toMapCoordinates(100,0);
        QgsPointpt3=pM2PTransform->toMapCoordinates(100,100);
        QgsPointpt4=pM2PTransform->toMapCoordinates(0,100);
        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(255,0,0));
        pRubber->setWidth(2);
        constQgsMapToPixel*pM2PTransform=pMapCanvas->getCoordinateTransform();
        QgsPointpt1=pM2PTransform->toMapCoordinates(10,10);
        QgsPointpt2=pM2PTransform->toMapCoordinates(90,10);
        QgsPointpt3=pM2PTransform->toMapCoordinates(90,90);
        QgsPointpt4=pM2PTransform->toMapCoordinates(10,90);
        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(0,255,0));
        pRubber->setWidth(10);
        pRubber->setIcon(QgsRubberBand::ICON_CROSS);
        pRubber->setIconSize(20);
        constQgsMapToPixel*pM2PTransform=pMapCanvas->getCoordinateTransform();
        QgsPointpt1=pM2PTransform->toMapCoordinates(50,50);
        pRubber->addPoint(pt1,true);
    }
}

原文地址:https://www.cnblogs.com/rainbow70626/p/10383067.html

时间: 2024-10-10 10:53:16

Qt+QGIS二次开发:QGIS中使用QgsRubberBand类创建临时图形的相关文章

Qt+QGIS二次开发:自定义类实现查询矢量数据的属性字段值(图查属性)

在GIS领域,有两种重要的查询操作,图查属性和属性查图. 本文主要介绍如何在QGIS中通过从QgsMapToolIdentify中派生自定义类实现查询矢量数据的属性字段值(图查属性). 重点参考资料: 1.QGis二次开发基础 -- 属性识别工具的实现 2.QGis(三)查询矢量图层的要素属性字段值 原文地址:https://www.cnblogs.com/rainbow70626/p/10383034.html

研究QGIS二次开发笔记(一)

为了在QT程序中嵌入一个地图,最终选择了QGIS来干这件事.选型阶段真是呵呵.我折腾的是QGIS2.4.0. 首先,到官方网站下载安装QGIS.如果你跟我一样懒的话,可能希望下载一个已经编译好的windows版的QGIS.但是这里有个陷阱.咱们是要做二次开发的,千万不要下载安装那个看上去很美的QGIS Chugiak安装包,那里面缺lib库啊我摔!!一定要用那个在线安装下载的osgeo4w.下载选择advance install,在选择下载项时注意把libjpeg_ipp那个库取消掉,安装没有i

Qt+QGis二次开发:加载栅格图层和矢量图层

一.加载栅格图像 加载栅格图像的详细步骤在下面代码里: //添加栅格数据按钮槽函数 void MainWindow::addRasterlayers() { //步骤1:打开文件选择对话框 QString filename=QFileDialog::getOpenFileName(this,tr("打开栅格数据"),"","remote sensing image(*.tif *.tiff);;image(*.jpg *.jpeg *.png *.bmp)

[原创]Qt C++下进行QGIS二次开发打开S-57格式(*.000)电子海图数据,并设置多边形要素的显示风格

不过多的废话了,直接上源码: addChartlayers()方法时"打开海图"按钮的triggered()信号所绑定的槽函数. //添加海图数据小按钮槽函数 void MainWindow::addChartlayers() { m_mapCanvas->freeze(true);//冻结或解冻地图画布对象,frozen (true) or thawed (false). Default is true. //步骤1:打开文件选择对话框 QString filename=QFi

NX二次开发-NXOpen中Point3d类型转换成point类型

1 NX9+VS2012 2 3 #include <NXOpen/NXObject.hxx> 4 #include <NXOpen/Part.hxx> 5 #include <NXOpen/PartCollection.hxx> 6 #include <NXOpen/Point.hxx> 7 #include <NXOpen/PointCollection.hxx> 8 9 NXOpen::Session *theSession = NXOpe

Quartz总结(二):定时任务中使用业务类(XXService)

零.引言 上一篇文章:讲到了Spring集成Quartz的几种基本方法. 在实际使用的时候,往往会在定时任务中调用某个业务类中的方法,此时使用QuartzJobBean和MethodInvokeJobDetailFactoryBean的区别就出来了. 一.QuartzJobBean 在继承QuartzJobBean的Job类中,使用XXService的时候,会报 空指针异常,原因是因为使用此方法的时候Job对象的创建时Quartz创建的,而XXXService是通过Spring创建的,两者不是同

NX二次开发-UFUN获取一个图层类别的tag UF_LAYER_ask_category_tag

1 NX11+VS2013 2 3 #include <uf.h> 4 #include <uf_ui.h> 5 #include <uf_layer.h> 6 7 8 9 UF_initialize(); 10 11 //获取一个图层类别的tag 12 tag_t category = NULL_TAG; 13 UF_LAYER_ask_category_tag("01.Tangkl_Solids", &category); 14 15 /

QGIS C++二次开发环境

网上看了一下QGIS C++的二次开发环境大部分都还停留在QGIS2.9之前的版本和QT4的基础上,应该是三年前的版本吧,而且多数使用的是RelWithDebInfo.模式,个人感觉那种模式是QGIS开发社区为学习QGIS代码的人提供的一种折中模式,并不是合真正的应用开发,而且,当用这种版本调试时很多DEBUG信息也显示不出来,因此出错时也很难判断错误的原因.现在QGIS3的版本已经正式发布了,与2.9之前的版本比较变化很大无论是功能还是接口.例如:增加XYZ图层支持可以直接加载高德.谷歌等TM

QGIS 二三维效果

提示:所有环境环境所使用的QGIS SDK ,包括:QGIS FOR ANDRIOD.androidQGIS FOR LINUX.androidQGIS FOR LINUX.QGISSERVER.QGIS与OSGEARTH集成的二三维开发环境等QGIS二次开发扩展环境为同一套QGIS底层开发环境,可以为你利用开源平台进行快速开发提供服务,同时承接各类GIS项目开发,欢迎您咨询回顾.联系:315022850 原文地址:http://blog.51cto.com/osgis/2110917