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();
}