QGIS学习之-环境搭建

QGIS插件开发(一) —— 入门篇 QGIS插件开发(一) 阅读详情

1.从OSGeo4w获取开发包

2.自己编译

编译的博客一大推,不再啰嗦,要有耐心 要有耐心 要有耐心 重要的事情说3遍。


开发环境: QtCreator

1.首先将设置QtCreator编译器,如果是下载的,目前官方使用的是Qt4.8.5编译的,所以应设置qmake路径类似:E:\OSGeo4W64\bin\qmake

2.设置导出宏 由于下载的开发包内并未定义,所以在pro文件中加入下面的定义

DEFINES += GUI_EXPORT=__declspec(dllimport)

DEFINES += ANALYSIS_EXPORT=__declspec(dllimport)
DEFINES += CORE_EXPORT=__declspec(dllimport)
3.修改QApplication 为   QgsApplication a(argc, argv, true);

设置完成后就可以开发了,注意下载的开发包是release版本,所以要使用release编译,至于调试有很多种方式,qDebug()输出,输出日志,再有附加到进程。我一遍喜欢使用附加到进程。

a.设置插件路径:   

    QString myPluginsDir        = "E:\\OSGeo4W64\\apps\\qgis-ltr\\plugins";
    QString myLayerPath         = "F:\\Work\\ScDzsp\\data\\hg\\gk-SK.shp";
    QString myLayerBaseName     = "test";//图层名称
    QString myProviderName      = "ogr";//data provider 
    QgsProviderRegistry::instance(myPluginsDir);

b.重写画布:
头文件:
#ifndef SCMAPCANVAS_H
#define SCMAPCANVAS_H
#include "SCVectorLayer.h"
#include <qgsmapcanvas.h>
#include <QList>
#include <QWidget>
class QgsMapCanvas;
class SCVectorLayer;
class SCMapCanvas :public QgsMapCanvas
{
    Q_OBJECT
public:
    SCMapCanvas(QWidget *parent = NULL);
    void addVectorLayer(const SCVectorLayer &vectorLayer, const QString &layerName, bool bVisible = true);
    void setCanvasColor(const QColor &color);
    void updateLayer();
    void clearCache();
    void setLayerVisible(const QString &layerName);
    void addMark(const QString &name);
protected:
    //void mouseReleaseEvent(QMouseEvent *ev);
private:
    QMap<QString, QgsMapLayer *> m_nameLayers;
    QList <QgsMapCanvasLayer> m_layers;
};
#endif // SCMAPCANVAS_H

源文件:
#include "SCMapCanvas.h"
#include "SCVectorLayer.h"
#include <qgsvectorlayer.h>
#include <qgsmaplayerregistry.h>
#include <qgsgeometry.h>
#include <QVBoxLayout>
SCMapCanvas::SCMapCanvas(QWidget *parent):QgsMapCanvas(parent)
{
}
void SCMapCanvas::addVectorLayer(const SCVectorLayer &vectorLayer, const QString &layerName, bool bVisible)
{
    QgsMapCanvasLayer mapLayer(vectorLayer.vectorLayer(), bVisible);
    m_layers.append(mapLayer);
    QgsMapLayerRegistry::instance()->addMapLayer(vectorLayer.vectorLayer(), true);
    setExtent(vectorLayer.vectorLayer()->extent());
    m_nameLayers[layerName] = vectorLayer.vectorLayer();
    if(bVisible)
        setLayerVisible(layerName);
}
void SCMapCanvas::setCanvasColor(const QColor &color)
{
    QgsMapCanvas::setCanvasColor(color);
}
void SCMapCanvas::updateLayer()
{
    QgsMapCanvas::setLayerSet(m_layers);
    QgsMapCanvas::refreshAllLayers();
}
void SCMapCanvas::clearCache()
{
    QgsMapCanvas::clearCache();
}
void SCMapCanvas::setLayerVisible(const QString &layerName)
{
    QgsMapCanvas::setCurrentLayer(m_nameLayers[layerName]);
}

