QGis QgsVectorLayer 圖層加載(mysql)

之前寫了一篇文章關於 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。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章