QGIS的数据格式拓展插件开发

QGIS的数据格式拓展插件开发

​ VCT格式是我国在《地理空间数据交换格式》这一国家标准文件中制定的矢量数据交换格式。国产的GIS软件一般有对VCT格式的支持,但是在QGIS等国际GIS上支持较少😓😓。我尝试着在QGIS中通过编写C++插件的方式,增加对VCT格式的支持,🤔🤔🤔途中发现QGIS拓展数据格式的资料还比较少,所以记下一篇博客,如果有理解不到位的地方,还望及时指出。该小项目的代码见Github


1. 环境配置

开发环境:VS 2015

Qt版本:5.11.2

QGIS版本:3.12(下载一份源代码和发行版软件,讲道理可以只下载源代码然后自己编译出debug版本的,写插件时输出应该也更方便,但是我太菜了不懂cmake,编译不出来😢,就拿源代码去看内部原理,然后把插件写好了放进软件里再测试了😂就更加麻烦。​)


​ 首先,我们在VS 2015的菜单栏点击工具->扩展和更新,在拓展和更新窗口的左侧选择菜单中选择联机,然后搜索qt,选择搜索结果中的第一项“Qt Visual Studio Tools”,安装完成后重启VS 2015,可以看到菜单栏已经出现了Qt VS Tools,点击Qt VS Tools->Qt Options,在Qt Versions标签下设置Qt编译器路径,例如,我的就是“C:\Qt\Qt5.11.2\5.11.2\msvc2015”。

​ 设置完成之后,我们新建一个项目,模板是Qt Class Library,因为我们要开发的是一个插件,最后生成的是一个dll文件,而非一个带图形界面的应用。🤔我们点击菜单栏中的项目->属性,在属性页中选择C/C++->常规,选择右侧页面中的附加包含目录,添加QGIS和Qt的库路径,以我为例,路径分别为:

C:\Users\lenovo\Desktop\osgeow\apps\Qt5\include\QtGui

C:\Users\lenovo\Desktop\osgeow\apps\Qt5\include\QtWidgets

C:\Users\lenovo\Desktop\osgeow\apps\Qt5\include\QtXml

C:\Users\lenovo\Desktop\osgeow\apps\Qt5\include\QtCore

C:\Users\lenovo\Desktop\osgeow\apps\qgis\include

C:\Users\lenovo\Desktop\osgeow\include

​ 然后点击属性页中的链接器->常规->附加库目录,添加QGIS的lib文件路径,例如我的:

C:\Users\lenovo\Desktop\osgeow\apps\qgis\lib

​ 点击输入->附加依赖项,添加Qt5Xml.libQt5Widgets.libqgis_core.libqgis_app.libqgis_gui.lib。至此,开发环境的配置就大功告成啦!🎉🎉🎉

2. 技术路线

2.1 基类说明

​ 查看源代码可知,QGIS对数据格式的支持是以拓展插件的方式实现的,打开软件之后,QGIS会通过QgsProviderRegistry类扫描Plugin Path下的所有文件(Plugin Path一般位于QGIS目录下的plugins文件夹),找到其中的数据源插件,即各种dll文件中的QgsVectorDataProvider的继承类。因此我们的思路就是自己继承QgsVectorDataProvider,用于链接矢量图层和VCT文件数据源。

QgsProviderRegistry::QgsProviderRegistry( const QString &pluginPath )
{
  // At startup, examine the libs in the qgis/lib dir and store those that
  // are a provider shared lib
  // check all libs in the current plugin directory and get name and descriptions
  //TODO figure out how to register and identify data source plugin for a specific
  //TODO layer type
#if 0
  char **argv = qApp->argv();
  QString appDir = argv[0];
  int bin = appDir.findRev( "/bin", -1, false );
  QString baseDir = appDir.left( bin );
  QString mLibraryDirectory = baseDir + "/lib";
#endif
  mLibraryDirectory.setPath( pluginPath );
  init();
}

​ 由于没找到相关资料,所以我在类的结构上参考了源代码中的DelimitedTextMemory的结构,代码分别位于QGIS源代码根目录下的“providers\delimitedtext”和“src\core\providers\memory”目录下。我们可以看到,这些插件主要继承了QgsVectorDataProviderQgsProviderMetadataQgsAbstractDataSourceWidgetQgsProviderGuiMetadataQgsSourceSelectProviderQgsAbstractFeatureSource、*QgsAbstractFeatureIteratorFromSource< T >*等。

QgsVectorDataProvider是我们的重点之一,主要负责将矢量文件数据源文件和矢量图层联系起来,文件的读取和要素的改动都通过QgsVectorDataProvider实现。因此我们需要将VCT文件的读写写在这里,后面也可以用代码支持要素的编辑保存。</

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值