为了方便操作图层也重写下:
头文件:
#ifndef SCVECTORLAYER_H
#define SCVECTORLAYER_H
#include <QObject>
#include <qgspallabeling.h>
class QgsVectorLayer;
class QgsSvgMarkerSymbolLayerV2;
class SCVectorLayer : public QObject
{
    Q_OBJECT
public:
    SCVectorLayer( const QString& path, const QString& baseName,
                   const QString& providerLib, const QString&iconPath, int iconSize = 10, bool loadDefaultStyleFlag = true );
    void setPalLayerSettings(QgsPalLayerSettings &settings);
    QgsVectorLayer *vectorLayer() const;
    static QgsPalLayerSettings defaultPalLayerSettings();
private:
    QgsVectorLayer * m_pVectorLayer;
    QgsSvgMarkerSymbolLayerV2* m_pSvgMarker;
};
#endif // SCVECTORLAYER_H
源文件:#include "SCVectorLayer.h"
#include <qgsvectorlayer.h>
#include <qgssymbollayerv2.h>
#include <qgssimplifymethod.h>
#include <qgssymbollayerv2.h>
#include <qgssymbolv2.h>
#include <qgsmarkersymbollayerv2.h>
#include <qgsvectorlayerrenderer.h>
#include <qgsrendercontext.h>
#include <qgssinglesymbolrendererv2.h>
#include <qgssymbollayerv2.h>
SCVectorLayer::SCVectorLayer(const QString &path, const QString &baseName, const QString &providerLib, const QString&iconPath, int iconSize,bool loadDefaultStyleFlag)
{
    //创建图层
    m_pVectorLayer = new QgsVectorLayer(path, baseName, providerLib, loadDefaultStyleFlag);
    //设置图层图标
    m_pSvgMarker = new QgsSvgMarkerSymbolLayerV2(iconPath, iconSize, 0);
//    m_pSvgMarker->setPath(iconPath);
//    m_pSvgMarker->setSize(iconSize);
    //解释器
    QgsSymbolLayerV2List symList;
    symList.append( m_pSvgMarker );
    QgsMarkerSymbolV2* markSym = new QgsMarkerSymbolV2( symList );
    QgsSingleSymbolRendererV2* symRenderer = new QgsSingleSymbolRendererV2( markSym );
    m_pVectorLayer->setRendererV2( symRenderer );
}
void SCVectorLayer::setPalLayerSettings(QgsPalLayerSettings &settings)
{
    settings.fieldName = m_pVectorLayer->pendingFields()[3].name();
    settings.writeToLayer( m_pVectorLayer ); // 将配置写入图层
}
QgsVectorLayer *SCVectorLayer::vectorLayer() const
{
    return m_pVectorLayer;
}
QgsPalLayerSettings SCVectorLayer::defaultPalLayerSettings()
{
    QgsPalLayerSettings layerSettings;
    layerSettings.enabled = true;
//    layerSettings.fieldName = mypLayer->pendingFields()[3].name(); // 设置Label图层
    layerSettings.centroidWhole = true; // 设置位置参考的中心点
    // Label 字体设置
    layerSettings.textColor = QColor( 0, 0, 0 ); // 设置字体颜色
    layerSettings.textFont = QFont( "Times", 12 ); // 设置字体和大小
    // Label 轮廓buffer设置
    layerSettings.bufferDraw = true;
    layerSettings.bufferColor = QColor( "gray"); // 轮廓buffer的颜色
    layerSettings.bufferSize = 1; // 轮廓buffer大小
    layerSettings.bufferTransp = 0.8; // 轮廓buffer的透明度
    // Label 阴影绘制
    layerSettings.shadowDraw = true;
    layerSettings.shadowOffsetAngle = 135; // 阴影的角度
    layerSettings.shadowOffsetDist = 1; // 阴影与Label的距离
    return layerSettings;
}
3. 具体使用
SCVectorLayer layer(myLayerPath, myLayerBaseName, myProviderName, "F:\\1.svg");
    layer.setPalLayerSettings(SCVectorLayer::defaultPalLayerSettings());
     myLayerPath         = "F:\\Work\\ScDzsp\\data\\hg\\fkddfsjd-SK.shp";
    SCVectorLayer layer2(myLayerPath, myLayerBaseName, myProviderName, "F:\\2.svg");
    layer2.setPalLayerSettings(SCVectorLayer::defaultPalLayerSettings());
    myLayerPath         = "F:\\Work\\ScDzsp\\data\\hg\\kjjd-SK.shp";
   SCVectorLayer layer3(myLayerPath, myLayerBaseName, myProviderName, "F:\\3.svg");
   layer3.setPalLayerSettings(SCVectorLayer::defaultPalLayerSettings());
    SCMapCanvas *mapCanvas= new SCMapCanvas(this);
    mapCanvas->clearCache();
    mapCanvas->addVectorLayer(layer, "layer");
    mapCanvas->addVectorLayer(layer2, "layer2");
    mapCanvas->addVectorLayer(layer3, "layer3");
    mapCanvas->setCanvasColor(QColor(127, 127, 127));
    mapCanvas->updateLayer();
    this->setCentralWidget(mapCanvas);


