QGIS二次開發教程一
——用QGIS的API編寫自定義應用程序
教程一:使用QGIS Canvas API編寫一個簡單的地圖顯示程序
參考翻譯自Quantum GIS官方網站
事實上,我們並不是所有的時候都需要一個龐大、完整的GIS桌面應用程序,有時候我們的應用程序主要用於其他的目的,而我們所需要的只是在用程序中添加一個具有地圖顯示功能的小工具。譬如一個帶有地圖顯示功能的數據庫前端。
接下來我們就創建一個簡單的地圖小工具,功能僅僅是加載一個shape文件並用隨機顏色加以顯示。但是通過這個簡單的例子你應該能體會到將QGIS作為一個嵌入式的地圖組件的潛力。
首先,在我們的應用程序里添加必要的includes:
1 // 2 // QGIS Includes 3 // 4 #include <qgsapplication.h> 5 #include <qgsproviderregistry.h> 6 #include <qgssinglesymbolrenderer.h> 7 #include <qgsmaplayerregistry.h> 8 #include <qgsvectorlayer.h> 9 #include <qgsmapcanvas.h> 10 // 11 // Qt Includes 12 // 13 #include <QString> 14 #include <QApplication> 15 #include <QWidget>
我們用QgsApplication代替Qt中的QApplication來創建應用程序,這樣可以方便地調用QGIS中的許多靜態方法,比如得到庫文件所在的路徑等等。
各種數據的提供商plugins通過提供商注冊表(QgsProviderRegistry)來管理,它會根據提供商自動加載相應的plugins,我們所需要做的就是指定plugins所存放的目錄,讓應用程序實例化這樣的提供商注冊表。
QgsSingleSymbolRenderer是最基本的符號類,它用一種顏色表示點、線、多邊形對象。默認情況下顏色是隨機選取的,當然,你也可以自己設定希望顯示的顏色。每一個矢量圖層都有一個對應的符號。
地圖圖層注冊表(QgsMapLayerRegistry)用來管理現在正在使用的圖層。QgsVectorLayer 繼承自QgsMapLayer,添加了矢量數據特有的功能。
最后,地圖畫布(QgsMapCanvas)才是問題的關鍵,我們的地圖將被繪制在這個工具上。
現在,我們開始初始化我們的應用程序:
1 int main(int argc, char ** argv) 2 { 3 // Start the Application 4 QgsApplication app(argc, argv, true); 5 6 QString myPluginsDir = "/home/timlinux/apps/lib/qgis"; 7 QString myLayerPath = "/home/timlinux/gisdata/brazil/BR_Cidades/"; 8 QString myLayerBaseName = "Brasil_Cap"; 9 QString myProviderName = "ogr";
這樣我們就得到了一個qgsapplication。
變量myLayerPath指定了plugins所在的目錄。
變量myLayerPath和myLayerBaseName指向要使用的shape文件。
變量myProviderName很重要,它告訴qgis加載數據文件需要使用哪個數據提供商。一般為”ogr”或”postgres”。
現在我們可以開始創建圖層了:
1 // Instantiate Provider Registry 2 QgsProviderRegistry::instance(myPluginsDir);
首先我們需要初始化提供商注冊表。QgsMapLayerRegistry是一個單類(singleton class),因此我們使用它的靜態函數instance()傳遞供應商插件庫的路徑,在此之后它將在這個路徑下查找提供商的插件。
接下來我們繼續創建圖層:
1 QgsVectorLayer * mypLayer = 2 new QgsVectorLayer(myLayerPath, myLayerBaseName, myProviderName); 3 QgsSingleSymbolRenderer *mypRenderer = new QgsSingleSymbolRenderer(mypLayer->geometryType()); 4 QList <QgsMapCanvasLayer> myLayerSet; 5 6 mypLayer->setRenderer(mypRenderer); 7 if (mypLayer->isValid()) 8 { 9 qDebug("Layer is valid"); 10 } 11 else 12 { 13 qDebug("Layer is NOT valid"); 14 } 15 16 // Add the Vector Layer to the Layer Registry 17 QgsMapLayerRegistry::instance()->addMapLayer(mypLayer, TRUE); 18 // Add the Layer to the Layer Set 19 myLayerSet.append(QgsMapCanvasLayer(mypLayer, TRUE));
這段代碼的意義顯而易見。我們用前面定義的變量創建了一個圖層,然后給這個圖層分配了一個渲染器(renderer)。在創建渲染器的時候,我們需要指定圖層的幾何類型,這個可以通過圖層對象的geometryType()函數得到。然后將圖層對象layer添加到圖層列表layerset和地圖圖層注冊表QgsMapLayerRegistry中,layerset告訴QgsMapCanvas那些圖層需要渲染、它們的順序如何。最后,我們要保證這個圖層是可見的。
現在我們創建一個地圖畫布用於顯示地圖圖層。
1 // Create the Map Canvas 2 QgsMapCanvas * mypMapCanvas = new QgsMapCanvas(0, 0); 3 mypMapCanvas->setExtent(mypLayer->extent()); 4 mypMapCanvas->enableAntiAliasing(true); 5 mypMapCanvas->setCanvasColor(QColor(255, 255, 255)); 6 mypMapCanvas->freeze(false); 7 // Set the Map Canvas Layer Set 8 mypMapCanvas->setLayerSet(myLayerSet); 9 mypMapCanvas->setVisible(true); 10 mypMapCanvas->refresh();
這段代碼也很簡單。我們創建了一個畫布,然后將它的范圍設置為我們圖層的范圍。接下來打開反走樣功能,並設置背景顏色為白色,解凍畫布,設置其為可見並刷新。
1 // Start the Application Event Loop 2 return app.exec(); 3 }
在這最后一步中,我們所做的僅僅是啟動Qt事件循環。是不是很簡單?
這個例子中的源代碼可以通過svn下載(當然,前提是安裝了svn工具),下載命令如下:
svn co https://svn.osgeo.org/qgis/trunk/code_examples/1_hello_world_qgis_style
