之前写了一篇文章关于 QGis开发的 shpfile文件加载。这里我通过mysql连接的方式加载矢量图层。
CMakeLists.txt
cmake_minimum_required(VERSION 3.8.0)
project(QGisSQLConnectDemo)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
SET(QT_USE_QTMAIN TRUE)
find_package(Qt5 COMPONENTS Core Widgets Xml Sql REQUIRED)
set(qgis_path "NOT-FOUND" CACHE PATH "In QGis SDK install path")
if(qgis_path STREQUAL "NOT-FOUND")
message(FATAL_ERROR "need download qgis sdk from Run Geo4w.exe")
endif()
message(STATUS "qgis_path >>${qgis_path}")
set(QGIS_INC "${qgis_path}/include")
set(QGIS_LIB "${qgis_path}/lib")
set(QGIS_BIN "${qgis_path}/bin")
message(STATUS "QGIS_INC >> ${QGIS_INC}")
message(STATUS "QGIS_LIB >> ${QGIS_LIB}")
file(GLOB ALL_LIBS ${QGIS_LIB}/*.lib)
message(STATUS "ALL_LIBS >>${ALL_LIBS}")
include_directories(${QGIS_INC}
F:/OSGeo4W64/apps/Qt5/include)
link_directories(${GIS_LIB})
link_libraries(${ALL_LIBS})
add_definitions(-D_USE_MATH_DEFINES)
aux_source_directory(${CMAKE_SOURCE_DIR} SRC_ALL)
#add_executable(${PROJECT_NAME} WIN32 ${SRC_ALL}) #no console
add_executable(${PROJECT_NAME} ${SRC_ALL} ${ALL_UI}) #no console
target_link_libraries(${PROJECT_NAME} Qt5::Widgets Qt5::Xml Qt5::Sql)
file(WRITE ${CMAKE_BUILD_RPATH}/pathCmd.cmd
"@echo off
set PATH=%PATH%;${QGIS_BIN};F:/OSGeo4W64/apps/Qt5/bin;F:/OSGeo4W64/bin;
${PROJECT_NAME}
echo application begin...
::pause>nul"
)
install(TARGETS ${PROJECT_NAME}
RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/bin
ARCHIVE DESTINATION ${CMAKE_INSTALL_PREFIX}/lib
LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/lib)
install(DIRECTORY ${CMAKE_BUILD_RPATH} DESTINATION ${CMAKE_INSTALL_PREFIX}/bin FILES_MATCHING PATTERN "*.cmd")
main.cpp
#include <qgis.h>
#include <QApplication>
#include <qgis_core.h>
#include <qgis_gui.h>
#include <qgsdatasourceuri.h>
#include <qgsproviderregistry.h>
#include <QDebug>
#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery>
#include <qgssinglesymbolrenderer.h>
#include <qgsapplication.h>
#include <qgsmessagelog.h>
#define pluginsPath "F:\\OSGeo4W64\\apps\\qgis-dev\\plugins"
//using namespace QgsGuiUtils;
int main(int argc, char* argv[])
{
QgsApplication myApp(argc, argv, true);
myApp.setPrefixPath("F:\\OSGeo4W64\\apps\\qgis", true);
QgsProviderRegistry::instance("F:\\OSGeo4W64\\apps\\qgis\\plugins");
QList<QgsMapLayer*> listVecLayer;
QString uri("MySQL:beijing_map,host=192.168.2.205,port=3306,user=root,password=root,tables=testmap|layername=testmap");
QgsVectorLayer sqlVecLayer;
sqlVecLayer.setProviderEncoding("UTF-8");
sqlVecLayer.setDataSource(uri, "beijing_road", "ogr", true);
listVecLayer.append(&sqlVecLayer);
QgsProject::instance()->addMapLayers(listVecLayer);
QgsMapCanvas QGSMC;
QGSMC.setLayers(listVecLayer);
QGSMC.setExtent(sqlVecLayer.extent());
QGSMC.enableAntiAliasing(true);
QGSMC.freeze(false);
QGSMC.setDragMode(QGraphicsView::RubberBandDrag);
QGSMC.setVisible(true);
QGSMC.zoomToFullExtent();
QGSMC.refresh();
QGSMC.show();
return myApp.exec();
}
运行结果
总结
这个demo的使用还是不好找的,无奈不能翻墙,只能必应国际版搜索 "connect mysql from Qgis load vector layer",然后在一个错误求助中找到这个使用方法,最后我打开qgis desktop 找到我界面上链接的数据库链接,进行相应的改变。如下
"MySQL:beijing_map,host=192.168.2.205,port=3306,user=root,password=root,tables=testmap|layername=testmap"
自带的QgsDataSoueceUri 类不太好使,我昨天在查看qgis源码的时候发现了后面也有相应的字符转换,只是当时没这么敏感。
最后如果实在不知道这个mysql uri是怎么样的 可以先QGis桌面程序先链接sql,然后在属性中会存在这样的详细信息。如下:
另外,遇到cmake工程上的问题可以加我的cmake技术交流Q群 870836798。