栅格图层跟矢量图层类似不在啰嗦

Qt开发QGIS配置 QT开发QGIS的配置与Visual Studio 2015开发QGIS的配置步骤相似。最大不同在于:Visual Studio 2015在设置中配置,QT在其pro文件中配置。 Qt和QGIS安装见这里。 1. 创建Qt项目 根据自己的需求创建新Qt项目并运行生成exe文件。 2. 修改pro文件 将自己的pro文件改为如下内容,其中所有目录都需要根据自己的实际情况进行修改。 # 增加xml和3dcore(3d显示) QT += core gui xml 3dcore greaterThan 阅读详情

相关推荐

QGis二次开发(一)环境搭建

qgis二次开发 一、下载 二、基本步骤 三、遇到的问题 //#include "dierci.h" #include <QtWidgets/QApplication> #include "dierci.h" #include <qgsapplication.h> #include <qgsproviderregistry.h> #include <qgsmapcanvas.h> #include <qgsvectorlayer.h> #inclu

zhanghongxia1111的博客 2476

QGIS插件开发详细教程

为了提高生产力,接触到了QGIS插件开发。从相关的知识准备,到实际插件开发,断断续续大约花了一周的时间,最后也算是实现了自己的目的,感觉有必要记录一下其中遇到的坑。 1 知识准备 进行QGIS插件开发,总体上需要两个方面的知识储备 熟悉QGIS提供的各种类库和函数接口 这方面最好的资料是官方文档,内容详细而且比较有条理。如果以后经常接触到QGIS二次开发的话,建议吧整个文档好好看一遍,如果时间有限,也可以根据自己的需要有针对性的阅读 了解PyQt的基本使用 QT是C++编写的跨平台GUI库,PyQt

TJLCY的博客 1万+

利用QGIS进行图像预处理的初步学习

通过无人机获取农田高分辨率多光谱/可见光影像,利用QGIS与Python完成影像预处理(几何校正、辐射校正、拼接裁剪),提取农学关键指标(如NDVI、叶面积指数LAI),构建机器学习模型实现作物类型分类、长势评估及病虫害监测。安装Anaconda,配置PyQGIS、GDAL、scikit-learn、rasterio、opencv等库;传感器:至少包含红(Red)、绿(Green)、蓝(Blue)、近红外(NIR)波段。在QGIS中标注训练样本(如玉米、小麦、裸土),导出为CSV;

yunhe0426的博客 1270

QGIS 开发初级《构建插件工程》

新建QGIS 插件工程

zhangiser的专栏 2185

【学习笔记-QGIS】 QGIS从零快速上手

安装文章参考:https://zhuanlan.zhihu.com/p/370633306。

Xcong_Zhu的博客 1万+

