热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

QGIS二次开发新建工程并显示一个图层

一、环境开发环境为VS2019+Qt14,编译器为MSVC【MingW在windows下的动态库为.a文件,但是现成的QGIS动态库是dll的,所以选择MSVC,以免麻烦】配置vs

一、环境

开发环境为VS2019+Qt14,编译器为MSVC【MingW在windows下的动态库为.a文件,但是现成的QGIS动态库是dll的,所以选择MSVC,以免麻烦】

配置vs+qt环境,参考:https://www.cnblogs.com/judes/p/8992231.html

 

二、安装QGIS相关【用于获取桌面版和二次开发依赖包,也可直接下载现成的,见此节末尾】

1、安装桌面版【只是使用Qt开发的一个工具,可以用来玩玩,只要这个工具有的功能,理论上都能通过二次开发QGIS库开发出来】,参考:https://www.cnblogs.com/judes/p/15143756.html

大概熟悉一下,如使用OSM【OpenStreetMap,开源,很多webgis和接口gis都用这个】图层,在线高德图层、谷歌图层、3D、2维....

技术分享图片

 技术分享图片

 技术分享图片

 技术分享图片 

 

2、安装好桌面版之后,需要下载QGIS运行库【后续二次开发所依赖的库】,打开配置工具

技术分享图片

 

 3、按照下图依次下一步

技术分享图片

 技术分享图片

 技术分享图片

 技术分享图片

 技术分享图片 

 技术分享图片 

 这里需要注意下,我最开始按照其他博客选择最后一个,但是下载失败,一直提示license有问题,选择第二个就ok了

技术分享图片

 然后等待下载,会比较慢,我在家里是每秒几百k,大概等了半小时

 

3、下载完成

后面二次开发的依赖就在这里面

技术分享图片

注意:

如果不想自己下载安装这么多东西,也可以直接网上找现成的编译好了的依赖库,我就是这样做的【下文也按照此路径进行配置】,下载来是这样的:

技术分享图片

 跟上面差不多。此外也可以网上找如何对QGIS进行源码编译的方法,是基于CMake的,如果是跨环境估计就得用这方法了。

 

 

三、下载地图瓦片数据

QGIS的瓦片数据类型是shp的,可在此网站下载:http://download.geofabrik.de/,下载下来里面有很多,如建筑、学校、工厂等等,这里做实验随便留一个备用

技术分享图片

 

四、新建工程及环境配置

1、打开vs,新建Qt gui widget工程,源文件如下:

技术分享图片

 

2、右键项目,为项目添加svg和xml的Qt模块

技术分享图片

为啥要加这模块呢,是因为QGis源码里会用到。

 

3、设置附加包目录【头文件目录】

技术分享图片

D:\soft\OSGeo4W64\include 

D:\soft\OSGeo4W64\apps\qgis-ltr\include

 

4、设置附加库目录【lib文件的目录】

技术分享图片

 D:\soft\OSGeo4W64\apps\qgis-ltr\lib

 

5、设置附加依赖项【依赖的dll动态库】

技术分享图片

 qgis_core.lib

 qgis_app.lib 

 qgis_gui.lib

 

6、编译程序生成exe【必须是64位和release,64位是因为要与QGis位数一致】

7、将相关动态库放到exe同一路径,以免运行失败

①、路径1的dll

D:\soft\OSGeo4W64\apps\qgis-ltr\bin

D:\soft\OSGeo4W64\bin

②、路径2的dll

D:\soft\OSGeo4W64\apps\Qt5\bin

③、路径3的文件夹

D:\soft\OSGeo4W64\apps\Qt5\plugins下的整个platforms文件夹

最终可执行文件夹是这样的:

技术分享图片

 注意都要复制,不然后面代码写了也不能运行,会报无dll错误和Qt platforms错误。至此二次开发环境就ok了。

 

五、代码编写

1、qtwidgetsapplication.h


#pragma once
#include

#include
"ui_qtwidgetsapplication.h"
#include

#include

#include

class QtWidgetsApplication : public QMainWindow
{
Q_OBJECT
public:
QtWidgetsApplication(QWidget
*parent = Q_NULLPTR);
private:
Ui::QtWidgetsApplicationClass ui;

QMenu
* fileMenu;
QAction
* openFileAction;
QgsMapCanvas
* mapCanvas;
QList
layers;
public slots:
void on_openFileAction_triggered();
//

public:
void addVectorLayer();
};

2、qtwidgetsapplication.cpp


#include "qtwidgetsapplication.h"
#include

#include

#include

#include

QtWidgetsApplication::QtWidgetsApplication(QWidget
*parent)
: QMainWindow(parent)
{
ui.setupUi(
this);
this->resize(600, 400);
// create the menus and then add the actions to them.
fileMenu = this->menuBar()->addMenu("File");
openFileAction
= new QAction("Open", this);
this->connect(openFileAction, SIGNAL(triggered(bool)), this, SLOT(on_openFileAction_triggered()));
fileMenu
->addAction(openFileAction);
// initialize the map canvas
mapCanvas = new QgsMapCanvas();
this->setCentralWidget(mapCanvas);
mapCanvas
->setCanvasColor(QColor(255, 255, 255));
mapCanvas
->setVisible(true);
mapCanvas
->enableAntiAliasing(true);

}
void QtWidgetsApplication::on_openFileAction_triggered()
{
addVectorLayer();
}
void QtWidgetsApplication::addVectorLayer()
{
QString fileName
= QFileDialog::getOpenFileName(this, tr("Open shape file"), "", "*.shp");
//QString fileName = QFileDialog::getOpenFileName(this, tr("Open shape file"), "", "*");
QStringList temp = fileName.split(/);
QString basename
= temp.at(temp.size() - 1);
QgsVectorLayer
* vecLayer = new QgsVectorLayer(fileName, basename, "ogr");
if (!vecLayer->isValid())
{
QMessageBox::critical(
this, "error", QString("layer is invalid: \n") + fileName);
return;
}
mapCanvas
->setExtent(vecLayer->extent());
layers.append(vecLayer);
mapCanvas
->setLayers(layers);
mapCanvas
->refresh();
}

3、main.cpp


#include "qtwidgetsapplication.h"
#include

#include

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QtWidgetsApplication w;
w.show();
return a.exec();
}

原理就是在mainwindow里,增加一个点击action,点击后打开shp文件,并将文件存到内存里,然后依次绘制到画布中。

技术分享图片

 


推荐阅读
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 在project.properties添加#Projecttarget.targetandroid-19android.library.reference.1..Sliding ... [详细]
  • 如何去除Win7快捷方式的箭头
    本文介绍了如何去除Win7快捷方式的箭头的方法,通过生成一个透明的ico图标并将其命名为Empty.ico,将图标复制到windows目录下,并导入注册表,即可去除箭头。这样做可以改善默认快捷方式的外观,提升桌面整洁度。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 本文介绍了关于apache、phpmyadmin、mysql、php、emacs、path等知识点,以及如何搭建php环境。文章提供了详细的安装步骤和所需软件列表,希望能帮助读者解决与LAMP相关的技术问题。 ... [详细]
author-avatar
PHPSM
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有