QT下Qgis的简单使用

1、使用类QgsMapCanvas创建画布

   QgsMapCanvas * canvas = new QgsMapCanvas;
   canvas->setCanvasColor(Qt::white);//设置画布颜色
   canvas->enableAntiAliasing(true);//启用抗锯齿
   canvas->setExtent(vlayer->extent());//设置图层范围 vlayer矢量图层
   canvas->setLayers(vLayer);//设置图层集合
   canvas->setVisible(true);//设置是否可见
   canvas->freeze(false);//设置是否冻结对图层的操作
   canvas->refresh();//刷新
   canvas->show();//显示

2、创建图层 (矢量图层类:QgsVectorLayer)(栅格图层类:QgsRasterLayer)

QString path = "multiPoint?";
// 几何类型,"point", "linestring", "polygon", "multipoint","multilinestring","multipolygon"	
path.append( QString( "crs=EPSG:4326&")); //参照坐标系	
path.append( QString( "field=id:integer&field=name:string(50)&")); //添加字段属性
path.append( QString( "index=yes&" )); // 创建索引
path.append( QString( "memoryid=%1").arg(QUuid::createUuid().toString())); // 临时编码
//创建矢量图层
QgsVectorLayer *vLayer = new QgsVectorLayer(path,"MyPoint","memory");

3、使用类QgsFeature在图层中加入点

//创建一个点图层
QgsVectorLayer *point = new QgsVectorLayer("Point?crs=epsg:4326","MyPoint","memory");
//创建一个容器
QgsVectorDataProvider * dataProvider = point->dataProvider();
//创建一个要素
QgsFeature MyFeature;
//设置在地图的插入点的坐标
MyFeature.setGeometry(QgsGeometry::fromPointXY(QgsPointXY(116.3215,39.5416)));
dataProvider->addFeatures(QgsFeatureList()<<MyFeature);

4、根据id在图层中删除要素

QgsVectorLayer planeLayer = new QgsVectorLayer("Point?crs=epsg:4326","MyPoint","memory");
//启用编辑
planeLayer->startEditing();
planeLayer->deleteFeature(QgsFeatureId(对应id));
planeLayer->updateExtents();
//提交planeLayer
planeLayer->commitChanges();

5、使用渲染器设置图层中点的样式(QgsSingleSymbolRenderer单一渲染器)

//Constructs SVG marker symbol layer with picture from given absolute path to a SVG file(把点修改成该图像的样式)
QgsSvgMarkerSymbolLayer *svgMarker = new QgsSvgMarkerSymbolLayer("D:\QGIS3.10.8\apps\qgis-ltr\svg\gpsicons/plane.svg");
svgMarker->setColor(QColor(0,0,0));
svgMarker->setSize(10);
svgMarker->setAngle(0);

QgsSymbolLayerList symlist;
symlist.append(svgMarker);
QgsMarkerSymbol *markSym = new QgsMarkerSymbol(symlist);
QgsSingleSymbolRenderer * symRendere = new QgsSingleSymbolRenderer(markSym);
vLayer->setRenderer(symRendere);//valyer是想要修改的点图层

使用渲染器把点改变成飞机形状

6、在图层中添加线

// 创建一个图层。
QgsVectorLayer *Line_Layer = new QgsVectorLayer("LineString?crs=epsg:4326","MyLine","memory");
QgsVectorDataProvider *dataProder =Line_Layer->dataProvider();
//在指定坐标添加点
QgsFeature feature;
QgsGeometry geometry = QgsGeometry::fromPointXY(QgsPointXY(50,50));
//通过点坐标进行画线
QgsPolyline line ;
line << QgsPoint(100.4443,32.2123) << QgsPoint(130.5557,50.4445);
geometry =QgsGeometry::fromPolyline(line);
feature.setGeometry( geometry );
dataProder->addFeatures(QgsFeatureList()<< feature);
Line_Layer->updateExtents();

7、转换点的坐标系

    //两种方式都可
   //用来查询当前数据库路径 需要将qgis中的srs.db数据库放到对应目录下
   // qDebug() <<  QgsApplication::srsDatabaseFilePath();
   // qDebug() << QgsApplication::qgisUserDatabaseFilePath();
#if 1
    QgsCoordinateReferenceSystem crsSrc; crsSrc.createFromSrid(4326); //源坐标系 Sets this CRS by lookup of the given PostGIS SRID in the CRS database.
    QgsCoordinateReferenceSystem crsDest; crsDest.createFromSrid(3857); //目的坐标系
#else
    QgsCoordinateReferenceSystem * crsSrc = new QgsCoordinateReferenceSystem("EPSG:4326");
    QgsCoordinateReferenceSystem * crsDest = new QgsCoordinateReferenceSystem("EPSG:3857");
#endif
    QgsCoordinateTransformContext transformContext = QgsProject::instance()->transformContext();
    QgsCoordinateTransform * xform =new QgsCoordinateTransform(crsSrc, crsDest, transformContext);
    QgsPointXY myPoint = QgsPointXY(longitute,latitude);
    QgsPointXY  pt1 = xform->transform(myPoint);

8、在图层中添加字段,并且根据图层中已有的要素id为其设置属性

    //创建图层
    QgsVectorLayer alarmLayer = new QgsVectorLayer("Point?crs=epsg:4326","alarmLayer","memory");
    //添加字段
    alarmLayer->startEditing();
    QgsField *filed = new QgsField(QStringLiteral("频率"), QVariant::String);
    if (alarmLayer->addAttribute(*filed))
    {
        qDebug() << QStringLiteral("字段添加成功");
    }
    alarmLayer->commitChanges();
    //根据id添加属性
    alarmLayer->startEditing();
    alarmLayer->changeAttributeValue(id, field, attribute);
    alarmLayer->commitChanges();

9、使用标签,在图层中显示某一字段的属性

    QgsVectorLayer * vLayer = new QgsVectorLayer("D:/MyProject/QgisDemo1/MSCities_Geo_Pts.shp", "Cities", "ogr");
    //文本缓冲区设置
    QgsTextBufferSettings * bufSettings = new QgsTextBufferSettings;
    bufSettings->setEnabled(true);//启用文本缓冲区
    bufSettings->setSize(1);//设置缓缓冲区大小
    bufSettings->setColor(QColor("white"));
    //文本样式设置
    QgsTextFormat * textFormat = new QgsTextFormat;
    textFormat->setFont(QFont("Arial", 12));
    textFormat->setSize(12);
    textFormat->setBuffer(*bufSettings);//设置文本缓冲区
    //图层属性设置
    QgsPalLayerSettings *lSettings = new QgsPalLayerSettings;
    lSettings->setFormat(*textFormat);//设置标签文本格式
    lSettings->fieldName = "NAME10";//要显示的字段名
    lSettings->placement = QgsPalLayerSettings::Placement::Line;//设置标签样式
//    lSettings->geometryGeneratorEnabled = true;//启用几何生成器
    //创建label标签
    QgsVectorLayerSimpleLabeling * LSsettings = new QgsVectorLayerSimpleLabeling(*lSettings);

    vLayer->setLabelsEnabled(true);//该图层启用label标签
    vLayer->setLabeling(LSsettings);//设置标签配置
    vLayer->triggerRepaint();

原文地址:https://www.cnblogs.com/man-bu/p/13679324.html