zoukankan      html  css  js  c++  java
  • 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();
    

  • 相关阅读:
    php.ini中设置session过期时间
    IP(Internet Protocal) 地址 说明
    html年月日下拉联动菜单 年月日三下拉框联动
    使用数组的键值,做为变量名的方法
    html中js只允许输入数字
    阿里云服务器问题攻略
    小帆远行
    Android图片转换类 1. Bitmap去色,转换为黑白的灰度图, 2. Bitmap图片加圆角效果
    EditText禁止输入回车
    Android之系统自带的文字外观设置
  • 原文地址:https://www.cnblogs.com/man-bu/p/13679324.html
Copyright © 2011-2022 走看看