České vysoké učení technické v Praze Fakulta stavební
Bakalářská práce
Praha 2012
Martin Lžíčař
České vysoké učení technické v Praze Fakulta stavební Obor geoinformatika
Bakalářská práce Podpora pro "all-in-one" projekty v programu QGIS Support for "all-in-one" projects in QGIS
Vedoucí práce: Ing. Martin Landa Katedra mapování a kartografie Praha 2012
Martin Lžíčař
ČESKÉ VYSOKÉ UČENÍ TECHNICKÉ V PRAZE Fakulta stavební Thákurova 7, 166 29 Praha 6
ZADÁNÍ
BAKALÁŘSKÉ PRÁCE
studijní program:
Geodézie a kartografie
studijní obor:
Geoinformatika
akademický rok:
2011/2012
Jméno a příjmení studenta: Martin Lžíčař Zadávající katedra:
Katedra mapování a kartografie
Vedoucí bakalářské práce:
Ing. Martin Landa
Název bakalářské práce: Název bakalářské práce v anglickém jazyce
Podpora pro "all-in-one" projekty v programu QGIS Support for "all-in-one" projects in QGIS
Rámcový obsah bakalářské práce: Cílem bakalářské práce je rozšířit Quantum GIS (QGIS) ve formě zásuvného modulu o možnost otevřít a uložit soubor s QGIS projektem včetně datových vrstev a dalších souborů jako jsou např. SVG symboly apod. Hlavním přínosem tohoto "all-in-one" řešení bude přenositelnost nejen nastavení QGIS projektu ale i datových vrstev otevřených v rámci tohoto projektu včetně symbologie a dalších specifických nastavení. Datum zadání bakalářské práce:
16.2.2012
Termín odevzdání:
11.5.2012 (vyplňte poslední den výuky příslušného semestru)
Pokud student neodevzdal bakalářskou práci v určeném termínu, tuto skutečnost předem písemně zdůvodnil a omluva byla děkanem uznána, stanoví děkan studentovi náhradní termín odevzdání bakalářské práce. Pokud se však student řádně neomluvil nebo omluva nebyla děkanem uznána, může si student zapsat bakalářskou práci podruhé. Studentovi, který při opakovaném zápisu bakalářskou práci neodevzdal v určeném termínu a tuto skutečnost řádně neomluvil nebo omluva nebyla děkanem uznána, se ukončuje studium podle § 56 zákona o VŠ č. 111/1998. (SZŘ ČVUT čl. 21, odst. 4) Student bere na vědomí, že je povinen vypracovat bakalářskou práci samostatně, bez cizí pomoci, s výjimkou poskytnutých konzultací. Seznam použité literatury, jiných pramenů a jmen konzultantů je třeba uvést v bakalářské práci. ....................................................... vedoucí bakalářské práce
....................................................... vedoucí katedry
ZDE VLOŽIT16.2.2012 ORIGINÁLNÍ ZADÁNÍ
Zadání bakalářské práce převzal dne:
....................................................... student
Formulář nutno vyhotovit ve 3 výtiscích – 1x katedra, 1x student, 1x studijní odd. (zašle katedra) Nejpozději do konce 2. týdne výuky v semestru odešle katedra 1 kopii zadání BP na studijní oddělení a provede zápis údajů týkajících se BP do databáze KOS. BP zadává katedra nejpozději 1. týden semestru, v němž má student BP zapsanou. (Směrnice děkana pro realizaci studijních programů a SZZ na FSv ČVUT čl. 5, odst. 7)
Abstract Cílem bakalářské práce je rozšířit Quantum GIS (QGIS) ve formě zásuvného modulu o možnost otevřít a uložit soubor s QGIS projektem včetně datových vrstev. Tento modul zajistí přenositelnost nastavení QGISu a datových vrstev v rámci tohoto projektu, včetně symbologie a dalších specifických nastavení, mezi různými uživateli. Klíčová slova: GIS, QGIS, zásuvný modul
Abstract Aim of the bachelor thesis is to extend the possibility of loading and saving the QGIS project file including data layers in the form of the plugin. This plugin provides transferability of settings of QGIS project file and data layers including symbology and other specific settings between various users. Keywords: GIS, QGIS, plugin
Prohlášení Prohlašuji, že bakalářskou práci na téma „Podpora pro "all-in-one" projekty v programu QGIS“ jsem vypracoval samostatně. Použitou literaturu a podkladové materiály uvádím v seznamu zdrojů. V Praze dne .................
.................................. (podpis autora)
Poděkování Rád bych poděkoval především vedoucímu mé bakalářské práce, Ing. Martinu Landovi. Děkuji své sestře za připomínky. Dále děkuji své rodině a blízkým za podporu, kterou mi poskytli.
Obsah Úvod
8
1 Quantum GIS
9
1.1
QGIS API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9
1.1.1
QGIS core library . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.1.2
QGIS gui library . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.2
Soubor s QGIS projektem .qgs . . . . . . . . . . . . . . . . . . . . . . 12
1.3
Zásuvné moduly . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 1.3.1
Zásuvné moduly v QGIS . . . . . . . . . . . . . . . . . . . . . 13
1.3.2
Tvorba zásuvného modulu . . . . . . . . . . . . . . . . . . . . 13
2 Využité Open source projekty
15
2.1
GDAL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.2
OGR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.3
SQLite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.4
2.3.1
SpatiaLite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.3.2
RasterLite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
Knihovna zlib . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 2.4.1
QuaZIP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
3 Zásuvný modul „All-in-one project“
18
3.1
Třída QgsAllInOnePlugin . . . . . . . . . . . . . . . . . . . . . . . . 19
3.2
Třída QgsAllInOnePluginDialog . . . . . . . . . . . . . . . . . . . . . 20
3.3
Třída QgsAllInOnePluginLoadDialog . . . . . . . . . . . . . . . . . . 21
3.4
Budoucí vývoj „All-in-one project“ . . . . . . . . . . . . . . . . . . . 22
Závěr
23
Seznam použitých zkratek
25
Použité zdroje
26
A Instalace QGIS a zásuvného modulu „All-in-one project“
28
B Návod pro uživatele zásuvného modulu „All-in-one project“
29
ČVUT v Praze
ÚVOD
Úvod V dnešní době je GIS rozšířen do mnoha sfér společnosti. GIS používají nejen geodeti, kartografové nebo vodohospodáři, ale i města a firmy s negeografický zaměřením. Na složitější práci s GIS sice je potřeba určité vzdělání, ale i tak by běžný občan, pokud o to má zájem, měl mít možnost pracovat s veřejně dostupnými daty v GISu. Proprietární GIS softwary (např. Esri ArcGIS) jsou kvalitní, ale často jsou pro běžného člověka drahé a tudíž nedostupné. Naštěstí je tu alternativa v podobě Open Source projektů, které jsou zdarma a jsou tvořeny komunitou lidí, kteří se o ten svůj GIS nestarají pro peníze, ale protože je to baví. Známé Open Source GISy jsou např. GRASS nebo Quantum GIS. GRASS sice má velké množství funkcí, ale není příliš uživatelsky přístupný. Proto je spíš používán vědeckými a akademickými pracovníky. Naopak QGIS je uživatelsky přívětivý a snadný k použití. V poslední době spolu tyto projekty spolupracují. Práce v QGISu je poměrně snadná. Datové vrstvy si uživatel může nahrávat z různých adresářů po celém disku. Poté jen uloží tzv. project file, který si pamatuje cesty ke všem vrstvám. Projekt si může kdykoliv opět otevřít a pracovat na něm dál. Ale musí si dát pozor, aby žádná data nebo i project file nepřesunul na jiné místo, to způsobí chybu při otevírání projektu. Podobný problém nastane, pokud uživatel chce pracovat se svými daty na jiném počítači nebo se chce pochlubit svou prací někomu jinému. To lze vyřešit tím, že na jiný počítač přesune všechna data. Pokud jsou ale data rozmístěna různě po lokálním disku, tak se mu ani nemusí podařit všechny najít, protože cesty k nim si za něj pamatoval project file. Myšlenka umožnit v QGISu uživateli uložit si svoji práci do jednoho souboru a poté si ho odnést na paměťovém médiu nebo ho poslat po síti kolegovi byla na začátku tvorby zásuvného modulu „All-in-one project“. Zásuvný modul měl do souboru uložit veškeré datové vrstvy, vektorové i rastrové, včetně symbologie a specifických nastavení. Vybrané téma bakalářské práce mně přišlo velmi zajímavé. Zvlášť atraktivní jsem shledával možnost podpořit svým malým zásuvným modulem tak velký projekt jako je QGIS. Při mém dosavadním programování jsem vždy psal své aplikace a využíval jsem různé knihovny a toto mohla být zajímavá zkušenost.
9
ČVUT v Praze
1
1 QUANTUM GIS
Quantum GIS
QGIS [1] je geografický informační systém, který je možné nainstalovat jak v operačních systémech Linux a Unix, tak i ve Windows a Mac OS X. Nabízí možnost prohlížení a editaci velkého množství vektorových, rastrových a databázových geografických formátů. Myšlenka vývoje QGISu začala na začátku roku 2002, kdy Gary Sherman hledal jednoduchý prohlížeč geografických dat pro Linux, který by podporoval více formátů. V květnu toho roku začal psát první části kódu. První verze vyšla v červenci a podporovala pouze prohlížení dat z databáze PostGIS (rozšíření PostgreSQL o prostorová data). Nejnovější verze 1.7.4 vyšla v únoru roku 2012 a nyní se pracuje na verzi 1.8 a verzi 2.0. Celý projekt QGIS je šířen pod licencí GNU GPL. Což znamená, že jsou všem k dispozici zdrojové kódy a uživatelé je mohou měnit podle libosti. Ale tato odvozená díla musí být nadále pod licencí GNU GPL. Projekt je kompletně napsán v programovacím jazyce C++ a využívá knihovnu Qt, která se používá na vytváření programů s grafickým uživatelským rozhraním. Velkou výhodou QGISu je uživatelská přístupnost. Již po prvním spuštění se běžný uživatel dobře orientuje v grafickém rozhraní a zvládá jednoduché úkony, např. otevření vektorové vrstvy. Na první pohled se trochu podobá ArcGISu, nejrozšířenějšímu geografickému informačnímu systému. Další výhoda QGISu je ve spolupráci s projektem GRASS GIS. Ten je velmi mocný ale ne moc uživatelsky přívětivý. I přes snahu v posledních verzích k němu většina uživatelů hledá cestu obtížně. QGIS využívá sílu GRASSu v uživatelsky přístupném prostředí. To dovoluje provádět v QGISu mnohem složitější prostorové analýzy. Pomocí zásuvných modulů je možné přidat mnoho dalších funkcí. Problematikou zásuvných modulů pro QGIS se budu zabývat v další kapitole.
1.1
QGIS API
QGIS API je navrženo relativně dobře. Po chvíli se v něm lze dobře orientovat, ale má i mnohá negativa. Popis některých tříd mně přijde nedostatečný. Více bych 10
ČVUT v Praze
1 QUANTUM GIS
popsal i členské proměnné a metody některých tříd. Nechci tím říci, že by některá třída byla nesrozumitelná a tudíž nepoužitelná, jen se domnívám, že by kvalitnější vysvětlení pomohlo vývoji QGISu co do rychlosti i kvality. Co mně na stránce QGIS API chybí, je nějaký přehledný návod pro vývojáře, který by odkazoval přímo na třídy. Příkladem by mohl být GRASS Programmer’s Manual, který se na první pohled jeví jako velmi obsáhlý a kvalitně zpracovaný. Začínající vývojář proto ze začátku spíše tápe a potenciálně ho to může od vývoje odradit. Např. pro psaní zásuvných modulů v programovacím jazyce Python je zpracována „kuchařka“ PyQGIS Developer Cookbook, která je napsána pěkně a je možnou inspirací i pro tápající vývojáře, kteří píší v jazyce C++. Všechny třídy v QGIS API jsou rozděleny do 5 modulů. Tyto moduly obsahují třídy podle jejich funkčnosti. V další podkapitole zmíním třídy, které jsou z mého pohledu podstatné nebo které jsou používal ve svém zásuvném modulu. • QGIS core library • QGIS gui library • QGIS analyze library - umožňuje provádět prostorové analýzy nad vektorovými a rastrovými daty • MapComposer - umožňuje vytvářet mapové výstupy • QGIS network analysis library - umožňuje vytváření topologie a provádět síťové analýzy 1.1.1
QGIS core library
Tento modul obsahuje značné množství tříd, které zajišťují veškeré základní funkce typické pro geografické informační systémy. • class QgsCoordinateReferenceSystem Tato třída se stará o souřadnicový referenční systém. Použitím lze zjistit parametry daného systému nebo nahrávat parametry z různých formátů. • class QgsGeometry Třída se stará o geometrii, jak vyplývá z názvu. 11
ČVUT v Praze
1 QUANTUM GIS
• class QgsMapLayer Rodičovská třída třem následujícím třídám. – class QgsVectorLayer Stará se o vektorové vrstvy. – class QgsRasterLayer Stará se o rastrové vrstvy. – class QgsPluginLayer • class QgsProject Umožňuje čtení a zápis do souboru s QGIS projektem • class QgsVectorFileWriter Jedna z nejdůležitějších tříd použitých v mém zásuvném modulu. Umožňuje uložení vektorové vrstvy na disk. Primárně je zaměřen na převedení a uložení dat ve formátu Esri Shapefile. Ale obsahuje metodu, kde pomocí knihovny OGR lze vektorová data uložit ve všech podporovaných formátech. 1.1.2
QGIS gui library
Tento modul je vybudován na core library a přidává do softwaru grafické prvky pro snadnou a uživatelsky příjemnou práci. • class QgisInterface Velmi užitečná třída pro zásuvné moduly, která zpřístupňuje pro zásuvné moduly funkce hlavního rozhraní QGISu. • class QgsMapCanvas Důležitá třída, která zajišťuje zobrazení všech typů dat geografického informačního systému. • class QgsLegendInterface Abstraktní třída, která umožňuje zásuvným modulům manipulovat s pořadím vrstev a jejich viditelností.
12
ČVUT v Praze
1.2
1 QUANTUM GIS
Soubor s QGIS projektem .qgs
V této kapitole bude popsán způsob, jak v nynější době ukládá QGIS své pracovní prostředí. QGIS umožňuje uložení otevřeného pracovního prostředí do souboru s příponou .qgs. Tento soubor je ve formátu xml a obsahuje prakticky veškeré informace o pracovním prostředí v době uložení. Mapcanvas je první značkou v souboru. Obsahuje informace o jednotkách, o souřadnicích na kterých se nacházel pohled a informace o souřadnicovém referenčním systému. Legend obsahuje informace o vrstvách, jestli jsou viditelné či v jakém pořadí se budou vykreslovat. Tato nastavení jsou pouze pro legendu QGISu, neobsahují informace pro vykreslování. Projectlayers je nejdůležitější v celém souboru, neboť obsahuje informace, podle kterých se vykreslují vrstvy do mapcanvasu. Pro každou vrstvu je tu nastaven zdroj dat, fungují zdroje lokální i síťové. Dále je tu informace o souřadnicovém systému a nastavení symbologie. Obrovskou nevýhodou souboru .ggs je jeho nepohyblivost. Cesty ke zdroji dat jsou napsány relativně. Což znamená, že pokud přesuneme některý soubor, se kterým soubor .qgs pracuje nebo přesuneme samotný soubor .qgs, tak už nelze korektně tento soubor otevřít. QGIS se v tom případě ptá, kde jsou data, která nemůže najít. Pro lokální práci tento způsob ukládání práce stačí. Ale pokud na projektu pracuje více lidí nebo se uživatel jen chce podělit o svou práci s někým jiným, tak je to dosti problém. Tento problém by měl v budoucnu vyřešit tento zásuvný modul „All-in-one project“.
1.3
Zásuvné moduly
Zásuvné moduly jsou velmi důležitou součástí většiny GIS programů. Zpravidla z důvodu šetření místem na disku a v paměti, základní instalace většinou obsahují nejpoužívanější funkce, které taky často běžným uživatelům bohatě stačí. Ale někdy jsou potřeba speciální nebo méně běžné operace nad daty, které daný program nezvládá. Uživatel má možnost kontaktovat tvůrce a požádat o přidání potřebné funkce. Pokud jim navrhovaný problém přijde zajímavý, tak ho implementují do další verze. 13
ČVUT v Praze
1 QUANTUM GIS
To ale může být problém, pokud plánují vydat další verzi za delší dobu. Další možností je požádat o pomoc komunitu kolem daného GIS. Ti můžou přijít s alternativním řešením nebo se někdo přímo pustí do řešení pomocí zásuvného modulu. Ten může být použit ve stávající verzi programu okamžitě, co je dopsán. Kolem každého GISu, ať proprietárního nebo svobodného, je komunita, která pro ten „svůj“ GIS vytváří zásuvné moduly. Tím zvyšují funkcionalitu a tím pádem i konkurenceschopnost daného GISu. 1.3.1
Zásuvné moduly v QGIS
Zásuvné moduly v QGIS jsou velmi podstatnou složkou pro funkcionalitu. Třeba GRASS, který přidává do QGISu spoustu zajímavých funkcí, je přidán do QGISu právě jako zásuvný modul. Zásuvné moduly lze psát jak v programovacím jazyce C++, tak v jazyce Python. 1.3.2
Tvorba zásuvného modulu
Na následujících řádcích krátce popíšu tvorbu zásuvného modulu pomocí programovacího jazyka C++. [3] Ukázkový zásuvný modul byl nazván jednoduše QgsPlugin. Při tvorbě vlastního zásuvného modulu musí být jméno pochopitelně změněno. Takto napsaný modul by pouze přidal do Plugin Manager možnost povolit zásuvný modul pro QGIS. Nic jiného by se do QGISu nepřidalo. • plugin.pro Soubor .pro v Qt knihovně pomáhá tvořit Makefile. Tento soubor definuje cestu ke zdrojovým kódům QGIS a tvorbu knihovny daného zásuvného modulu.
# base directory of the QGIS installation QGIS_DIR = / home / martin / qgis TEMPLATE = lib CONFIG += qt \ dll QT += xml
14
ČVUT v Praze
1 QUANTUM GIS
unix : LIBS += -L / $$QGIS_DIR / lib
- lqgis_core
INCLUDEPATH += $$QGIS_DIR / src / ui
- lqgis_gui
$$QGIS_DIR / src / plugins \
$$QGIS_DIR / src / gui
$$QGIS_DIR / src / core / raster \
$$QGIS_DIR / src / core
$$QGIS_DIR \
HEADERS += qgsplugin . h SOURCES += qgsplugin . cpp DEST = plugin . so DEFINES += GUI_EXPORT =
CORE_EXPORT =
• qgsplugin.h # ifndef QGSPLUGIN_H # define QGSPLUGIN_H # include " qgisplugin . h " class QgsPlugin : public QgisPlugin { public : QgsPlugin ( QgisInterface * iface ); ~ QgsPlugin (); void initGui (); void unload (); private : QgisInterface * mIface ; }; # endif // QGSPLUGIN_H
• qgsplugin.cpp V tomto souboru se definuje jméno, popis, kategorie, verze a typ zásuvného modulu. Tady jsem u tvorby zásuvného modulu narazil na problém. Starší verze třídy QgisPlugin neobsahovala proměnnou kategorie. To mělo za následek, že zásuvný modul sice šel nahrát do QGISu, ale nezůstal v paměti programu a musel být nahráván při každém spuštění QGISu. # include " qgsplugin . h "
15
ČVUT v Praze
2 VYUŽITÉ OPEN SOURCE PROJEKTY
# ifdef WIN32 # define QGISEXTERN extern " C " __declspec ( dllexport ) # else # define QGISEXTERN extern " C " # endif QgsPlugin :: QgsPlugin ( QgisInterface * iface ): mIface ( iface ) {} QgsPlugin ::~ QgsPlugin () {} void QgsPlugin :: initGui () {} void QgsPlugin :: unload () {} QGISEXTERN QgisPlugin * classFactory ( QgisInterface * iface ){ return new QgsPlugin ( iface );} QGISEXTERN QString name (){ return " Name ␣ of ␣ the ␣ Plugin " ;} QGISEXTERN QString description (){ return " Plugin ␣ description " ;} QGISEXTERN QString version (){ return " Plugin ␣ version " ;} QGISEXTERN QString category (){ return " Plugin ␣ category " ;} QGISEXTERN int type () { return " Plugin ␣ type " ;} QGISEXTERN void unload ( QgisPlugin * t h e Q g s A l l I n O n e P l u g i n P o i n t e r ) { delete t h e Q g s A l l I n O n e P l u g i n P o i n t e r ; }
2
Využité Open source projekty
V této kapitole se budu věnovat projektům, se kterými pracuji ve svém zásuvném modulu.
16
ČVUT v Praze
2.1
2 VYUŽITÉ OPEN SOURCE PROJEKTY
GDAL
GDAL [5] je knihovna pro převádění rastrových dat mezi různými formáty. Vývoj GDAL [6] započal v druhé polovině roku 1998, kdy na něm začal pracovat nezávislý programátor Frank Warmerdam. Ten na něm pracoval do roku 2006, ve kterém převzala správu nad projektem organizace OSGeo. GDAL je open source software, který je vydáván pod licencí X11/ MIT. Což umožňuje stahovat, modifikovat a i použít pro komerční software celý zdrojový kód. Není potřeba žádný souhlas vývojářů. GDAL lze používat na všech nejpoužívanějších operačních systémech, jako je Microsoft Windows, Linux a Max OS X. Je napsán v programovacím jazyce ANSI C a C++. Nejnovější verze 1.9.0 vyšla v prosinci roku 2011. Na konec roku 2012 je naplánováno vydání verze 2.0.0. Knihovna GDAL podporuje velké množství rastrových datových formátů. Pro každý podporovaný formát je napsaný samostatný driver. Pomocí driveru nejprve převede rastrová data z daného formátu do svého abstraktního datového modelu a poté jiným driverem z abstraktního modelu převede rastrová data do požadovaného formátu. Pro svoji obsáhlost a kvalitu provedení je GDAL používán řadou programů, které pracují s rastrovými daty. Např. QGIS, GRASS GIS, IDRISI, MapServer nebo Esri ArcGIS.
2.2
OGR
OGR je knihovna pro převádění vektorových dat mezi různými formáty. OGR je součástí knihovny GDAL. V budoucnu by mělo být OGR plně implementováno do GDAL a GDAL by se stal knihovnou pro rastrová i vektorová data. OGR podporuje mnoho formátů vektorových dat, např. ESRI Shapefile, GRASS, AutoCAD DXF a další.
17
ČVUT v Praze
2.3
2 VYUŽITÉ OPEN SOURCE PROJEKTY
SQLite
SQLite [8] je relační databázový systém. Na rozdíl od některých databázových systémů, kde databázový server je samostatný proces, SQLite pracuje s jedním souborem na disku. Vývoj SQLite začal na jaře roku 2000, kdy D. Richard Hipp pracoval pro General Dynamics. Cílem bylo vytvořit program, který by pracoval bez nutnosti instalace systému řízení báze dat. První verze 1.0 byla vydána v srpnu roku 2000. Poslední verze 3.7.12 vyšla v květnu roku 2012. SQLite je napsáno v programovacím jazyce C, vydáváno pod licencí public domain a funguje na všech nejpoužívanějších operačních systémech. Licence umožňuje používat systém zdarma na jakýkoliv účel, komerční či osobní. Pro svoji malou velikost, jednoduchost, ale dobrou funkčnost je SQLite velmi oblíbený a používaný i velkými společnostmi, např. Airbus, Apple, Google nebo Mozzila. 2.3.1
SpatiaLite
SpatiaLite [10] je knihovna rozšiřující databáze SQLite o možnost ukládat prostorová vektorová dat a pracovat s nimi. Platí pro ni totéž, co pro SQLite. Všechna data se ukládají do jednoho souboru bez limitu velikosti a vytvořený soubor lze otevřít ve všech podporovaných operačních systémech. SpatiaLite je šířen pod licencí MPL tri-license, což znamená, že jsou na výběr 3 licence (MPL 1.1, GPL v2.0, LGPL v2.1) a vývojář si při použití vybere tu, co se mu nejvíce hodí. V březnu roku 2012 byla vydána zatím poslední verze 3.0.1. 2.3.2
RasterLite
RasterLite [11] je knihovna rozšiřující databáze SQLite o možnost ukládat a načítat velká rastrová data.
18
ČVUT v Praze
3 ZÁSUVNÝ MODUL „ALL-IN-ONE PROJECT“
Je šířen pod stejnou licencí jako SpatiaLite. Poslední verze 1.1b vyšla v listopadu roku 2011.
2.4
Knihovna zlib
Zlib [12] je Open source knihovna pro bezeztrátovou kompresi dat. Funguje na všech operačních systémech a datový formát zlib je přenositelný mezi různými systémy. Knihovnu zlib napsali Jean-loup Gailly a Mark Adler. První verze 0.9 byla vydána v květnu roku 1995. Nejnovější verze 1.2.7 vyšla v květnu roku 2012. Je šířena pod vlastní zlib licencí, která dovoluje knihovnu měnit či použít pro komerční účely. Jen vývojář, který knihovnu zlib používá, nesmí tvrdit, že to je jeho vlastní práce. 2.4.1
QuaZIP
QuaZIP [13] je rozšířením knihovny zlib o možnost manipulace s archivy formátu zip. Využívá soubory z knihovny Minizip, která je naprogramována v jazyce C. QuaZIP je napsán v programovacím jazyce C++ a využívá knihovnu Qt. Je šířen pod zlib licencí a pod licencí LPGL. Vytvořil ho Sergey A. Tachenov v roce 2005. Poslední verze 0.4.4 vyšla na začátku roku 2012. Použití knihovny QuaZIP je velmi jednoduché. Třída JlCompress obsahuje metody pro kompresi nejen jednoho či více souborů, ale i adresáře. Adresáře lze komprimovat i včetně podadresářů. Podobně pomocí jiných metod lze zabalené soubory opět rozbalit.
3
Zásuvný modul „All-in-one project“
Jak již bylo řečeno, zásuvné moduly pro QGIS se dají psát v programovacích jazycích Python nebo C++. S oběma jazyky jsem měl nějaké zkušenosti, ale pro práci na této bakalářské práci jsem si vybral programovací jazyk C++. Hlavně z důvodu, že celý QGIS je v tomto jazyce napsán a tudíž jsem předpokládal, že budu mít méně problémů než při psaní v jazyce Python. Pro snadnější práci na projektu jsem si zvolil vývojové prostředí Qt Creator. 19
ČVUT v Praze
3 ZÁSUVNÝ MODUL „ALL-IN-ONE PROJECT“
Qt Creator [14] je vývojové prostředí pro programovací jazyk C++ využívající knihovnu Qt. Obsahuje debugger a designer pro GUI, který velmi usnadňuje práci na grafickém rozhraní. Funguje na všech hlavních operačních systémech a je vydáván pod licencí LGPL. Vývojem se zabývá společnost Qt Development Frameworks patřící společnosti Nokia. Nejnovější verze 2.5.0 vyšla v květnu roku 2012. Zásuvný modul „All-in-one project“ obsahuje tři třídy. Podrobně budou popsány dále, takže tady pouze stručně. Jedna třída se stará o napojení pluginu do hlavního okna QGISu, druhá třída má na starosti ukládání vrstev do souboru a poslední třída naopak nahrává vrstvy ze souboru do QGISu. Uložení souboru s all-in-one projektem mělo základní myšlenku práce v systémovém dočasném adresáři (dále tmp adresář). V tomto tmp adresáři měla být vytvořena složka s unikátním jménem a této složce další dvě složky - vector a raster. Do složky vector měla být nahrána vektorová data ve formátu databáze SpatiaLite a do složky raster rastrová data ve formátu databáze RasterLite. V době psaní této bakalářské práce funguje pouze práce s vektorovými daty. Složka s unikátním jménem poté měla být zkomprimována a uložena jako jeden soubor na uživatelem zvoleném místě.
3.1
Třída QgsAllInOnePlugin
Tato třída umožňuje přístup z QGISu do zásuvného modulu. V hlavní nabídce QGISu, do záložky Plugins je přidána možnost volby menu „All-in-one project“. V menu lze vybrat mezi Save AIO project nebo Load AIO project. Dále jsou do panelu nástrojů přidány dva nové grafické prvky. Zatím jsou popsány slovně stejně jako v menu, ale v budoucnu lze snadno dodat místo textu nějakou ikonku, což ale nemá na funkčnost zásuvného modulu žádný vliv. Důležitou součástí této třídy je definice zásuvného modulu. Tato definice se zobrazuje při načítání zásuvných modulů do QGISu pomocí volby v menu Manage Plugins... V mém případě definice zásuvného modulu vypadá takto: static const QString name_ = QObject :: tr ( " All - in - one ␣ project " ); static const QString description_ = QObject :: tr ( " Plugin ␣ for ␣ saving ␣ or ␣ loading ␣ all - in - one ␣ project " ); static const QString category_ = QObject :: tr ( " Vector , raster " );
20
ČVUT v Praze
3 ZÁSUVNÝ MODUL „ALL-IN-ONE PROJECT“
static const QString version_ = QObject :: tr ( " Version ␣ 0.1 " ); static const QgisPlugin :: PLUGINTYPE type_ = QgisPlugin :: UI ;
Jméno (name_) a popis (description_) zásuvného modulu by mělo být pokud možno co nejkratší, ale zároveň co nejvíce výstižné. Dále jsou v této třídě metody, které se spouštějí, pokud uživatel zvolí mezi možnostmi v menu či na panelu nástrojů. Pro každou možnost je jedna volba a obě otevřou okno s dalšími možnostmi. O funkce v otevřených oknech se starají třídy popsané níže.
3.2
Třída QgsAllInOnePluginDialog
Tato třída zajišťuje funkčnost prvků v dialogovém okně otevřeném po zvolení možnosti Save AIO project. Implicitně je nastavena možnost, že do souboru s all-in-one projektem budou uloženy vektorové vrstvy. Možnost uložení rastrových vrstev není povolena, neboť se mně nepodařila implementovat. Tlačítko Browse otevře okno s možností výběru, kam uložit vytvořený soubor s all-in-one projektem (příkaz 1). Následující řádky jsou v metodě starající se o události, co nastanou po kliknutí na toto tlačítko. 1
compressFileName = QFileDialog :: getSaveFileName ( this , tr ( " Save ␣ project " ) , QDir :: homePath () , tr ( " AIO ␣ files ␣ *. allinone " ));
2
if ( compressFileName . isEmpty ()) return ;
3
if ( QFileInfo ( compressFileName ). suffix ()!= " allinone " ) compressFileName . append ( " . allinone " );
4
mSavePathLineEdit - > setText ( compressFileName );
Příkaz 2 se stará o možnost, že si uživatel rozmyslí ukládání a nic nevybere. Příkaz 3 doplňuje jméno souboru o příponu .allinone, pokud nebyla tato přípona napsána uživatelem explicitně. Přípona byla zvolena takto, aby nenastala kolize s jinými soubory na disku. Tlačítko OK Kliknutím na toto tlačítko se uloží všechny vrstvy do souboru na vybrané místo. Nezáleží jestli jsou v dané chvíli aktivní či neaktivní. Pokud není vybrána žádná možnost, jaké typy vrstev uložit, tak se zobrazí upozornění ve formě
21
ČVUT v Praze
3 ZÁSUVNÝ MODUL „ALL-IN-ONE PROJECT“
QMessageBox. Podobné upozornění se objeví i tehdy, pokud nebylo vybráno žádné místo uložení souboru. Jak jsem na začátku kapitoly zmínil, chtěl jsem pracovat v dočasném adresáři. Ukázalo se, že to bude trochu problematické. Nalezená geniální třída pro toto použití QTemporaryDir se nachází v knihovně Qt verze 5.0, která ještě nebyla vydaná. Použil jsem tedy třídu QTemporaryFile a problém vyřešil následovně: 1
QDir d ( QDir :: tempPath ());
2
QTemporaryFile tf ;
3
tf . open ();
4
QString uniqDir = QFileInfo ( tf ). fileName ();
5
tf . remove ();
6
d . mkdir ( uniqDir );
Je vytvořena instance třídy QDir, která ukazuje do systémového tmp adresáře (řádek 1). Instance třídy QTemporaryFile (řádek 2), která musí být otevřena (řádek 3), jinak nebude dočasný soubor vytvořen. Na řádku 4 se získá unikátní jméno dočasného souboru a poté musí být dočasný soubor odstraněn (řádek 5), jinak nejde vytvořit adresář s unikátním jménem dočasného souboru (řádek 6). Po vytvoření složek pro uložení dat se prochází vrstva po vrstvě, které jsou v QGISu otevřené. Každá vektorová vrstva je uložena do zvláštního souboru se jménem stejným jako název vrstvy a s příponou .sqlite. K tomu byla použita metoda writeAsVectorFormat třídy QgsVectorFileWriter. Nakonec se zavolá metoda compressDir třídy JlCompress z knihovny QuaZIP, která zkomprimuje celý adresář s projektem včetně všech podadresářů. Samotné GUI tohoto dialogu je popsáno v dodatku B včetně obrázků.
3.3
Třída QgsAllInOnePluginLoadDialog
Tato třída se stará o rozbalení a načtení dat ze souboru s all-in-one projektem. Není v ní nic složitého. Metoda extractDir ze třídy JlCompress rozbalí soubor s all-in-one projektem a uloží obsah ve formě QStringList. Díky pojmenování podadresářů lze snadno pracovat zvlášť s vektory a zvlášť s rastry. Rozbalené adresáře jsou otevřeny v systémovém dočasném adresáři ve složce
22
ČVUT v Praze
3 ZÁSUVNÝ MODUL „ALL-IN-ONE PROJECT“
s unikátním jménem. Jak je vidět níže, tak se inicializuje QString vCheck, který se skládá z unikátního jména a názvu adresáře vector. QString vCheck = uniqDir . append ( " / vector " );
QString vCheck vypadá např. /tmp/qt_temp.T18832/vector. Jedinečností jména složky vytvořené v tmp adresáři je zajištěno, že nedojde k přepisování dat nebo ke konfliktu se stejně pojmenovaným adresářem. V další části jsou postupně ze QStringListu brány jednotlivé soubory z adresářů all-in-one projektu a jsou nahrávány do QGISu. Příklad pro vektory: (rastry jsou načítány obdobně) 1
QFileInfo myvFileInfo ( fileName );
2
QString vectorBaseName = myvFileInfo . baseName ();
3
QgsVectorLayer * vlayer = new QgsVectorLayer ( fileName , vectorBaseName , " ogr " );
4
Q g s S i n g l e S y m b o l R e n d e r e r * mypRenderer = new Q g s S i n g l e S y m bo l R e n d e r e r ( vlayer - > geometryType ());
5
vlayer - > setRenderer ( mypRenderer );
6
Q g s Ma p L ay e r Re g i str y :: instance () - > addMapLayer ( vlayer , TRUE );
Příkazy 1 a 2 slouží k získání jména a cesty k souboru. Příkaz 3 načítá novou vektorovou vrstvu pomocí knihovny ogr. Příkaz 4 slouží k inicializaci nového rendereru (vykreslovače) podle typu geometrie vektorové vrstvy a příkaz 5 tento renderer nastaví otevírané vektorové vrstvě. Příkaz 6 přidá vrstvu do registru QGISu a díku tomu se daná vrstva zobrazí v hlavním mapovém okně.
3.4
Budoucí vývoj „All-in-one project“
Zásuvný modul „All-in-one project“ není dokončen. Několik plánovaných funkcí stále není dopracováno. Práce na nich nebude jednoduchá, ale zcela jistě není nemožná. • Uložení rastrových vrstev V QGISu lze vektorová data exportovat do jiných formátů. Rastrová data tuto možnost nemají. Domnívám se, že tato funkce by měla být v budoucnu součástí QGISu. Já jsem ve své práci potřeboval pouze převod do formátu RasterLite. I když jsem se snažil napsat třídu, která by to uměla, bylo to nad mé časové i 23
ČVUT v Praze
ZÁVĚR
programátorské schopnosti. V budoucím vývoji to bude první věc, na kterou se zaměřím. Možnost nahrávat rastrová data ze souboru „All-in-one project“ je již implementována, i když naprosto nepoužitelná, neboť do souboru nelze uložit rastrová data a tudíž je nelze poté ani otevřít. • Uložení souboru s QGIS projektem Soubor s QGIS projektem měl ukládat symbologii a specifické nastavení jednotlivých vrstev. Od začátku práce jsem se soustředil na ukládání vektorových a rastrových vrstev, které přinášelo mnoho nečekaných problémů. Což způsobilo, že na práci se souborem s QGIS projektem zbylo málo času, ve kterém jsem nezajistil plnou funkčnost uložení tohoto souboru.
Závěr Zásuvný modul „All-in-one project“ v podobě jak byl původně navržen, jsem napsat nezvládl. Nějakou funkčnost tento modul získal a myslím, že v budoucnu je dokončení na požadovanou formu určitě možné. Největší překážkou byl pro mě samotný QGIS. S tak velkým projektem jsem neměl žádné zkušenosti a při tvorbě zásuvného modulu jsem narazil na řadu problémů, které jsem nepředpokládal. Prvním problémem byla podpora SpatiaLite v QGISu. Verze QGISu co jsem používal, nepodporovala SpatiaLite, což bylo v mém zásuvném modulu stěžejní. Musel jsem si stáhnout nové verze obou programů a znovu kompilovat a instalovat do svého počítače. Dalším problémem pro mě bylo QGIS API. Je přehledné, ale jak jsem již zmínil v práci, tak mně chybí lepší popis některých tříd a jejich metod. Často se mně stávalo, že jsem si naplánoval podle API, jak by to mělo fungovat. Poté jsem tu myšlenku přepsal do kódu. Málokdy to fungovalo, tak jsem si představoval. Většinou to fungovalo jinak nebo to dokonce nefungovalo vůbec. To není myšleno jako kritika API, většinou to bylo způsobeno mou nezkušeností.
24
ČVUT v Praze
ZÁVĚR
Zásuvný modul byl naprogramován ve vývojovém prostředí Qt Creator verze 2.4.1 na základě knihovny Qt verze 4.7.4. Testován byl v aplikaci QGIS verze 1.9.90Alpha, kompilované a běžící proti Qt verze 4.7.7 a GDAL/OGR verzi 1.9.0. Byla použita knihovna zlib verze 1.2.6 a QuaZIP verze 0.4.4. Vše běželo na operačním systému Ubuntu 11.10. Tvorba zásuvného modulu pro QGIS byla zajímavá zkušenost, z které jsem si odnesl mnoho poznatků a ponaučení pro další takové práce. Doufám, že se mně podaří započatou práci dokončit a že zásuvný modul „All-in-one project“ bude mít užitek i ostatním uživatelům QGISu.
25
ČVUT v Praze
SEZNAM POUŽITÝCH ZKRATEK
Seznam použitých zkratek GIS
Geographic Information System (Geografický informační systém)
QGIS
Quantum GIS
GRASS Geographical Resources Analysis Support System API
Application Programming Interface
GPL
General Public License
GUI
Graphical User Interface (Grafické uživatelské rozhraní)
GDAL
Geospatial Data Abstraction Library
OGR
OGR Simple Features Library
OSGeo
Open Source Geospatial Foundation
ANSI
American National Standards Institute
LGPL
Lesser General Public License
26
ČVUT v Praze
POUŽITÉ ZDROJE
Použité zdroje [1] QUANTUM GIS DEVELOPMENT TEAM. OPEN SOURCE GEOSPATIAL FOUNDATION PROJECT. Quantum GIS Geographic Information System [online]. 2003-2011 [cit. 2012-05-18]. Dostupné z:
[2] DOBIAŠ, Martin. Navigačný systém pre automobil [online]. Praha, 2007 [cit. 2012-05-18]. Dostupné z: Bakalářská práce. Univerzita Karlova v Praze. [3] QUANTUM GIS DEVELOPMENT TEAM. QGIS: Coding and Compilation Guide [online]. 2004 - 2010 [cit. 2012-05-18]. Dostupné z: [4] GeoWikiCZ QGIS: Tvorba zásuvného modulu krok za krokem [online]. 2012-35 [cit. 2012-05-18]. Dostupné z: [5] OPEN SOURCE GEOSPATIAL FOUNDATION. GDAL: Geospatial Data Abstraction Library [online]. [cit. 2012-05-18]. Dostupné z: [6] FAQGeneral – GDAL. GDAL [online]. [cit. 2012-05-18]. Dostupné z: [7] GDAL. In: Wikipedia: the free encyclopedia [online]. San Francisco (CA): Wikimedia Foundation, 2001-2012 [cit. 2012-05-18]. Dostupné z: [8] THE SQLITE DEVELOPMENT TEAM. SQLite [online]. [cit. 2012-05-18]. Dostupné z: [9] SQLite. In: Wikipedia: the free encyclopedia [online]. San Francisco (CA): Wikimedia Foundation, 2001-2012 [cit. 2012-05-18]. Dostupné z: [10] The Gaia-SINS. SpatiaLite [online]. [cit. 2012-05-18]. Dostupné z: [11] The Gaia-SINS. librasterlite [online]. [cit. 2012-05-18]. Dostupné z: 27
ČVUT v Praze
POUŽITÉ ZDROJE
[12] ROELOFS, Greg. zlib [online]. 1996-2012 [cit. 2012-05-18]. Dostupné z: [13] TACHENOV, Sergey A. QuaZIP [online]. 2005-2011 [cit. 2012-05-18]. Dostupné z: [14] QT DEVELOPER FRAMEWORKS. NOKIA CORPORATION. Qt Creator 2.4.1 [počítačový program]. 2008-2012 Dostupné z [15] Qt Creator. In: Wikipedia: the free encyclopedia [online]. San Francisco (CA): Wikimedia Foundation, 2001-2012 [cit. 2012-05-18]. Dostupné z: [16] SUTTON, Tim. Tutorials: Tutorials in C++. Quantum GIS blog [online]. 20062008 [cit. 2012-5-18]. Dostupné z: [17] QT DEVELOPER FRAMEWORKS. Qt Developer Network: Documentation [online]. 2011 [cit. 2012-05-18]. Dostupné z:
28
A
Instalace QGIS a zásuvného modulu „All-inone project“
Bude popsána instalace QGIS a způsob přidání zásuvného modulu „All-in-one project“ v operačním systému Linux Ubuntu 11.10. SpatiaLite stačí nainstalovat z balíčku $ sudo apt-get install spatialite-bin
QGIS nedoporučuji mít nainstalovaný z balíčku Ubuntu, neboť to je stará verze 1.4.0. Lepší je naklonovat si nejnovější verzi z gitu. $ git clone git://github.com/qgis/Quantum-GIS.git qgis
Poté stačí jen zkompilovat. Parametry cmake se mohou lišit. Záleží na umístění potřebných knihoven. $ $ $ $
cd qgis mkdir build cd build cmake -D WITH_BINDINGS=ON \ -D CMAKE_INSTALL_PREFIX=/usr/local \ -D GDAL_PREFIX=/usr/local/ \ -D PROJ_PREFIX=/usr/local \ -D WITH_SPATIALITE=ON \ -D CMAKE_BUILD_TYPE=Debug \ -D SPATIALITE_INCLUDE_DIR=/usr/include -D SPATIALITE_LIBRARY=/usr/local/lib/libspatialite.so .. $ make $ sudo make install
Zásuvný modul „All-in-one project“ je závislý na knihovnách zlib a QuaZIP, které je potřeba nainstalovat. Knihovnu zlib stačí nainstalovat z balíčku. $ sudo apt-get install zlib-bin
Knihovna QuaZIP je potřeba stáhnout, rozbalit a nainstalovat $ $ $ $ $ $
cd quazip mkdir build cd build cmake .. make sudo make install
29
V Qt Creatoru otevřít soubor allinone.pro, kde je potřeba změnit cesty ke zdrojovým kódům. QGIS_DIR = /home/martin/qgis-trunk ZLIB_DIR = /home/martin/zlib-1.2.6 QUAZIP_DIR = /home/martin/quazip-0.4.4/quazip
Poté stačí pouze zkompilovat. V QGISu se v hlavní nabídce vybere Settings->Options, kde je záložka Plugins. V té lze přidat cestu do adresáře, kde se nachází knihovna vytvořená po kompilaci.
B
Návod pro uživatele zásuvného modulu „Allin-one project“
Po nainstalování zásuvného modulu podle návodu by se po zvolení v hlavní nabídce Plugins->Manage Plugins... měl v zobrazeném seznamu zásuvných modulů zobrazit All-in-one project. Po jeho zvolení by se na panelu nástrojů měli zobrazit dvě nová tlačítka, Save AIO project a Load AIO project. Panel nástrojů QGIS by měl vypadat přibližně takto:
Po kliknutí na tlačítko Save AIO project se zobrazí toto okno:
Je možnost vybrat jaké vrstvy se mají uložit, implicitně je vybrána možnost vektorové vrstvy. Vybrat rastrové vrstvy je v této verzi nemožné, protože jejich ukládání není implementováno. Tlačítko Cancel zavře toto okno. 30
Tlačítko Browse otevře dialog pro vybrání jména souboru a místa na disku, kam se má soubor uložit.
Pokud je jméno a cesta vybrána, tak se zobrazí v dolní části dialogu.
Po kliknutí na tlačítko OK se vytvoří soubor na zvoleném místě. Tato operace může chvíli trvat, proto mějte trpělivost. Pokud je s tvorbou nějaký problém, tak to je uživateli oznámeno. Tato problematická vrstva je většinou i tak ve výsledném souboru obsažena, ale neobsahuje žádná či nekorektní data. Tudíž nemůže být zobrazena při opětovném načtení all-in-one souboru.
31
Po kliknutí na tlačítko Load AIO project se zobrazí tento jednoduchý dialog:
Tlačítko Cancel toto okno zavře. Tlačítko Browse otevře dialog prakticky totožný s dialogem pro ukládání souboru. Tady je vybrán soubor, který uživatel chce načíst do QGIS. Po vybrání souboru se v textové řádce zobrazí název souboru a cesta k tomuto souboru. Tlačítkem OK se nahrají data obsažená v tomto souboru do QGISu. Vrstvy se zobrazí v seznamu vrstev a korektně uložená data se vykreslí v mapovém okně.
32