Qgis二次开发-QgsMapCanvas画布简介

QgsMapCanvas是QGis的核心类,用于显示各种GIS数据。类提供了如刷新、保存图片、缩放等接口,同时有多个信号响应地图变化,例如画布颜色改变、层变化、范围更改等。文章还展示了如何添加矢量图层和栅格图层到画布,并通过信号槽机制响应坐标和缩放变化。
摘要由CSDN通过智能技术生成

1.简介

QgsMapCanvas是一个用于在画布上显示所有GIS数据类型的类,它是QGis的核心类,所有的画的东西都要在画布上进行。

以下是类的继承:

2.常用接口介绍 

槽函数:

//重新绘制画布地图
void refresh ()

//保存图片
void saveAsImage (const QString &fileName, QPixmap *QPixmap=nullptr, const QString &="PNG")

//放大
void zoomIn ()

//缩小
void zoomOut ()

信号:

//画布颜色改变时
void canvasColorChanged ()

//当前层被改变时发出
void currentLayerChanged (QgsMapLayer *layer)

//当映射的范围更改时触发
void extentsChanged ()

//当接收到一组新的层时触发
void layersChanged ()

//地图交互工具改变了
void mapToolSet (QgsMapTool *newTool, QgsMapTool *oldTool)

//当地图的比例改变时发出
void scaleChanged (double)

//当鼠标位置改变时发出
void xyCoordinates (const QgsPointXY &p)

//缩放最后状态改变时触发
void zoomLastStatusChanged (bool)

//缩放下一个状态改变时触发
void zoomNextStatusChanged (bool)

方法:

//返回当前图层
QgsMapLayer *currentLayer ()

//用于确定是否启用了抗锯齿
void enableAntiAliasing (bool flag)

//返回地图画布的当前缩放范围
QgsRectangle extent () const

//冻结/解冻地图画布
void freeze (bool frozen=true)

//返回地图画布上所有图层的合并范围
QgsRectangle fullExtent () const

//获取当前坐标变换
const QgsMapToPixel *getCoordinateTransform ()

//返回图层堆栈中位于索引位置的映射层
QgsMapLayer *layer (int index)

//返回地图画布中显示的图层列表
QList<QgsMapLayer *> layers () const

//返回当前活动的工具
QgsMapTool *mapTool ()

//返回最后报告的画布比例
double 	scale () const

//设置画布颜色
void setCanvasColor (const QColor &_newVal)

//设置当前图层
void setCurrentLayer (QgsMapLayer *layer)

//将映射画布的范围设置为指定的矩形
void setExtent (const QgsRectangle &r, bool magnified=false)

//设置当前图层集合
void setLayers (const QList< QgsMapLayer * > &layers)

//设置地图工具
void setMapTool (QgsMapTool *mapTool, bool clean=false)

//设置旋转角度
void setRotation (double degrees)

//放大到所有图层的全部范围
void zoomToFullExtent ()

3.代码示例

添加矢量图层:

QList<QgsMapLayer *> m_layers;

//添加矢量数据小按钮槽函数
void MainWindow::addVectorlayers()
{
    //步骤1:打开文件选择对话框
    QString filename=QFileDialog::getOpenFileName(this,tr("打开矢量数据"),"","ESRI Shapefile(*.shp)");
    if(filename.isNull())//如果未选择文件则返回
        return;
    QFileInfo fi(filename);
    QString basename=fi.baseName();//获取文件基名称
    //步骤2:创建QgsVectorLayer类
    QgsVectorLayer* vecLayer=new QgsVectorLayer(filename,basename,"ogr",false);
    if(!vecLayer->isValid())//如果图层不合法
    {
        QMessageBox::critical(this,"error","图层无效!");
        return;
    }
    //步骤3:注册添加矢量数据,并个并添加到画布中
    QgsMapLayerRegistry::instance()->addMapLayer(vecLayer);

    //设置该图层的单一渲染风格
    QgsSymbolV2* symbol = QgsSymbolV2::defaultSymbol(vecLayer->geometryType());//QGis::GeometryType::Polygon
    symbol->setColor(QColor(100,100,156,255));
    vecLayer->setRendererV2( new QgsSingleSymbolRendererV2(symbol) );

    m_layers.append(vecLayer);
    m_mapCanvas->setExtent(vecLayer->extent());//设置显示范围。Extent:范围、尺度
    m_mapCanvas->setLayers(m_layers);//设置图层集合
    m_mapCanvas->setVisible(true);//设置是否可见
    m_mapCanvas->freeze(false);//设置是否冻结对图层的操作
    m_mapCanvas->refresh();//刷新
}

添加栅格图层:

QList<QgsMapLayer *> m_layers;

//添加栅格数据按钮槽函数
void MainWindow::addRasterlayers()
{
    //步骤1:打开文件选择对话框
    QString filename=QFileDialog::getOpenFileName(this,tr("打开栅格数据"),"","remote sensing image(*.tif *.tiff);;image(*.jpg *.jpeg *.png *.bmp)");
    if(filename.isNull())//如果未选择文件则返回
        return;

    QFileInfo fi(filename);
    QString basename=fi.baseName();//获取栅格数据名称
    //步骤2:创建QgsRasterLayer类
    QgsRasterLayer*  rasterLayer=new QgsRasterLayer(filename,basename,"gdal",false);
    if(!rasterLayer->isValid())//如果图层不合法
    {
        QMessageBox::critical(this,"error","图层无效!");
        return;
    }
    //步骤3:注册添加栅格数据,并个并添加到画布中
    QgsMapLayerRegistry::instance()->addMapLayer(rasterLayer);
    m_layers.append(rasterLayer);
    m_mapCanvas->setExtent(rasterLayer->extent());//设置显示范围。Extent:范围、尺度
    m_mapCanvas->setLayerSet(m_layers);//设置图层集合
    m_mapCanvas->setVisible(true);//设置是否可见
    m_mapCanvas->freeze(false);//设置是否冻结对图层的操作
    m_mapCanvas->refresh();//刷新
}

绑定几个信号:

m_mapCanvas = new QgsMapCanvas();
//坐标改变
connect(m_mapCanvas, &QgsMapCanvas::xyCoordinates, this, &MainWidow::slotXyCoordinates);

//比例尺改变
connect(mapCanvas, &QgsMapCanvas::zoomLastStatusChanged,
						this, &MainWidow::slotZoomLastStatusChanged);


void MainWidow::slotXyCoordinates(const QgsPointXY &p)
{
	QString str = QString("经度= %1,纬度=%2").arg(QString::number(p.x(), 'f', 6)).arg(QString::number(p.y(), 'f', 6));
	this->statusBar()->showMessage(str);
}


void MainWidow::slotZoomLastStatusChanged(bool)
{
	//qDebug() << "pre zoom = " << preScale;
	//qDebug() << "cur zoom = " << m_canvas->scale();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

灬Sunnnnn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值