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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM