• QT QGIS 二次开发——基本用法


    QT QGIS 二次开发——基本用法


    1、新建画布

    2、添加矢量图层

    ​ 1、打开矢量图层

    ​ 2、新建矢量图层

    ​ 1、添加几何要素——点

    ​ 2、添加几何要素——线

    3、添加栅格图层

    ​ 1、打开栅格图层

    小demo


    1、新建画布

    /* #include "QgsMapCanvas"
     * class QgsMapCanvas;
     * 继承于QWidget,可以直接当成Widget使用
     */
    QgsMapCanvas* m_canvas = new QgsMapCanvas;  // 实例化画布
    QgsMapToolPan * toolPan = new QgsMapToolPan(m_canvas); // 新建移动工具
    // QgsMapToolZoom * toolZoom = new QgsMapToolZoom(m_canvas,true); // 放大工具
    // m_canvas->setMapTool(toolZoom);
    
    m_canvas->setMapTool(toolPan);  // 将移动工具设置到画布
    m_canvas->freeze(false); // 画布解冻
    m_canvas->setCanvasColor(QColor(255,255,255)); // 设置画布颜色
    m_canvas->setVisible(true); // 设置可见
    m_canvas->enableAntiAliasing(true); // 设置可抗锯齿
    
    QGridLayout * layout = new QGirdLayout(this);
    layout->addWidget(m_canvas); // 显示画布
    

    2、添加矢量图层

    1、打开矢量图层
    QString fileName = QFileDialog::getOpenFileName(this, 
                                                    tr("Open shape file"),
                                                    "",
                                                    "*.shp"); // 选择文件
    QStringList list = fileName.split("/"); // 通过"/" 分隔获取的路径
    QString baseName = list.back(); // 图层名
    
    /* #include "qgsvectorlayer.h"
     * class QgsVectorLayer;
     * 继承 QgsMapLayer
     * @parameter1 要打开的文件
     * @parameter2 图层名称
     * @parameter3 数据提供者的名称,"memory"/"postgres"/...
     */
    QgsVectorLayer * layer = new QgsVectorLayer(fileName,baseName,"ogr"); // 实例化矢量图层类
    if(!layer->isValid()) // 判断图层是否有效
    {
        return;
    }
    QList<QgsMapLayer *> m_layers; // 创建一个容器用于保存图层
    m_layers.append(layer); // 将打开的图层添加到容器
    m_canvas->setLayers(m_layers); // 将容器的中的图层设置到画布
    
    2、新建矢量图层
    1、添加几何要素——点
    /* @parameter1 组成
     * 几何类型:
     * 点 "Point?" 
     * 线 "LineString?"
     * 多边形 "Polygon?"
     * 参照坐标系:
     * "crs=epsg:4326&"
     * 添加字段:
     * "field=id:integer&field=name:string(50)&"
     * 创建索引:
     * "index=yes&" 
     */
    QgsVectorLayer * pointLayer = new QgsVectorLayer("Point?crs=epsg:4326&","MyPoint","memory"); // 实例化矢量图层,作为点图层
    
    pointLayer->startEditing(); // 设置图层状态为开始编辑
    
    /* #include "qgsgeometry.h"
     * class QgsGeometry;
     * 几何类
     */
    QgsGeometry point = QgsGeometry::fromPointXY(QgsPointXY(116.46,39.92)); // 调用静态函数,实例化一个几何点
    /* #include "qgsfeature.h"
     * class QgsFeature;
     * QGis 要素类
     */
    QgsFeature feature; // 创建要素
    feature.setGeometry(point); // 将几何点设置为要素
    feature.setAttributes(QgsAttributes() << QVariant(1) << QVariant("test")); // 设置要素属性
    
    /* #include "qgsvectordataprovider.h"
     * class QgsVectorDataProvider;
     * 继承于 QgsDataProvider(同样继承于此类的还有 QgsRasterDataProvider)
     * 是矢量数据提供者的基类
     */
    QgsVectorDataProvider * provider = pointLayer->dataProvider(); // 获取点图层的数据提供者的指针,用于添加要素
    provider->addFeature(feature); // 将点要素添加到矢量层
    // provider->addFeatures(featureList << feature); // 此方法用于添加多个要素 
    
    pointLayer->commitChanges(); // 保存图层
    pointLayer->updateExtents(); // 更新图层
    
    m_layer.push_front(pointLayer); // 将设置好的图层添加到保存图层的容器中
    
    m_canvas->setExtent(pointLayer->extent()); // 设置画布范围为当前图层的范围,也就是将图层平铺到画布上
    m_canvas->setLayers(m_layer); // 将容器设置到画布
    m_canvas->refresh(); // 刷新画布
    
    2、添加几何要素——线
    /* 添加线的流程和点基本一样
     */
    QgsVectorLayer * pointLayer = new QgsVectorLayer("LineString?crs=epsg:4326","MyPoint","memory"); 
    
    pointLayer->startEditing(); // 设置图层状态为开始编辑
    
    QgsPolyline l; 
    l << QgsPoint(116.2448,40.0573) << QgsPoint(116.2448,80) 
        << QgsPoint(110,80) << QgsPoint(50,50) << QgsPoint(116,40); // 添加若干坐标,组成一条折线
    QgsGeometry line = QgsGeometry::fromPolyline(line); // 调用静态函数,实例化一条折线
    
    QgsFeature feature; // 创建要素
    feature.setGeometry(line); // 将几何折线设置为要素
    feature.setAttributes(QgsAttributes() << QVariant(1) << QVariant("test")); // 设置属性
    
    QgsVectorDataProvider * provider = pointLayer->dataProvider(); // 获取一个用于添加要素的指针
    provider->addFeature(feature); // 将几何点添加到矢量层
    // provider->addFeatures(featureList << feature); // 此方法用于添加多个要素 
    
    pointLayer->commitChanges(); // 保存图层
    pointLayer->updateExtents(); // 更新图层
    
    m_layer.push_front(pointLayer); // 将设置好的图层添加到保存图层的容器中
    
    m_canvas->setExtent(pointLayer->extent()); // 设置画面范围为图层的范围,也就是将图层平铺到画布上
    m_canvas->setLayers(m_layer); // 将容器设置到画布
    m_canvas->refresh(); // 刷新画布
    

    3、添加栅格图层

    1、打开栅格图层
    // 还没写
    

    自己写了个小demo,还没写完,代码:https://cloud.189.cn/t/quyYBvq6fiAb(访问码:4uoh)

    后续更新...

  • 相关阅读:
    关于课程设计、毕业设计的一些总结与思考
    分享一个Panda C-60 维修心得
    未能加载文件或程序集“SuperMap.Data.dll”
    VS2017环境下安装AO10.2的方法
    SQL Server连接错误1326
    VMWare虚拟机中CPU过高的问题
    Apktool编译找不到“keyboardNavigationCluster”
    Aspose.Cells设置单元格格式
    谷歌Chrome浏览器无法安装插件的解决方法
    Global Mapper如何加载在线地图
  • 原文地址:https://www.cnblogs.com/Doyoung/p/13597338.html
Copyright © 2020-2023  润新知