VS2019+QGIS开发库二次开发环境搭建

VS2019+QGIS开发库二次开发环境搭建 总共分为以下步骤: 下载qgis和二次开发库 VS2019搭建开发环境 配置VS2019中的Qt插件 配置完Qt版本后对工程属性进行配置 编写测试代码 运行测试代码 拷贝运行程序需要用的动态库文件 1. 开发环境 Win10 ×64 VS2019 OSGeo4W 2. 下载qgis二次开发SDK 打开osgeo4w-setup-x86_64.exe后 1.选择advanced install[外链图片转存失败,源站可能有防盗链机制,建议将图片

matatabimori的博客 8502

【计划】QGIS学习计划及进度

对于推延症晚期患者,还是写个计划吧,即使起不到激励自己,也能方便将来恢复现场。 根据学习进度随时更新。单位采购了套数据管理系统,比较专业的数据,需要地图显示和操作,支持地理信息数据,不够通用(但貌似现在都在搞啊)。C/S + B/S架构吧,以C/S为主。C/S端的S只运行了一个PostgreSQL服务,C端是管理的,C++开发,GIS部分目测是基于ArcGIS的。 功能是挺多的,但由于使用范围小,没办法进行大范围测试,BUG也不少。而且软件也不是专门针对我们需求开发的,而是在一个以前成型产品上改的,所以流程

microbaby233的专栏 245

VS2019+QT5.15.2+QGIS二次开发环境搭建

VS2019+QT5.15.2+QGIS二次开发环境搭建 1.开发环境 VS2019+QT5.15.2+QGIS 注意,QT 平台的版本与qgis下载的版本有关,以前采用OSGeo4w64来下载qgis时会区分32和64位,但现在官网已经不再区分。 如果下载qgis-ltr(官网的长期支持版,qgis 2.18),那么建议qt采用5.0以下的版本; 如果下载qgis 是3.0版本以上,个人建议qt版本,下载高于qt5.9.2; 另外如果是使用VS2013,那么不能编译qgis3.0版本以上的,c++11个部

qq_44894692的博客 7046

【免费下载】 QGIS二次开发:实现多图层显示与切换

在地理信息系统(GIS)开发过程中,经常会遇到需要管理多个图层的场景。本资源文件旨在介绍如何在QGIS3.28环境下,结合Visual Studio 2017进行二次开发,实现图层的动态加载、显示以及实时切换功能。 ## 资源描述 本教程将指导您如何创建一个用户界面,界面左侧为图层列表,展示所有已加载的图层,并可通过复选框控制每个图层的显示或隐藏。界面右侧为显示画布,它会按照图层列表中的顺序展...

gitblog_06778的博客 1086

Qt下开发基于QGIS的应用程序

Qt5.12.12,VS2015编译器,QGIS3.10.1

gongfuyd的博客 5158

QT5.12.6+QGIS3.10二次开发(Qtcreater)(一)环境搭建

QT5.12.6+QGIS3.10二次开发(Qtcreater)环境搭建 一、前言 QtCreater的编译模式有msvc和mingw两种,msvc调用的第三方库是.lib结尾的,而mingw调用的库是.a结尾的。在windows下下载的QGIS开发包中的库文件是.lib库,所以,在QtCreater中直接使用下载的QGIS库只能采用msvc编译模式(至于mingw下调用.lib库比较麻烦,而且容易出各种问题,在此不做深入讨论),本文主要说明使用msvc编译模式下的环境搭建方法。 准备工作: 下载vs_C

qfl_sdu的博客 7259

QGIS(PYTHON3.5、QT5.7.1、QGIS3)系列二次开发环境

QGIS(PYTHON3.5、QT5.7.1、QGIS3系列二次开发环境,所有环境以虚拟机方式提供,以便研究或直接使用。 具体包括:独立应用二次开发环境(WINDOWS,LINUX);android二次开发;独立应用PYTHON二次开发环境(WINDOWS,LINUX);插件开发环境(PYTH...

chenren3227的博客 572

【QGIS学习】01.QGIS之初体验—环境部署

在使用QGIS二次开发时,最重要的两个类就是界面类和程序类。其中界面类继承自QWidget,例子中的QGISTest继承自,而继承自QWidget。主界面设计可以在Qt Desinger中进行,生成C++代码后,然后在VS中编写功能。程序类继承自,而QGIS中继承编写了,这应该作为将来二次开发的程序类基类,主要用于初始化参数。

microbaby233的专栏 1104

QGIS源码编译详细文档:开源GIS编译利器,助你轻松掌握QGIS编译

QGIS源码编译详细文档:开源GIS编译利器,助你轻松掌握QGIS编译 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 QGIS源码编译详细文档,这是一份专为开源地理信息系统QGIS打造的源码编译指南。QGIS作为一款功能强大的地理信息系统软件,其开源特性使其受到全球开发者和地理信息爱好者的广泛应用。本文档详细记录了编译QGIS源码的整个过程,从环境搭建到编译完成,为开...

gitblog_06781的博客 630

车载导航测试,面试常见问题

车载导航测试是汽车软件测试的重要组成部分,涉及验证导航系统的功能、性能、可靠性和用户体验。在面试中,面试官通常会考察候选人的测试思维、问题解决能力和实际经验。以下我将从常见问题类别入手,逐步介绍面试中的高频问题,并提供结构化分析。通过以上结构化准备,你能在面试中自信应对车载导航测试相关问题。用户体验测试关注界面友好性和交互流畅性,安全测试则涉及功能安全和数据隐私。功能测试聚焦于导航核心功能的正确性,如路线规划、位置定位和地图显示。面试官会考察你如何识别、报告和跟踪缺陷,以及熟悉测试工具。

m0_69889939的博客 527

腾讯地图自定义瓦片地图开发实战:从坐标定位到图层融合

本文详细介绍了腾讯地图自定义瓦片地图开发的全流程,从坐标定位到图层融合的实战技巧。通过具体代码示例和常见问题解决方案,帮助开发者快速掌握腾讯地图API的自定义瓦片功能,实现室内外地图的无缝衔接和特殊图层的叠加展示。

weixin_42526015的博客 171

QGIS Python插件开发环境搭建--QGIS3.34.11+PyCharm

使用pyCharm打开自己的插件目录,例如:C:\Users\Administrator\AppData\Roaming\QGIS\QGIS3\profiles\default\python\plugins\myplugin。我的插件目录为(仅供参考):C:\Users\Administrator\AppData\Roaming\QGIS\QGIS3\profiles\default\python\plugins。选择插件模板,默认选择第一个,设置插件添加到哪个菜单下,这里默认添加在“

xueshanyinshi的博客 5665

测站坐标系统 -- 东北天(ENU)坐标系、站心坐标系

测站坐标系统以观测站(或地面上某一个观测点为中心建立坐标系统,将这类坐标系称为测站坐标系统。测站坐标系通常以用户所在的位置点P为坐标原点三个坐标轴分别是相互垂直的东向北向和天向,因而测站坐标系又称为东北天(ENU)坐标系。由于测站坐标系以站心为坐标原点,因此也称为站心坐标系。如图所示,测站坐标系的天向与大地坐标系(LLA经纬度坐标系)在此点的高程方向一致。测站坐标系固定在地球上,本质上是一种地固坐标系。(1)以站心为坐标原点。(2)Z轴与站心点的椭球法线重合,向上为正。

qq_43381998的博客 1万+

QT(5.12)+Qgis(3.10)开发环境搭建(QT Creator)

最近要倒腾一下Qgis和QT的二次开发,感觉是一个全新的领域,预计会有不少坑,而且做的过程中感觉资料也不多,于是想着要不顺手记录下来过程吧~ 网上看了几个适合的教程: 1: 最后是靠知乎大哥王峰dev的文章下成功搭建环境的,文章总结了这个环境搭建的核心:dll文件的配置。附上链接: QtCreator进行QGis二次开发(1) - 王峰dev的文章 - 知乎https://zhuanlan.zhihu.com/p/83805300 QT Creator安装 这个就直接装就好了。没有什么难度和坑。 Qgis二

j_in2018的博客 1万+

【OpenCV】手眼标定实战:从原理到calibrateHandEye的完整实现

本文详细解析了机器人视觉中的手眼标定原理与实战,重点介绍了如何使用OpenCV的calibrateHandEye函数实现从数据采集到结果验证的完整流程。文章深入剖析了AX=XB核心方程,区分了眼在手上与眼在手外两种配置,并提供了详细的代码示例与避坑指南,帮助开发者精准建立相机与机械臂末端的坐标转换关系,是机器人精准抓取的关键技术。

weixin_29046611的博客 508

离散数学 --- 图论基础 --- 图的同构,通路与回路,可达性与最短通路

同一个图(这里的图是抽象的数学定义)可以有不同的图形表示方法1.重数:两点之间的平行边的个数1.得到 n!的过程,一个图中的一个结点在另一个图中对应的结点有n种可能(黄框中定义的图来讨论),这个对应好后下一个结点有 n - 1 种可能,再下一个有n-2种,直到最后一个为1,所有可能的结果就等于 n * (n - 1) *(n - 2)*....*1 = n!2.虽然说找对应结点很困难,但不是没有规律可循的。比如1.两个相互对应的结点的度数要相同;

qq_51947882的博客 7440

QGIS开发笔记(三):Windows安装版二次开发环境搭建(下):将QGis融入QtDemo,添加QGis并加载tif遥感图的Demo

上半部分:主要是安装好后,使用QtCreator可以使用QGIs的apps下的Qt使用对应的编译器编译不带qgis的空工程。下半部分:在上半部分基础上添加qgis的依赖,并实现一个qgis的完全独立模模块化的应用,让没有安装qgis库的使用工程模板可以开始二次开发编译。未定义M_Pi添加最终,添加了win32下自动copy的脚本。

长沙红胖子 Qt・西安|省级科研团队从业背景,深耕双一流体系高精尖技术配套研发|剥离高精尖机理,沉淀高端特种行业领域 Qt 工程化落地经验|博文仅分享通用技术总结,输出公开普适工程思路。 1万+

【测开求职】面试题:数据结构 吐血整理

本篇文章是笔者为准备研究生复试以及校招而写,因此主要针对问答,注重理解,而不在于细节计算。涵盖考研范围内的所有知识内容,读者可以先查看上面的链接走一遍数据结构的整体框架结构。其中,重点难点以及易混淆的知识点,笔者用其他近30篇文章进行了详述,在知识点处贴好了链接,有需要的可以查阅。

vector的博客 7065

1. qgis二次开发环境搭建(qgis-3.28.6+qt5.15)

本文介绍了QGIS二次开发环境的搭建,完成了以下工作ubuntu22.04下,QGIS3.28.8编译ubuntu22.04下,使用QCreator调试QGIS3.28.8ubuntu22.04下,新建工程,引入编译好的QGIS库,并成功调用Qgis::releaseName()Windows10下,安装QGIS以及Release开发库Windows10下,新建工程,引入QGIS库,并成功调用Qgis::releaseName()QGIS3.28.8下载地址。

qq_35662333的博客 1496

2.4 提示词优化

我们在使用大模型的时候,同一任务使用不同表述的提示词,可能得到差异巨大的结果,因为模型的性能高度依赖输入提示词的质量。我们可以通过提示词优化来更高效地获取理想输出。

从0到1,突破自己 1010

智能车图像处理2-入门级分析1 ---基础扫线

PS :入门级文章适合新手,如果已经有基础可以去看进阶篇文章。

taiyuezyh的博客 7747
上一篇: OSG中使用Qt做界面
下一篇: QGIS学习之-显示SVG图片
很菜但努力
博客等级 码龄17年 113粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值