QGis QgsVectorLayer 圖層加載(shp file矢量圖層)

很奇怪,3.4 LTR 沒有API手冊,而官網的API手冊Doxygen生成的...。OK停止吐槽,解決問題

我下載了配套的源碼,沒有手冊沒關係。參照一篇博客做了相應的調整。百度QGIS全是2.x版本,3.x版本的版本更改的東西可以在這裏找到 https://qgis.org/api/3.2/api_break.html

之前編譯源碼也是心塞塞。可能在linux下更好開發一些,一路yum和apt。所以3.4版本依賴python和一大堆依賴庫的問題,我也是沒門,在官方desktop版本上也是沒有qgis的SDK的所以這個需要網絡版本下載 相應的SDK。具體怎樣安裝 qgis SDK 可以參照 https://blog.csdn.net/qq_34357717/article/details/81305084

這是我參照的二次開發博客 https://blog.csdn.net/shineplusplus/article/details/78362098(這裏特別感謝鏈接博主最後的對其流程進行了總結)

這裏我提供一個圖層庫。帝都的road.shp,方便各位測試,傳送門(https://download.csdn.net/download/qq_24423085/11664031

廢話不多說:

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) #頭文件的路徑 SDK下QGIS目錄和自帶Qt5的頭文件路徑

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}) # 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"
)#這裏生成一個cmd腳本用於拉起exe。在VS開發下可能不太方便調試。

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")


因爲下載的包可能需要更改路徑。你必須瞭解CMake工程,這裏你可以加我的Q羣 870836798,有什麼問題也問,可以討論一些新東西。上面我對需要更改的地方進行註釋。裏面cmake option 可能還需要你的配置。如下

main.cpp

#include <qgis.h>
#include "MainWindow.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>

#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");	
	QString file("E:\\Beijing.osm.shp\\Beijing-shp\\shape\\roads.shp");
	
	QList<QgsMapLayer*> listVecLayer;

	QgsVectorLayer Vectorlayer;
	Vectorlayer.setProviderEncoding("GBK2312");
	Vectorlayer.setMinimumScale(1.0);
	Vectorlayer.setDataSource(file,QFileInfo(file).completeBaseName(),"ogr",true);
	
	//QgsFeature feature();
	//QgsFeatureList FeatureList;
	//FeatureList.append();
	//QgsVectorLayer usetLayer;
	//usetLayer.addFeatures();


	listVecLayer.append(&Vectorlayer);

	qDebug()<<Vectorlayer.featureCount();
	QgsProject::instance()->addMapLayers(listVecLayer);

	QgsMapCanvas QGSMC;
	QGSMC.setLayers(listVecLayer);
	QGSMC.setExtent(Vectorlayer.extent());
	QGSMC.enableAntiAliasing(true);
	QGSMC.freeze(false);
	QGSMC.setDragMode(QGraphicsView::RubberBandDrag);
	QGSMC.setVisible(true);
	QGSMC.zoomToFullExtent();
	QGSMC.refresh();
	QGSMC.show();
	//QgsMapLayer* testlayer = new QgsMapLayer();
	////testlayer.show();

	//QgsDataSourceUri GS_DATASURL;
	// setConnection(const QString&aHost,const QString&aPort,const QString&aDatabase,const QString&aUsername,const QString&aPassword,SslMode sslmode = SslPrefer,const QString&authConfigId = QString())
	//GS_DATASURL.setConnection("192.168.2.205","3306", "beijin_map", "root", "root", QgsDataSourceUri::SslMode::SslDisable);
	//GS_DATASURL.setDriver("Mysql");
	//qDebug() << "exit" << GS_DATASURL.table();

	QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
	db.setHostName("192.168.2.205");
	db.setDatabaseName("beijing_map");
	db.setUserName("root");
	db.setPassword("root");
	if (db.open()) 
	{
		QSqlQuery qsql = QSqlQuery(db);
		if(qsql.exec("select COLUMN_NAME from information_schema.COLUMNS where table_name = 'testmap'"))
		{
			while (qsql.next()) {
				qDebug() << qsql.value(0).toString();
			}
		}
	}
	else 
		qDebug() << db.lastError();

	//MainWindow MW;
	//MW.show();

	//QgsMapLayoutConfigWidget QMLCW;
	//QMLCW.show();

	return myApp.exec();
}

效果圖

這裏終端打印了幾個錯誤,我在cmd腳本中進行了更正,在你查看博客的時候,可能這個問題並不會存在。

這裏需要注意幾個問題

Qt工程是QCoreApplication或者QApplication。我之前一直加載不成功,原因是插件路徑的問題,代碼中“org”相應代表需要org的插件就是這個東西

坑爹的整了大概一週。。。QGsApplication中大概是封裝了一些插件機制。所以這裏需要配置插件路徑。(來自SDK 下載的apps//qgis//plugin)

順帶提一個cmake工程調試的問題,我個人喜好是cmake工程。爲了融合一些源碼歸檔。比如這個qgis的開發依賴的包挺多的。反正visual studio自帶的lauch.json調試不太好用。

然後我對環境進行了一個cmd腳本的編寫,其實在qt用msvc編譯器的時候就採用了這種方式。爲什麼這麼做呢,因爲每一個cmd這種窗口對於環境都是單獨分離的,關閉cmd窗口失效。臨時用戶的環境。不必牽扯環境變量更改。如果有問題可以參照我的上一篇博客 QGIS 二次開發搭建(windows)

 

我是選擇的cmake的工程所以,遇到任何cmake 的問題都可以加羣Q 870836798 CMake技術交流

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