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.lib、Qt5Widgets.lib、qgis_core.lib、qgis_app.lib、qgis_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();
}
由于没找到相关资料,所以我在类的结构上参考了源代码中的DelimitedText和Memory的结构,代码分别位于QGIS源代码根目录下的“providers\delimitedtext”和“src\core\providers\memory”目录下。我们可以看到,这些插件主要继承了QgsVectorDataProvider、QgsProviderMetadata、QgsAbstractDataSourceWidget、QgsProviderGuiMetadata、QgsSourceSelectProvider、QgsAbstractFeatureSource、*QgsAbstractFeatureIteratorFromSource< T >*等。
QgsVectorDataProvider是我们的重点之一,主要负责将矢量文件数据源文件和矢量图层联系起来,文件的读取和要素的改动都通过QgsVectorDataProvider实现。因此我们需要将VCT文件的读写写在这里,后面也可以用代码支持要素的编辑保存。</

最低0.47元/天 解锁文章
166

被折叠的 条评论
为什么被折叠?



