Na začátku bych chtěl poděkovat vedoucímu bakalářské práce Prof. Ing. Aleši Čepkovi, CSc za výuku předmětů Informatika 1,2,3, Projekt - Informatika a za vedení mé bakalářské práce. Dále bych chtěl poděkovat Ing. Arnoštovi Müllerovi a Ing. Vladimírovi Holubcovi za poskytnuté konzultace ohledně ArcGIS.
České vysoké učení technické v Praze Fakulta stavební katedra geomatiky BAKALÁŘSKÁ PRÁCE Testování ArcGIS Runtime SDK pro Qt Testing ArcGIS Runtime SDK for Qt Autor: Petr Bezděka Vedoucí práce: Prof. Ing. Aleš Čepek, CSc. Praha, 2015
Název práce: Testování ArcGIS Runtime SDK pro QT Autor: Petr Bezděka Katedra: Katedra geomatiky Vedoucí bakalářské práce: Prof. Ing. Aleš Čepek, CSc. e-mail vedoucího: cepek@fsv.cvut.cz Abstrakt Cílem této bakalářské práce je praktické ověření možností využití ArcGIS Runtime SDK pro Qt v prostředí MS Windows a Linux. Tato bakalářská práce obsahuje krátké seznámení s Qt, zmíněny jsou také další knihovny vyvíjené společností ESRI v rámci projektu ArcGIS for Developers. Testování knihovny pro Qt je zacíleno na její instalaci a probíhá pod základní licencí Devoleper. V rámci testování jsou rozebrány různé způsoby načítání mapových podkladů do vyvíjených aplikací. Možnosti knihovny ArcGIS Runtime SDK pro Qt jsou demonstrovány na vybraných ukázkových příkladech napsaných v deklarativním vysokoúrovňovém skriptovacím jazyku QML. Klíčová slova: ArcGIS for Developers, ArcGIS Runtime SDK pro Qt, Qt Creator, QML Title: Testing ArcGIS Runtime SDK for QT Author: Petr Bezděka Department: Department of Geomatics Supervisor: Prof. Ing. Aleš Čepek, CSc. Supervisor s e-mail address: cepek@fsv.cvut.cz Abstract Goal of work is practical verification of using possibilities ArcGIS Runtime SDK for Qt in MS Windows and Linux. It contains short familiarization with Qt, there are included others libraries produced by ESRI within ArcGIS Developers project. Testing library for Qt is focused around instalation and it works with license Developer. There are explained several way of loading maps for apps. Possibilities are demonstrated on selected examples coded in QML. Keywords: ArcGIS for Developers, ArcGIS Runtime SDK for Qt, Qt Creator, QML II
Prohlašuji, že jsem svou bakalářskou práci napsal samostatně a výhradně s použitím citovaných pramenů. Souhlasím se zapůjčováním práce a jejím zveřejňováním. V Praze dne 15. května 2015 Petr Bezděka V
OBSAH Abstrakt Zadání práce II III 1 Úvod 1 2 Vývojové prostředí 3 2.1 Qt............................................. 3 2.1.1 Qt Quick a QML................................ 4 3 ESRI a ArcGIS 7 3.1 ArcGIS for Developers.................................. 7 3.1.1 ArcGIS Web Api................................ 7 3.1.2 ArcGIS Runtime SDK.............................. 8 3.1.3 Licence...................................... 8 4 Zprovoznění ArcGIS Runtime SDK pro Qt 9 4.1 Linux........................................... 9 4.1.1 Instalace Qt................................... 9 4.1.2 Instalace ArcGIS Runtime SDK pro Qt.................... 9 4.1.3 Sestavení testovací aplikace.......................... 9 4.2 Windows......................................... 11 4.2.1 Instalace Microsoft Visual Studio....................... 11 4.2.2 Instalace Microsoft WinDbg.......................... 11 4.2.3 Instalace Qt................................... 11 4.2.4 Instalace ArcGIS Runtime SDK pro Qt.................... 12 4.2.5 Sestavení testovací aplikace.......................... 12 4.2.6 Příprava Windows pro vývoj aplikací v Qt na Android.......... 12 5 Mapové podklady 15 5.1 Podklady uložené v lokálním zařízení......................... 15 5.1.1 Local Tiled Layer (*.tpk)............................ 15 5.1.2 Local Dynamic Layer (*.mpk)......................... 17 5.1.3 Zobrazování mapového podkladu na koncovém zařízení......... 17 5.2 Podklady stahované z ArcGIS Online......................... 20 5.3 Podklady připojené přes službu WMS......................... 20 6 Ukázkové aplikace 21 6.1 Aplikace s kešovaným mapovým podkladem.................... 22 VII
OBSAH 6.2 Prohlížeč kešovaných mapových podkladů...................... 24 6.3 Kešované a dynamické mapové podklady v jedné aplikaci............. 26 6.4 Přidání grafických prvků do mapy........................... 27 6.5 Aplikace s připojeným WMS serverem........................ 31 7 Závěr 37 8 Literatura 39 9 Seznam obrázků 41 VIII
KAPITOLA PRVNÍ ÚVOD Na podzim roku 2014 byl na webovém portálu Root.cz zveřejněn článek o Qt DeveloperDays 2014, ve kterém jsem se poprvé dočetl o existenci knihovny ArcGIS Runtime SDK pro Qt.[1] Pomocí této knihovny lze v Qt vytvářet mapové aplikace, a to včetně editace, geokódování, vyhledávání tras a vizualizace dat. Toto téma mě velice zaujalo a po nabídce pana profesora Čepka zabývat se testováním této knihovny v rámci mé bakalářské práce jsem neváhal a začal se tomuto tématu věnovat. Cílem této práce je tedy otestovat funkčnost a možnosti ArcGIS Runtime SDK pro Qt. Testování bude probíhat pod operačním systémem Linux a MS Windows. Součástí této práce je také pokus o přípravu Qt pro vývoj aplikace pro mobilní zařízení se systémem Android. Během testování proběhne všeobecné základní seznámení s ArcGIS Runtime SDK, jejich různými typy a jednotlivými licencemi. Zaměřeno bude také na podporované možnosti připojení různých mapových podkladů. Knihovna ArcGIS Runtime SDK pro Qt obsahuje C++ API a QML API. Obě dvě rozhraní nabízejí vypracované ukázkové aplikace. V rámci této práce proběhne testování vybraných ukázkových aplikací. Veškeré podklady pro tuto knihovnu jsou zveřejněny na oficiálních internetových stránkách. [2] Obrázek 1.1: Internetové stránky ArcGIS Developers for Qt 1
KAPITOLA DRUHÁ VÝVOJOVÉ PROSTŘEDÍ Aktuálně existují různá vývojová prostředí pro tvorbu aplikací. Například Microsoft Visual Studio, NetBeans, Adobe Air a další. Jedná se vlastně o sady nástrojů, které pomáhají vývojářům ladit programy, vyhledávat chyby a udržovat přehlednost kódu. Většina vývojových prostředí je zaměřena pro konkrétní platformu nebo konkrétní programovací jazyk. Existují však i výjimky. V rámci této bakalářské práce budeme pracovat právě s jednou z nich, knihovnu od společnosti ESRI budeme testovat v multiplatformním vývojovém prostředí Qt. 2.1 Qt Jak již bylo výše uvedeno, Qt je integrované vývojové prostředí (IDE = Integrated Development Environment). V dnešní době se jedná o výborný nástroj pro tvorbu multiplatformních programů. Pomocí Qt můžeme tedy vyvíjet aplikace nezávisle na platformě (Linux, Windows, OS X, ios, Android...). Významnou součástí Qt jsou nástroje Qt Designer, pomocí něhož lze intuitivně vytvářet grafické rozhraní, a Qt Assistant, který obsahuje rozsáhlou dokumentaci. Qt Creator obsahuje propracovaný editor pro programovací jazyk C++. Nemůžeme ovšem říci, že Qt je jen knihovna pro tento programovací jazyk, existuje například i pro C, Javu, Python, Ruby a další. Silným nástrojem je Qt Quick, který pomocí speciálního skriptovacího jazyka QML (QML = Qt Meta Language) umožňuje vývojářům a návrhářům tvořit vizuálně zajímavé aplikace především pro mobilní platformy, a to bez použití C++. Vývoj aplikací může probíhat pod licencí LGPL, existují ale také licence pro komerční účely, které jsou rozšířeny o další nástroje (např. Qt Charts pro vytváření grafů atd.). Qt vyvíjela společnost Trolltech již od roku 1999. V roce 2008 ho koupila firma Nokia, která v Qt soustředila mobilní vývoj pro Symbian a MeeGo Harmattan. Poté, co Nokie začala spolupracovat s Microsoftem a do svých nových smartphonů začala uvádět operační systém Windows Phone, se pomalu začal z Qt stávat open source projekt. V roce 2011 práva na provoz podpůrných služeb a prodej licencí pro komerční účely zakoupila od Nokie společnost Digia. Digia ze své Qt divize založila samostatnou společnost The Qt Company, a právě tato společnost koncem roku 2014 představila zatím 3
Vývojové prostředí poslední verzi Qt 5.4, která mimo jiné obsahuje vylepšené nástroje pro vývoj aplikací na moderních mobilních platformách. Pro Android se příchodem nové verze například zrychlil start aplikací a zmenšily se instalační balíčky. Vylepšeny byly QtQuick Controls (modul obsahující sadu ovládacích prvků), které mají oproti předchozí verzi pro běžného uživatele přirozenější vzhled. Právě díky těmto změnám začínají Qt používat čím dál více i mobilní vývojáři pro ios a Android. Do budoucna ale společnost údajně také spoléhá na zabudovanou elektroniku v automobilovém průmyslu, ve kterém se předpokládá rychlý vývoj podobný vývoji trhu s chytrými telefony. I když je Qt projekt stále ztrátovou záležitostí, jedná se o nejpoužívanější crossplatformu pro vývoj aplikací. Tento fakt potvrzuje i krok společnosti ESRI, která pro Qt v roce 2014 představila ArcGIS Runtime SDK. [1] 2.1.1 Qt Quick a QML V předchozí kapitole bylo naznačeno, že se v Qt dají aplikace vytvářet i bez větších znalostí C++, který je u klasického Qt brán jako primární programovací jazyk. Pokud v aplikaci vývojář nebude potřebovat sofistikovanější funkce, jako například načítání textových souborů, nemusí při vývoji aplikace C++ vědomě použít. Jelikož ArcGIS Runtime SDK pro Qt podporuje tvorbu programů i v QtQuick, musíme se u tohoto modulu, a potažmo QML, zastavit. QML je deklarativní vysokoúrovňový skriptovací jazyk, který usnadňuje programátorům tvorbu graficky efektivních aplikací. Používá se jak k popisu vzhledu samotné aplikace, tak i jejího chování. Struktura kódu může některým připomínat HTML v kombinaci s CSS. Velkou výhodou je fakt, že kód psaný v QML je na první pohled čitelný a to dokonce i ve složitějších projektech. Programátor dostává možnost vytvářet interaktivní aplikace s podporou různých animací, skriptování a renderování obsahu. Qt Quick byl vyvinut především pro mobilní platformy a jeho velkou výhodou v dnešní době je právě kompatibilita s ios a Androidem. Logiku jazyka QML si ukážeme na následujícím kódu: import QtQuick 1.0 Rectangle { width: 300 height: 300 color: "black" Text { id: texthello anchors { verticalcenter: parent.verticalcenter; left: parent.left; leftmargin: 50 text: "Hello World!"; color: "white"; opacity: 0.0 4
Qt font.pixelsize: parent.height / 8 Component.onCompleted: { texthello.opacity = 1.0 Na třetím řádku je použit základní vizuální element Rectangle. Dědičnost objektů je zde deklarována složenými závorkami. Na první pohled je tedy zjevné, že objekt Text je potomkem objektu Rectangle. U nastavování parametrů u objektu Text je na šestnácté řádce vidět, že velikost textu je závislá na výšce rodičovského prvku Rectangle. V ukázkovém skriptu stojí ještě za zmínku identifikátor id na řádce devět, pomocí něhož se můžeme na prvek odkazovat. 5
KAPITOLA TŘETÍ ESRI A ARCGIS ESRI je společnost zabývající se vývojem softwaru pro práci s geografickými informačními systémy. Vlajkovou lodí této společnosti je systém ArcGIS, který obsahuje tři základní aplikace (ArcMap, ArcCatalog, ArcToolbox). Systém je určen pro tvorbu mapových podkladů a obsahuje nástroje pro hloubkové analýzy. 3.1 ArcGIS for Developers V rámci projektu ArcGIS for Developers společnost ESRI publikuje pro různá rozhraní knihovny, které obsahují nástroje programu ArcGIS. Tyto knihovny můžeme rozdělit na Web API (nástroje pro vývoj webových aplikací) a Runtime SDK (nástroje zaměřené na vývoj aplikací pro určité platformy a zařízení). [3] Web API JavaScript - knihovna objektově orientovaného programovacího jazyka Web AppBuilder - framework pro tvorbu vlastních widgetů a motivů Esri Leaflet Runtime SDK Android - vývoj pro Android ios - vývoj pro Apple iphone, ipod touch a ipad Java - vývoj pro Windows a Linux pomocí jazyka Java Mac OS X - vývoj pro MAC.Net - vývoj pro Windows a Windows Phone Qt - vývoj pro Windows, Linux, Android a ios 3.1.1 ArcGIS Web Api Pro vývojáře webových aplikací ESRI nabízí rozsáhlou knihovnu napsanou v programovacím jazyku JavaScript, která v současné době podporuje HTML 5 a CSS 3. Pro 7
ESRI a ArcGIS webové aplikace existují v rámci projektu Web AppBuilder předpřipravené widgety, které můžeme jednoduše do aplikací připojovat. Vývoj těchto nástrojů je zacílen na webové prohlížeče: Chrome Firefox Safari 3+ Internet Explorer 8+ Používání ArcGIS Web Api je podmíněno založením účtu pro komerční účely na ArcGIS Online, které je zpoplatněno. 3.1.2 ArcGIS Runtime SDK ArcGIS Runtime SDK jsou od základu postaveny přímo na programovacím jazyku C++. Knihovny jsou přizpůsobeny pro mobilní, desktopové a vestavěné systémy (embedded system). Tyto knihovny umožňují nejen zobrazovat jednoduché mapy, pomocí nichž lze dokonce provádět i pokročilé analýzy v rámci řešení konkrétních GIS úloh. Aplikace mohou být připojeny na ArcGIS Online nebo mohou fungovat v offline režimu. V aplikacích můžeme vytvořit graficky propracované mapové podklady, které jsou postaveny na reálných geodeticky zaměřených datech. 3.1.3 Licence Knihovny ArcGIS Runtime SDK jsou poskytovány pod třemi druhy licencí: Developer License - licence určená k vývoji a testování aplikací, v mapách musí být zobrazen vodotisk loga společnosti ESRI Basic License - po registraci aplikace na internetové stránce věnované "ArcGIS for Developers"a použití vygenerovaného "Client ID"můžeme využívat téměř všechny funkcionality knihovny. Omezení této licence spočívá pouze v offline režimu, při kterém licence nepodporuje určité funkce knihovny - viz. tabulka. Standard License - licence umožňuje po přihlášení na ArcGIS Online odemknout podporu všech funkcí včetně plné podpory offline režimu. Funkce v offline režimu Developer Basic Standard Zobrazování mapy + + + Geokódování + + Vyhledávání tras + + Editace a synchronizace + + V průběhu testování knihovny ArcGIS Runtime SDK bylo zjištěno, že licence Developer (určená pro vývoj a testování aplikací) nepodporuje připojení mapových podkladů ve formátu *.mpk. Tato problematika je více popsána v kapitole týkající se konkrétně tomuto formátu. 8
KAPITOLA ČTVRTÁ ZPROVOZNĚNÍ ARCGIS RUNTIME SDK PRO QT V této kapitole si krok po kroku projdeme samotnou instalaci ArcGIS Runtime SDK pro Qt, a to jednotlivě pro platformy Linux a Windows. Na závěr se ještě pokusíme na obou dvou platformách připravit prostředí Qt pro tvorbu a testování aplikací pro Android. 4.1 Linux Instalace proběhla na Ubuntu 14.04 "Trusty Tahr". Testováno bylo v prostředí Qt 5.4.1. Testována byla verze ArcGIS Runtime SDK pro Qt 10.2.3. 4.1.1 Instalace Qt Po stažení instalačního souboru z oficiálních stránek Qt (LGPL licence) instalace proběhla standardním způsobem. [4] 4.1.2 Instalace ArcGIS Runtime SDK pro Qt Pro stažení knihovny je nutná registrace na stránkách developers.arcgis.com. Poté si můžeme knihovnu ArcGIS Runtime SDK pro Qt stáhnout. Knihovnu nainstalujeme např. do implicitního umístění /arcgis. Při samotné instalaci se nevyskystly žádné komplikace. [2] 4.1.3 Sestavení testovací aplikace V Qt si vytvoříme nový projekt z předpřipravené šablony "ArcGIS Runtime SDK 10.2.3. for Qt application". Při sestavování testovací aplikace nás Qt upozorní na první chybu: Map.h: No such file or directory Tento problém vyřešíme v souboru *.pro dopsáním "includepath": INCLUDEPATH += $$PWD/../../arcgis/runtime_sdk/qt10.2.3/sdk/include/ 9
Zprovoznění ArcGIS Runtime SDK pro Qt Poté při sestavování narazíme na další problém, a to chybějící knihovny Runtime. Do projektu tyto externí knihovny připojíme v souboru *.pro kliknutím na pravé tlačíko myši a poté "Add Library". Do souboru *.pro se vypíše následující kód: unix:!macx: LIBS += -L$$PWD/../../arcgis/runtime_sdk/qt10.2.3/ /ArcGISRuntime10.2.3/Client64/ -lesriruntimeqt INCLUDEPATH += $$PWD/../../arcgis/runtime_sdk/qt10.2.3/ /ArcGISRuntime10.2.3/Client64 DEPENDPATH += $$PWD/../../arcgis/runtime_sdk/qt10.2.3/ /ArcGISRuntime10.2.3/Client64 unix:!macx: LIBS += -L$$PWD/../../arcgis/runtime_sdk/qt10.2.3/ /ArcGISRuntime10.2.3/Client64/ -lc++ INCLUDEPATH += $$PWD/../../arcgis/runtime_sdk/qt10.2.3/ /ArcGISRuntime10.2.3/Client64 DEPENDPATH += $$PWD/../../arcgis/runtime_sdk/qt10.2.3/ /ArcGISRuntime10.2.3/Client64 Pro správnou funkčnost musíme ale před tímto krokem manuálně vyrobit symbolický odkaz pomocí příkazu: ln -s libc++.so.1 libc++.so Po vyřešení těchto překážek Qt nevrací žádnou jinou chybovou hlášku. Aplikace se v pořádku sestaví a spustí pod licencí Developer. V případě potřeby vývoje aplikací pod jinými licencemi můžeme Client ID vyplnit v souboru main.cpp příkazem: EsriRuntimeQt::ArcGISRuntime::setClientId("id"); Obrázek 4.1: Neznámý hlavičkový soubor Map.h 10
Windows 4.2 Windows Instalace byla provedena na operačním systému MS Windows 8.1. Testováno bylo v prostředí Qt 5.4.1. Testována byla verze ArcGIS Runtime SDK pro Qt 10.2.5. 4.2.1 Instalace Microsoft Visual Studio Nejdříve si musíme stáhnout a nainstalovat Mircosoft Visual Studio, jelikož pro sestavení ArcGIS Runtime SDK pro Qt je používán jeho kompilátor. Pokud máte na svém počítači nainstalovanou starší verzi Visual Studia, ESRI doporučuje před instalací nové verze původní verzi odinstalovat. [5] Obrázek 4.2: Stažení a instalace Microsoft Visual Studio 4.2.2 Instalace Microsoft WinDbg Poté musíme stáhnout a nainstalovat ladící nástroj Microsoft WinDbg, který používá Qt Creator společně s Visual Studiem. Postačí nám stáhnout samostatný WinDbg, a to samozřejmě ve verzi, která je určená pro náš operační systém. [6] 4.2.3 Instalace Qt Dalším krokem je stáhnutí a následná instalace samotného Qt. K účelům sestavení a testování ArcGIS Runtime SDK pro Qt nám postačí LGPL licence. [4] 11
Zprovoznění ArcGIS Runtime SDK pro Qt Obrázek 4.3: Stažení WinDbg 4.2.4 Instalace ArcGIS Runtime SDK pro Qt Po registraci a následném přihlášení na stránkách developers.arcgis.com si můžeme knihovnu ArcGIS Runtime SDK pro Qt stáhnout. Instalace probíhá standardním způsobem. Pro lepší orientaci v celé knihovně je doporučeno nainstalovat i ukázkové příklady jak pro QML, tak pro C++. [2] 4.2.5 Sestavení testovací aplikace Po nainstalování všech potřebných nástrojů se nám při zakládání nového projektu v Qt (Ctrl+N) zobrazí mezi předpřipravenými projekty položka "ArcGIS"se šablonami: ArcGIS Runtime 10.2.5 Qt Quick Application ArcGIS Runtime 10.2.5 Qt Widgets Application Pokud chceme aplikaci vyvíjet v QML, volíme Qt Quick Application. Pokud máme v plánu aplikaci tvořit v C++, volíme Qt Widgets Application. Pro sestavení aplikace zaškrtneme v dalším kroku pouze kit Qt 5.4.1 MSVC2013 64 bit, který obsahuje kompilátor Microsoft Visual C++ 12.0. U zakládání nové aplikace přes Qt Quick Application po nás Qt ještě požaduje parametry dané aplikace. Pro testování postačí vyplnit název a popis. Pro komerční účely bychom museli vyplnit i Client ID. Při zakládání Qt Widgets Application se Client ID vyplňuje ručně přímo do souboru main.cpp příkazem: EsriRuntimeQt::ArcGISRuntime::setClientId("id"); 4.2.6 Příprava Windows pro vývoj aplikací v Qt na Android Příprava Qt pro vývoj aplikací pro operační systém Android byla testována pod operačním systémem Microsft Windows. Nejdříve byly staženy a postupně nainstalovány 12
Windows balíčky The Android SDK Tools, The Android NDK, Apache Ant a Java SE Development Kit (JDK). V operačním systému Windows byly nastaveny v ovládacích panelech uživatelské proměnné JAVA HOME a ANDROID NDK ROOT. [2] Ovládací panely > Systém > > Upřesnit nastavení systému > Proměnné prostředí Obrázek 4.4: Nastavení proměnného prostředí pro Windows Poté byl stažen Google USB Drive, zip byl dekomprimován a pomocí příkazu byla zkontrolována jeho funkčnost: cd Android\adt-bundle-windows-x86_64-<version>\sdk\platform-tools adb.exe V Qt byly nastaveny cesty k nástrojům The Android SDK Tools, The Android NDK, Apache Ant a Java SE Development Kit (JDK): Tools > Options > Android Kvůli neznámé chybě se nepodařilo nastavit Android Kit. V rámci této bakalářské práce tedy bohužel neproběhlo testování ukázkových kódů knihovny ArcGIS Runtime SDK pro mobilní aplikace s operačním systémem Android. 13
KAPITOLA PÁTÁ MAPOVÉ PODKLADY Prostřednictvím knihovny ArcGIS Runtime SDK můžeme v Qt vytvářet mapové aplikace. V návaznosti na budoucí používání aplikace si musíme vybrat jeden ze způsobů, jak mapové podklady budeme do aplikace nahrávat, respektive odkud bude aplikace mapové podklady čerpat. Jednotlivé způsoby načítání mapových podkladů můžeme rozdělit do dvou hlavních kategorií: Mapové podklady jsou uloženy v lokálním zařízení Mapové podklady stahujeme ze služby ArcGIS Online 5.1 Podklady uložené v lokálním zařízení Výhoda této metody je nesporná. Mapové podklady se do aplikace nahrají vždy, a to nezávisle na tom, zda je zařízení, na kterém aplikace běží, připojeno k internetu. Jelikož jsou data fyzicka uložena v zařízení, jsme omezeni velikostí podkladových map. Tato nevýhoda je výrazná především pro aplikace určené pro mobilní zařízení. V neposlední řadě nesmíme zapomenout na omezení licence Basic (kapitola 3.1.3.). Pokud tedy chceme využívat všechny nástroje knihovny ArcGIS Runtime SDK v offline režimu, musíme aplikace vydávat pod licencí Standard. Pokud se tedy rozhodneme podkladové mapy ukládádat přímo do lokálního zařízení, máme k dispozici dva formáty, které můžeme použít: Local Tiled Layer (*.tpk) Local Dynamic Layer (*.mpk) 5.1.1 Local Tiled Layer (*.tpk) V Local Tiled Layer je mapový podklad kešovaný. To znamená, že se mapa skládá z jednotlivých čtverců, které jsou generovány pro jednotlivá měřítka. Tento způsob nahrávání mapových podkladů je rychlejší než Local Dynamic Layer, jelikož aplikace načítá konkrétní předpřipravené čtverce pro určitá měřítka a jednotlivě nevykresluje všechny prvky výřezu mapy. 15
Mapové podklady Ukázka připojení formátu *.tpk v QML ArcGISLocalTiledLayer { path: ArcGISRuntime.installDirectory + "/sdk/samples/data/tpks/topographic.tpk" Z ukázky vyplývá, že připojení v QML probíhá přes třídu ArcGISLocalTiledLayer. Ukázka připojení formátu *.tpk v C++ HLAVIČKOVÝ SOUBOR: ------------------... namespace EsriRuntimeQt {... class Map; class ArcGISLocalTiledLayer;... #include <QMainWindow> class Testovaci_aplikace : public QMainWindow { Q_OBJECT public: Testovaci_aplikace (QWidget *parent = 0); ~Testovaci_aplikace (); private:... EsriRuntimeQt::Map* m_map; EsriRuntimeQt::MapGraphicsView* m_mapgraphicsview; EsriRuntimeQt::ArcGISLocalTiledLayer* m_tiledlayer;... ;... CPP SOUBOR: ----------- QString tiledbasemaplayer = pathsampledata + "tpks" + QDir::separator() + "Topographic.tpk"; m_tiledlayer = new EsriRuntimeQt::ArcGISLocalTiledLayer(tiledBaseMapLayer, this); m_map->addlayer(m_tiledlayer); 16
Podklady uložené v lokálním zařízení Jak je v příkladu pro C++ demonstrováno, pro připojení mapových podkladů ve formátu *.tpk musíme v hlavičkovém souboru definovat třídy EsriRuntimeQt::Map a Esri- RuntimeQt::ArcGISLocalTiledLayer. 5.1.2 Local Dynamic Layer (*.mpk) Jak z popisu Local Tiled Layer vyplývá, při použití metody Local Dynamic Layer se vykreslují veškeré prvky v aktuálním výřezu mapy, což ve srovnání s kešovanými mapovými formáty může způsobovat pomalejší načítání podkladových map. Pokud připojení podkladových dat v *.mpk chceme otestovat pomocí QML, v šabloně projektu ArcGIS Runtime QtQuick Application tuto možnost vůbec nenalezneme. V QML api nebyla ani nalezena žádná třída, která by toto připojení realizovala. Testování připojení podkladových dat ve formátu *.mpk tedy probíhalo v C++, u kterého byl použit podobný postup jako u připojení *.tpk. V hlavičkovém souboru byla definována třída EsriRuntimeQt::LocalFeatureService, a to pomocí připojení dalšího hlavičkového souboru "LocalFeatureService.h". Při sestavení programu a spuštění aplikace Qt vypisuje chybovou hlášku, jelikož tato služba není spustitelná pod licencí Developer. Pod jinou licencí testování neproběhlo. Obrázek 5.1: Omezení licence pro *.mpk 5.1.3 Zobrazování mapového podkladu na koncovém zařízení Při načítání map z lokálního uložiště definujeme absolutní cestu k podkladovým mapám. Pokud ale máme v plánu aplikaci publikovat na dalších zařízeních, musíme cestu nastavit tak, aby vždy odpovídala skutečnému adresáři, ve kterém jsou mapové pod- 17
Mapové podklady klady uloženy. Pro tyto účely máme možnost využít plug-in ArcGIS Extras, a to konkrétně dvěma způsoby. Relativní cesta mapového podkladu Pokud chceme na mapový podklad odkazovat relativním způsobem, musíme mapový podklad pomocí zmiňovaného pluginu zkopírovat do výchozího adresáře, ve kterém je aplikace nainstalována. Pro každý operační systém se výchozí adresář liší. Android /sdcard/arcgis/runtime/data Windows %userprofile%\arcgis\runtime\data Linux $HOME/ArcGIS/Runtime/Data Za předpokladu, že mapové podklady jsou nakopírovány ve stejném adresáři jako je aplikace nainstalovaná, můžeme mapové podklady volat přes funkci System.userHomeFolder. import ArcGIS.Extras 1.0 property string runtimepath: System.userHomeFolder.filePath("ArcGIS/Runtime/Data") property string localtpk: runtimepath + "/Topographic.tpk" Zabalit mapový podklad jako Qt resource Qt standardně podporuje čtení z vložených zdrojů (embedded resources). ESRI Runtime Core ovšem tento způsob nepodporuje. Plug-in ArcGIS Extras ale obsahuje funkci copyfile, pomocí které můžeme podkladová data z qrc zkopírovat do konkrétního umístění na disku. Nejdříve musíme v Qt pravým tlačítkem kliknout na qrc soubor a zvolit možnost "Add an existing file"(přidat existující soubory) a vybrat mapové podklady. Poté prostřednictvím javascriptové funkce copyfile nakopírujeme data do adresáře. 18
Podklady uložené v lokálním zařízení import QtQuick 2.3 import QtQuick.Controls 1.2 import ArcGIS.Runtime 10.25 import ArcGIS.Extras 1.0 ApplicationWindow { id: appwindow width: 800 height: 600 title: "offline_test" property string runtimepath: System.userHomeFolder.filePath("ArcGIS/Runtime") property string datapath: runtimepath + "/Data" property string inputtpk: "Topographic.tpk" property string outputtpk: datapath + "/" + inputtpk function copylocaldata(datapath) { System.userHomeFolder.makePath(dataPath); resourcefolder.copyfile(inputtpk, outputtpk); return outputtpk FileFolder { id: resourcefolder path: ":/Data" Map { anchors.fill: parent ArcGISLocalTiledLayer { path: copylocaldata(inputtpk) Volba výchozího adresáře System.userHomeFolder.filePath() opět záleží na operačním systému. Princip správného zvolení výchozího adresáře je totožný jako u načítání mapových podkladů pomocí relativní cesty. Tato metoda je určená pouze pro menší mapové podklady, jelikož je náročná na výkon zařízení. Doporučuje se tedy používat jen pro formát tpk nebo geodatabáze menšího rozsahu. 19
Mapové podklady 5.2 Podklady stahované z ArcGIS Online ArcGIS Online je webová služba, která umožňuje tvorbu map, jejich sdílení a zobrazování v internetovém prohlížeči, ArcGIS Desktop nebo mobilních zařízeních. V rámci ArcGIS Online můžeme nahrávat jak kešované, tak dynamické mapové podklady. Rozdíl mezi těmito dvěma způsoby je totožný jako v lokálních podkladech. Jelikož se data do výřezu zobrazované mapy načítají přímo z ArcGIS Online, můžeme si při stabilním internetovém připojení dovolit pracovat s datově náročnějšími mapovými podklady. 5.3 Podklady připojené přes službu WMS WMS je anglická zkratka pro Web Map Service. Jedná se o standard vyvinutý OGC (Open Geospatial Consortium) a využívá se pro sdílení mapových podkladů v rastrové podobě. Pro tyto účely se používají především formáty *.jpg, *.png, *.tiff. Obrazová data jsou georeferencovaná, je v nich tedy jasně určen referenční souřadnicový systém a hrany obdélníku ohraničujícího obrazová data jsou definována souřadnicemi. Připojení WMS serveru v QML probíhá prostřednictvím třídy WmsDynamicMap- ServiceLayer: WmsDynamicMapServiceLayer { url: "http://services.cuzk.cz/wms/wms.asp?" 20
KAPITOLA ŠESTÁ UKÁZKOVÉ APLIKACE ESRI pro knihovnu ArcGIS Runtime SDK pro Qt připravila řadu ukázkových kódů, na kterých demonstruje jednotlivé možnosti této knihovny. Příklady jsou s interaktivním náhledem, zdrojovými kódy a popisem k dispozici jako samostatné aplikace, a to jak pro C++, tak pro QML: ArcGIS Runtime Qt Samples 10.2.5 ArcGIS Runtime Qml Samples 10.2.5 Ukázkové aplikace jsou obsaženy v instalačním balíčku ArcGIS Runtime SDK pro Qt. Jak již bylo zmíněno ve čtvrté kapitole, jejich instalace není povinná. Například pro Qt Samples existuje prezentace na oficiálních webových stránkách ArcGIS Developers. [7] V rámci této bakalářské práce bylo původně zamýšleno ukázkové aplikace testovat v Qt pro programovací jazyk C++. V průběhu testování bylo zjištěno, že společnost ESRI pro tyto ukázkové kódy neuvolnila důležité hlavičkové soubory. Jak je z příkladu pod odstavcem vidět, většina ukázkových kódů napsaných v C++ využívá hlavičkový soubor rtsample.h. Na ten samý problém bohužel narazíme i u dalších hlavičkových souborů. Testování knihovny v C++ tedy vyžaduje kompletní znalost uživatelské příručky, což není předmětem této bakalářské práce. #ifndef TILED_LAYER_VIEWER_H #define TILED_LAYER_VIEWER_H #include "pch.h" #include "rtsample.h" namespace Ui { class tiled_layer_viewer; class tiled_layer_viewer : public RTSample { Q_OBJECT... 21
Ukázkové aplikace Na základě výše uvedených důvodů testování ukázkových aplikací proběhlo v Qt pomocí QML a níže si představíme několik základních, přesto zajímavých, výstupů. [8] 6.1 Aplikace s kešovaným mapovým podkladem Aplikace zobrazí předem nadefinovaný kešovaný mapový podklad ve formátu *.tpk, a to pomocí třídy ArcGISLocalTiledLayer. V tomto příkladu je také znározněno, jakým způsobem fungují zaškrtávací tlačítka. import QtQuick 2.3 import QtQuick.Controls 1.2 import QtQuick.Controls.Styles 1.2 import ArcGIS.Extras 1.0 import ArcGIS.Runtime 10.25 ApplicationWindow { id: appwindow width: 800 height: 600 title: "Tiled layer" property double scalefactor: System.displayScaleFactor Map { anchors.fill: parent wraparoundenabled: checkboxwraparound.checked esrilogovisible: checkboxlogo.checked focus: true ArcGISLocalTiledLayer { path: "~/ArcGIS/Runtime/Data/tpks/Topographic.tpk" Rectangle{ color : "lightgrey" radius: 5 * scalefactor border.color: "black" opacity : 0.77 anchors{ fill: columncontrols margins: -10 * scalefactor 22
Aplikace s kešovaným mapovým podkladem Column { id: columncontrols anchors { left: parent.left top: parent.top margins: 20 * scalefactor spacing: 10 * scalefactor CheckBox { id: checkboxwraparound text: "Wrap Around Enabled" checked: true style: CheckBoxStyle { label: Text { text: control.text color:"black" CheckBox { id: checkboxlogo text: "ESRI Logo Visible" checked: true style: checkboxwraparound.style Rectangle { id: rectangleborder anchors.fill: parent color: "transparent" border { width: 0.5 * scalefactor color: "black" 23
Ukázkové aplikace 6.2 Prohlížeč kešovaných mapových podkladů Tato ukázková aplikace vychází z předchozího příkladu, jelikož také zobrazuje kešované mapové podklady pomocí třídy ArcGISLocalTiledLayer. Uživatel v ní má ale možnost prostřednictvím dialogového okna připojit jakýkoliv kešovaný mapový podklad. Pomocí funkce ArcGISRuntime.createObject("ArcGISLocalTiledLayer") a přidělením cesty získané z dialogového okna se do aplikace přidá nový mapový podklad. import QtQuick 2.3 import QtQuick.Controls 1.2 import QtQuick.Controls.Styles 1.2 import QtQuick.Dialogs 1.2 import ArcGIS.Extras 1.0 import ArcGIS.Runtime 10.25 ApplicationWindow { id: appwindow width: 800 height: 600 title: "Tiled layer viewer" property ArcGISLocalTiledLayer loadedtilelayer property double scalefactor: System.displayScaleFactor Map { id: mainmap anchors.fill: parent Rectangle { color: "lightgrey" radius: 5 border.color: "black" opacity: 0.77 anchors { fill: columncontrols margins: -10 * scalefactor Column { id: columncontrols spacing: 10 anchors { left: parent.left 24
Prohlížeč kešovaných mapových podkladů top: parent.top margins: 20 * scalefactor Text{ text: "Click on the Open Tiled Layer..." Button { text: qstr("open Tile Layer") style: ButtonStyle { label: Text { text: control.text color:"black" horizontalalignment: Text.AlignHCenter onclicked: filedialogbrowser.open(); FileDialog { id: filedialogbrowser namefilters: "(*.tpk)" onaccepted: { if (loadedtilelayer) mainmap.reset(); var layername = = System.resolvedPath(fileDialogBrowser.fileUrl); loadedtilelayer = = ArcGISRuntime.createObject("ArcGISLocalTiledLayer"); loadedtilelayer.path = layername; mainmap.addlayer(loadedtilelayer); Connections { target: loadedtilelayer onstatuschanged: { if (loadedtilelayer.status === Enums.LayerStatusErrored){ messagedialog.text += loadedtilelayer.error; messagedialog.text += " \n"; messagedialog.visible = true; 25
Ukázkové aplikace MessageDialog { id: messagedialog title: "Error" icon: StandardIcon.Warning modality: Qt.WindowModal standardbuttons: StandardButton.Ok Rectangle { anchors.fill: parent color: "transparent" border { width: 0.5 * scalefactor color: "black" 6.3 Kešované a dynamické mapové podklady v jedné aplikaci V rámci vývoje mapové aplikace můžeme služby, které do aplikace připojují jednotlivé mapy, kombinovat. V ukázce je dále znázorněno, jakým způsobem můžeme docílit toho, aby po načtení mapových podkladů do aplikace se okno aplikace zaostřilo na vybranou oblast. import QtQuick 2.3 import QtQuick.Controls 1.2 import ArcGIS.Extras 1.0 import ArcGIS.Runtime 10.25 ApplicationWindow { id: appwindow width: 800 height: 600 title: "Dynamic and Tiled layer online" Map { id: mainmap anchors.fill: parent hidingnodatatiles: false wraparoundenabled: true 26
Přidání grafických prvků do mapy focus: true ArcGISTiledMapServiceLayer { url: "http://server.arcgisonline.com/arcgis/rest/ /services/world_street_map/mapserver" ArcGISDynamicMapServiceLayer { url: "http://sampleserver1.arcgisonline.com/arcgis/rest/ /services/specialty/esri_statecityhighway_usa/mapserver" onstatuschanged: { if (status === Enums.MapStatusReady) mainmap.zoomto(usextent); Envelope { id: usextent xmax: -15000000 ymax: 2000000 xmin: -7000000 ymin: 8000000 spatialreference: SpatialReference { wkid: 102100 Rectangle { anchors.fill: parent color: "transparent" border { width: 0.5 * scalefactor color: "black" 6.4 Přidání grafických prvků do mapy Pomocí této aplikace můžeme do mapy přidávat různé bodové symboly. Pro zobrazování grafiky máme možnost použít třídu graphiclayer. Typy symbolů si nadefinujeme s využitím některého fontu (např. esrisms) a vložíme je do ComboBoxu. Pomocí Spin- 27
Ukázkové aplikace Boxu si můžeme nastavit velikost symbolu. Pro nastavení barvy symbolu použijeme colordialog. Po kliku do mapy si musíme určit aktuální polohu kurzoru myši a poté můžeme symbol prostřednictvím funkce graphicslayer.addgraphic(graphic) do mapy zaznamenat. import QtQuick 2.3 import QtQuick.Controls 1.2 import QtQuick.Controls.Styles 1.2 import QtQuick.Dialogs 1.2 import ArcGIS.Extras 1.0 import ArcGIS.Runtime 10.25 ApplicationWindow { id: appwindow width: 800 height: 600 title: "Add graphics" property double scalefactor: System.displayScaleFactor property alias graphiccolor: colorrectangle.color property alias graphicsize: sizespinbox.value GraphicsLayer { id: graphicslayer Map { id: map anchors.fill: parent wraparoundenabled: true focus: true ArcGISLocalTiledLayer { path: "~/ArcGIS/Runtime/Data/tpks/Topographic.tpk" onstatuschanged: { if(map.status === Enums.MapStatusReady) { graphicslayer.renderingmode = Enums.RenderingModeStatic; addlayer(graphicslayer); onmouseclicked: { var graphic = { 28
Přidání grafických prvků do mapy geometry: { spatialreference: {latestwkid: 3857,wkid:102100, x: mouse.mapx, y: mouse.mapy, symbol: { type: "esrisms", size: graphicsize, style: styles.get(stylescombo.currentindex).style, color: graphiccolor ; var id = graphicslayer.addgraphic(graphic); Rectangle { id: rectanglecontrols anchors { fill: columncontrols margins: -10 * scalefactor color: "lightgrey" radius: 5 * scalefactor border.color: "black" opacity: 0.77 MouseArea { anchors.fill: parent onclicked: (mouse.accepted = true) Row { id: columncontrols anchors { left: rootrectangle.left leftmargin: 20 * scalefactor top: rootrectangle.top topmargin: 20 * scalefactor spacing: 10 * scalefactor ComboBox { id: stylescombo width: 100 * scalefactor 29
Ukázkové aplikace model: ListModel { id: styles ListElement {name:"circle"; style: "esrismscircle" ListElement {name:"cross"; style: "esrismscross" ListElement {name:"x"; style: "esrismsx" ListElement {name:"square"; style: "esrismssquare" ListElement {name:"diamond"; style: "esrismsdiamond" textrole: "name" style: ComboBoxStyle { textcolor: "black" Rectangle { id: colorrectangle anchors.verticalcenter: parent.verticalcenter width: 20 * scalefactor height: 20 * scalefactor color: "red" MouseArea { anchors.fill: parent onclicked: { colordialog.color = graphiccolor; colordialog.open(); Label { text: "Size" color: "black" anchors.verticalcenter: parent.verticalcenter SpinBox { id: sizespinbox minimumvalue: 1 maximumvalue: 50 value: 15 style: SpinBoxStyle { textcolor:"black" 30
Aplikace s připojeným WMS serverem ColorDialog { id: colordialog title: "Graphic color" color: graphiccolor onaccepted: { graphiccolor = currentcolor; Rectangle { anchors.fill: parent color: "transparent" border { width: 0.5 * scalefactor color: "black" 6.5 Aplikace s připojeným WMS serverem Do aplikace je WMS server připojen pomocí třídy WmsDynamicMapServiceLayer. V ukázce je konkrétně připojen mapový podklad "Správní členění ČR"z ČÚZK. Na základě aktuální polohy kurzoru myši se vypisují souřadnice bodu. import QtQuick 2.3 import QtQuick.Controls 1.2 import ArcGIS.Runtime 10.25 ApplicationWindow { id: appwindow width: 800 height: 600 title: "WMS server" property double scalefactor: System.displayScaleFactor Map { id: mainmap anchors.fill: parent wraparoundenabled: true focus: true 31
Ukázkové aplikace WmsDynamicMapServiceLayer { url: "http://geoportal.cuzk.cz/wms_sph_pub/wmservice.aspx" MouseArea { anchors.fill: parent hoverenabled: true onpositionchanged: { var mappoint = mainmap..tomapgeometry(maptoitem(mainmap, mousex, mousey)); var normalpoint = mappoint..normalizecentralmeridianofgeometry(); coordstextdecimal.text = normalpoint.todecimaldegrees(6); utmtext.text = " UTM: " + normalpoint.toutm(0,true) + " "; mousetext.text = "Mouse: X=" + mousex.tostring() + + " Y=" + mousey.tostring(); Rectangle { id: rectanglecontrols color: "white" radius: 5 anchors { fill: rowcontrols margins: 10 * scalefactor Row { id: rowcontrols anchors { bottom: parent.bottom left: parent.left Text { id: coordstextdecimal visible: true Text { id: utmtext visible: false 32
Aplikace s připojeným WMS serverem Text { id: mousetext visible: false Button { id: buttonshowcoords text: Show more coordinates onclicked: { coordstextdecimal.visible = true; utmtext.visible = true; mousetext.visible = true; buttonshowcoords.visible = false; buttonhidecoords.visible = true; Button { id: buttonhidecoords text: Hide coordinates visible: false; onclicked: { utmtext.visible = false; mousetext.visible = false; buttonshowcoords.visible = true; buttonhidecoords.visible = false; 33
Ukázkové aplikace Obrázek 6.1: Aplikace s kešovaným mapovým podkladem Obrázek 6.2: Prohlížeč kešovaných mapových podkladů 34
Aplikace s připojeným WMS serverem Obrázek 6.3: Kešované a dynamické mapové podklady v jedné aplikaci Obrázek 6.4: Přidání grafických prvků do mapy 35
Ukázkové aplikace Obrázek 6.5: Připojení WMS serveru 36
KAPITOLA SEDMÁ ZÁVĚR Cílem mé bakalářské práce bylo otestovat možnosti knihovny ArcGIS Runtime SDK pro Qt. Samotná instalace knihovny pod Linuxem (verze 10.2.3.) proběhla v pořádku. Po sestavení programu bylo potřeba upravit soubor projektu *.pro (viz. kapitola 4.1.3.). Pod MS Windows byla testována nová verze knihovy, která vyšla v únoru 2015 (10.2.5.). Instalace i sestavení testovacího projektu při vhodně zvoleném kompilátoru (viz. kapitola 4.2.5.) proběhlo bez problémů. Příprava Qt pro vývoj aplikací pro operační systém Android se bohužel nepovedla (viz. kapitola 4.2.6.). V rámci dalšího seznámení s knihovnou byly vyzkoušeny různé způsoby připojení mapových podkladů. Původně měla být knihovna testována v programovacím jazyku C++. Po zjištění, že ESRI neposkytuje k ukázkovým aplikacím potřebné hlavičkové soubory (viz. kapitola 6.), bylo testování ukázkových kódů provedeno v QML. Tímto krokem nebyla knihovna otestována tak důkladně, jak bylo původně zamýšleno. Na druhou stranu se ukázal poměrně jednoduchý způsob, jak pomocí QML vytvářet základní mapové aplikace nezávisle na operačním systému a větších znalostí programovacích jazyků C++ nebo Java. Toto téma mě zaujalo a knihovně ArcGIS Runtime SDK pro Qt, případně jejím alternativám, bych se rád podrobněji věnoval v navazujícím magisterském studiu, například v rámci diplomové práce. 37
KAPITOLA OSMÁ LITERATURA [1] Root.cz: Qt DeveloperDays 2014 [online]. 2014 [cit. 2015-05-15]. Dostupné z: http://www.root.cz/clanky/qt-developerdays-2014-berlinskymedved-mruci-nad-prichazejici-verzi-qt-5-4/ [2] ArcGIS SDK for Qt: ArcGIS for Developers [online]. 2015 [cit. 2015-05-15]. Dostupné z: https://developers.arcgis.com/qt/ [3] ArcGIS for Developers [online]. 2015 [cit. 2015-05-15]. Dostupné z: https://developers.arcgis.com/ [4] Download Qt: Open Source and Commercial [online]. 2015 [cit. 2015-05-15]. Dostupné z: http://www.qt.io/download/ [5] Visual Studio: Microsoft Developer Tools [online]. 2015 [cit. 2015-05-15]. Dostupné z: https://www.visualstudio.com/ [6] WDK and WinDbg downloads [online]. 2015 [cit. 2015-05-15]. Dostupné z: https://msdn.microsoft.com/en-us/windows/hardware/hh852365 [7] ArcGIS for Developers: C++ Samples [online]. 2015 [cit. 2015-05-15]. Dostupné z: https://developers.arcgis.com/qt/cpp/sample-code/ [8] ArcGIS for Developers: QML Samples [online]. 2015 [cit. 2015-05-15]. Dostupné z: https://developers.arcgis.com/qt/qml/sample-code/ 39
SEZNAM OBRÁZKŮ 1.1 Internetové stránky ArcGIS Developers for Qt................ 1 4.1 Neznámý hlavičkový soubor Map.h..................... 10 4.2 Stažení a instalace Microsoft Visual Studio................. 11 4.3 Stažení WinDbg................................. 12 4.4 Nastavení proměnného prostředí pro Windows............... 13 5.1 Omezení licence pro *.mpk.......................... 17 6.1 Aplikace s kešovaným mapovým podkladem................ 34 6.2 Prohlížeč kešovaných mapových podkladů................. 34 6.3 Kešované a dynamické mapové podklady v jedné aplikaci........ 35 6.4 Přidání grafických prvků do mapy...................... 35 6.5 Připojení WMS serveru............................. 36 41