Univerzita Palackého v Olomouci Přírodovědecká fakulta Katedra geoinformatiky
Radek HÝBNER
NÁSTROJ PRO UMISŤOVÁNÍ POPISŮ V ARCGIS
Bakalářská práce
Vedoucí práce: Ing. Zdena Dobešová, Ph.D. Olomouc 2010
1
Prohlašuji, že jsem zadanou bakalářskou práci řešil sám a že jsem uvedl veškerou použitou literaturu.
Olomouc, 26. května 2010
……………………. 2
Děkuji Ing. Zdeně Dobešové, Ph.D., za odborné vedení, cenné rady a připomínky při tvorbě této bakalářské práce.
3
Obsah 1
Úvod .............................................................................................................................8
2
Cíle práce....................................................................................................................10
3
Technologie ESRI ......................................................................................................11
4
5
6
3.1
ESRI ....................................................................................................................11
3.2
ArcGIS ................................................................................................................11
3.3
Microsoft Visual Basic 6.5 a Visual Basic for Application ................................11
3.4
ArcObjects...........................................................................................................12
Popis vybraných skriptů z ESRI Support ...................................................................14 4.1
MapAnno2GeoAnno9 (AS13622) ......................................................................14
4.2
Find and Replace (AS13379) ..............................................................................15
4.3
AddCustomAnnoLayer (AS12900).....................................................................15
Metody a postup zpracování.......................................................................................17 5.1
Studium kartografických publikací a diplomových prací ...................................17
5.2
Osvojení práce s Microsoft Visual Basic Script..................................................17
5.3
Tvorba nástroje....................................................................................................17
5.4
Vytvoření archivu................................................................................................17
5.5
Tvorba www stránek ...........................................................................................18
5.6
Publikování na ESRI Support .............................................................................18
Nástroj pro umisťování popisů v ArcGIS ..................................................................19
6
6.1
Účel použití nástroje ............................................................................................19
6.2
Prostředí Visual Basic for Application ................................................................19
6.3
Příprava spuštění..................................................................................................21
6.4
Programové řešení ...............................................................................................21
6.4.1 Úvodní formulář ................................................................................................22 6.4.2 Řešení nástroje ..................................................................................................23 6.4.3 Nástroj pro hromadné procházení .....................................................................25 6.5
Ukázka praktického nasazení nástroje ...............................................................29
7
Diskuse .......................................................................................................................33
8
Závěr...........................................................................................................................36
9
Seznam použitých zdrojů ...........................................................................................37
Summary..............................................................................................................................39 Přílohy
7
1 Úvod Geografický informační systém je organizovaný, počítačově založený systém hardwaru, softwaru a geografických informací vyvinutý ke vstupu, správě, analytickému zpracování a prezentaci prostorových dat s důrazem na jejich prostorové analýzy. [m] Jednou z prezentací prostorových dat je mapa. Ta má kromě základních, matematických prvků i nadstavbové, mezi které patří i popisy. Používají se všude tam, kde samotnými grafickými znaky nelze dostatečně vyjádřit důležité vlastnosti a charakteristiky objektů a jevů. [c] Při sestavování mapového obrazu je nutno pro zobrazované prvky řešit umístění jejich popisu většinou individuálně. Popisná složka nesmí rušit kresbu, vzájemná provázanost kresby mapových značek a k nim příslušného popisu musí být jednoznačná. Situování popisu, majícího povahu geografického názvosloví, musí současně přispívat k vytváření představy o zemském povrchu. U sídel se umísťují názvy, nejlépe nahoru dopravo od znaku, teprve v dalším pořadí podle situace vlevo, nahoře a dole. [k] Na území většího rozsahu (školní a nástěnné mapy kontinentů) se umísťují názvy zpravidla ve směru zemských rovnoběžek. Názvy horských pásem sledují podélnou osu, přičemž u kratších názvů se písmena prokládají mezerami. Podobně je tomu u názvů státu a jejich částí, oceánů, moří, zálivů, pouští a dalších rozlehlých geografických objektů. U vodních toků se názvy umísťují vždy ve směru toku. [k] Popis však na mapě zabírá značnou část její plochy, proto je dobře zvolené písmo jednou z podmínek nejen čitelnosti, ale i estetiky mapy. Topografické mapy středních měřítek by měly být zaplněny popisem z 5 %, přehledné mapy malých měřítek z 10 % a více. Maximální zaplněnost by měla být 30 %. [f]
8
Tato diplomová práce se zabývá umisťováním popisů v mapách. Při umisťování popisů mohou nastat situace, kdy se popisy překrývají. A nebo není poznat, ke kterému znaku popis patří, což je důležité zejména z hlediska čitelnosti mapy a její uživatelské vstřícnosti, neboť uživatelé map jsou z širokého spektra veřejnosti.
9
2 Cíle práce Cílem této bakalářské práce je vytvoření nástroje pro změnu obsahu a umístění popisů v mapě, která je vytvořena v ArcGIS. Tento nástroj je vytvořen ve Visual Basic for Application. Popisy se rozumí anotace, na které je možno popisy převést. Anotace jsou, na rozdíl od běžných popisů, statické, a proto se při změnách měřítka jejich umístění a velikost nemění. Anotace nabízejí vlastnosti, díky nimž je možné s nimi pracovat. Nejprve uživatel použije všechny dostupné nástroje pro umisťování popisů v ArcGIS. Poté převede popisy na anotace. Anotace je možné uložit v mapě nebo geodatabázi. Vytvořený nástroj bude umožňovat postupně procházet všechny anotace, přičemž uživatel bude moci zvolit, ve které vrstvě chce popisy procházet. Dále uživatel bude moci editovat textový řetězec a jeho vlastnosti. Výsledný skript je doplněn jednoduchými komentáři v anglickém jazyce a také je k němu přiložen návod na jeho použití v souboru readme.txt a help.pdf. Dalším cílem je publikace nástroje na stránkách ESRI Support. O bakalářské práci jsou vytvořeny webové stránky, v souladu s katedrou zadanými pravidly, kde budou shrnuta nejdůležitější fakta o práci, a rovněž je doplněna o summary v anglickém jazyce. Taktéž je vytvořen CD-ROM obsahující program a další výstupy.
10
3 Technologie ESRI 3.1 ESRI V roce 1969 Jack Dangermond založil v Kalifornii soukromou konzultační skupinu ESRI, Inc. Vstupní kapitál tvořilo pouhých 1 100 dolarů a starý dům v Jackově rodišti Redlands. Během sedmdesátých let se ESRI zaměřila na vývoj základních principů GIS a jejich využití v reálných projektech. [p] V roce 1981 uvedla firma ESRI na trh svůj první obchodní produkt GIS Software nazvaný ARC/INFO. Ten představoval první moderní GIS, který byl konstruován pro minipočítače. Téhož roku uspořádala také svou první konferenci. Ta se konala v kanceláři firmy ESRI v Redlands a účastnilo se jí jen 18 lidí. V současnosti na tuto největší každoroční GIS událost na světě přijíždí více než 11 000 zájemců z 90 zemí. [f] V dubnu 2001 začíná rozesílání ArcGIS 8.1, rodiny produktů, ze které lze vystavět komplexní GIS pro všechny úrovně organizací. [p]
3.2 ArcGIS ArcGIS je název systému firmy ESRI, největšího světového výrobce software pro geografické informační systémy (GIS). ArcGIS Desktop poskytuje kompletní software pro GIS a je k dispozici ve třech úrovních (tj. licencích): ArcView, ArcEditor a ArcInfo, které se liší různou úrovní funkcionality. [o] Součástí systému ArcGIS jsou komponenty pro serverovou část rozsáhlého GISu, stejně jako software pro GIS do terénu. [o] Aktuální verze systému ArcGIS je 9.3.1. Nástup nové verze ArcGIS 10 je očekáván v nejbližší době.
3.3 Microsoft Visual Basic 6.5 a Visual Basic for Application V ArcGIS lze skriptovat pomocí dvou skriptovacích jazyků: Java Skript a Visual Basic Script. Microsoft Visual Basic je objektově orientovaný programovací jazyk. Pracuje v operačním prostředí Windows. Jeho edice jsou
11
aplikační vydání Visual Basic for Applications (dále VBA) a skriptovací edice Visual Basic Scripting Edition (dále VBS). První zmíněné aplikační vydání je ve verzi 6.5 možné vyvolat z programu ArcMap. Prostřednictvím VBA lze používat knihovnu softwarových komponent ArcObjects.
3.4 ArcObjects ArcGIS a všechny jeho softwarové komponenty jsou založené na knihovně ArcObjects. Tyto objekty jsou základními prvky jako mapy, vrstvy, tlačítka, nástroje atd. Všechny jsou vytvořené z ArcObjects, které jsou programovatelné a jsou shromážděné např. do aplikace ArcMap. Uživatelé a programátoři pracují se stejnými objekty. Tyto ArcObjects jsou technicky nazývány třídami (classes). Je jich zhruba přes 2 700. Objekty představují například mapa, vrstva, bod nebo polygon. ArcObjects jsou programovatelné v mnoha jazycích jako Visual Basic, Delphi, PowerBuilder nebo C++, které používají programátoři ESRI. Výstupy mohou představovat soubory *.olb (Object Language Bindings), *.dll (Dynamic Linking Library), *.exe (EXEcutable file). Pro potřeby větší názornosti a pochopení vztahů mezi ArcObjects je producenty softwaru ArcGIS vytvořeno přehledné schéma ArcMap Object Model, které skrze jazyk UML (Unified Modeling Language) znázorňuje vazby mezi jednotlivými objekty.
12
Obr. 1: Objekty ArcObjects (Getting Started with ArcObjects, ESRI)
Obr. 2: Náhled části ArcMap Object Model
13
4
Rešerše skriptů z ESRI Support Společnost ESRI podporuje rozvoj uživatelských nadstaveb
a přizpůsobení. Součástí jejích internetových stránek je také fórum a úložiště těchto nadstaveb, kde uživatelé a vývojáři mohou tyto nadstavby sdílet. Při vyhledávání nadstaveb lze vybírat z několika programovacích/skriptovacích jazyků a dle verze softwaru, pro který je nadstavba určena. Níže je několik rešerší vybraných nadstaveb pracujících s anotacemi.
4.1
MapAnno2GeoAnno9 (AS13622) Nástroj převádí mapové anotace na anotace uložené v geodatabázi.
Instaluje se přetažením dll do instalátoru, čímž se přidá položka Map Annotation to Geodatabase Annotation do možností, jež se zobrazí po klepnutí pravým tlačítkem myši na název mapy (data frame). Spouští se kliknutím na výše zmíněnou položku. Po startu nástroje se zobrazí úvodní formulář, kde se vybere, ze které vrstvy chceme popisy převést a do které personální geodatabáze se uloží.
Obr. 3: Formulář nástroje MapAnno2GeoAnno
14
4.2
FindAndReplace (AS13379) Nástroj Find and Replace umí najít anotaci podle textového řetězce, který
zadá uživatel, nahradit vyhledaný řetězec jiným, případně změnit některé parametry písma. Jednotlivé nástroje jsou umístěny na záložkách formuláře. Nejdůležitější dva jsou blíže popsány. První s funkcí Find se používá pro primární lokalizaci popisu (Flash shape, Zoom to, Pan to), druhý nazvaný Replace zaměňuje původní text za nově zadaný.
Obr. 4: Náhled nástroje Find and Replace
4.3
AddCustomAnnoLayer (AS12900) Dalším zajímavým rozšířením aplikace ArcMap pro práci s anotacemi je
Custom Annotation Layer Tool. V situaci, kdy jsou pro jednotlivé prvky anotační vrstvy popisů nastaveny jiné vlastnosti písma, je vhodné použít tento nástroj. Po jeho spuštění je uživateli nabídnuta zdrojová geodatabáze, ze které se vybírá vrstva, jež se bude přidávat. Poté se nastaví nebo změní referenční měřítko vrstvy a nakonec je zobrazeno okno editor, kde se hromadně pro celou vrstvu nastaví parametry písma.
15
Obr. 5: Pracovní rozhraní nadstavby Add Custom Anno Layer
16
5 Metody a postup zpracování 5.1 Studium kartografických publikací a diplomových prací Pro vypracování této bakalářské práce bylo nutno nastudovat odbornou literaturu zabývající se umisťováním popisů, zejména publikace V. Voženílka, B. Veverky, diplomové práce s podobným tématem byly rovněž cenným zdrojem informací.
5.2 Základy práce s Microsoft Visual Basic Script Nejprve bylo nutné si osvojit práci s VBS. Tomuto posloužil Help v ArcGIS Desktop. Dalším zdrojem nápovědy byl ArcGIS Desktop Help for VB6 developers a VBA Developer Help, které je nutné doinstalovat zvlášť z instalačního DVD ArcGIS 9.3. Přínosné bylo také absolvování bezplatných kurzů Exploring the VBA Environment a Getting Started with ArcObjects na ESRI Virtual Campus (www.esri.com), jenž seznamují začátečníky se základy programování ve VBA a ArcObjects.
5.3 Tvorba nástroje Nástroj byl vytvořen v rozhraní Visual Basic for Application, které je implementované v ArcGIS. Program je dostupný přes tlačítko, které je nutné nově vytvořit jako UIButtonControl a umístit do již existující nebo nové lišty nástrojů (toolbaru). Po stisku tlačítka je již vyvolán úvodní formulář nástroje.
5.4 Vytvoření archivu Výsledky práce – nástroj, návod na instalaci a použití v anglickém jazyce jsou umístěny v archivu *.zip, který je ke stažení na internetových stránkách o bakalářské práci a CD-ROM. Dále bude přiložena textová část a vzorová data, na kterých byl nástroj testován.
17
5.5 Tvorba www stránek O diplomové práci jsou vytvořeny webové stránky, kde jsou shrnuty základní informace o tématu práce, tvorbě nástroje. Bude zde také ke stažení výše zmíněný *.zip archiv. Webové stránky jsou vytvořeny v prostředí programu PS Pad.
5.6 Publikování na ESRI Support Jak již bylo uvedeno, tak jedním z cílů je i publikace nástroje na stránkách ESRI Support. Publikován je nástroj a návod na instalaci a použití v anglickém jazyce. Nejsou publikována žádná vzorová data. Než je možné něco publikovat na ESRI Support, je nejprve nutné se zaregistrovat, načež se v sekci upload nahrají skripty či jiné nástroje nebo doplňky vytvořené uživateli.
18
6 Nástroj pro umisťování popisů v ArcGIS 6.1 Účel použití nástroje Nástroj je nejvhodnější použít v situaci, kdy jsou vytvořeny a umístěny popisy v mapě. Obsah popisu, velikost a barva písma jsou již zvoleny u všech vrstev. Popisy pro body, linie a plochy jsou umístěny za pomocí základních funkcí pro popisování, případně je použit Maplex. Poté se popisy převedou na anotace uložené v geodatabázi. Po konverzi se objeví překryvy popisů a nejasnosti v náležitosti popisu k popisovanému jevu – bodu, linii, ploše. Před finálním tiskem je nutné opravit překryvy, obsah, umístění, případně u některých jednotlivých popisů změnit velikost nebo nahradit dlouhé popisy zkratkami. Tento proces může být náročný z hlediska časové náročnosti, pracnosti a obtížnosti opakovaného projití celého mapového pole. V tuto chvíli je vhodné použití nástroje pro kontrolu popisů, jež zamezí nevědomé opomenutí úpravy popisů a pomáhá systematicky projít celé mapové pole.
6.2 Prostředí Visual Basic for Application Prostředí Visual Basic for Application (VBA) se v ArcMap vyvolá stiskem kláves Alt + F11. Další možností jak se dostat do VBA je přes záložku Tools v menu, dále Macros a Visual Basic Editor. Poté lze již importovat požadované skripty ve formě basických modulů, class file nebo formulářů. Dalším způsobem je klepnutí pravým tlačítkem myši na lištu s nástrojovým toolbary a zvolení položky Customize. Otevře se formulář, kde je možné vytvořit nový toolbar či tlačítko. V záložce Commands v Categories se vybere [UIControls], klepne se na tlačítko New UIControl a vybere
se
UIButtonControl. Nové tlačítko se umístí do již existujícího toolbaru nebo do nově vytvořeného. Po vytvoření tlačítka se na něj klepne pravým tlačítkem myši a zvolí se View Source. Import skriptů probíhá totožně jako v předchozím případě.
19
Obr. 6: Otevření prostředí VBA z ArcMap
Obr. 7: Náhled formuláře pro vytvoření nového toolbaru či tlačítka
Je-li otevřené okno Customize, je možné po klepnutí pravým tlačítkem myši na tlačítko upravit jeho vzhled – změnit obrázek či text popisu tlačítka.
20
Obr. 8: Změna vzhledu tlačítka
6.3 Příprava spuštění Před samotným spuštěním nástroje je nutné po importu formulářů napsat malou část kódu do objektu ThisDocument. A to proceduru „Click ()“ k vytvořenému tlačítku. Výsledek je tento: Private Sub UIButtonControl1_Click() frmIni.Show End Sub
Je-li vyžadováno, aby se při přejetí tlačítka myší zobrazoval tzv. „tooltip“ (kontextová nápověda), přidáme pod proceduru „Click ()“ následující: Private Function UIButtonControl1_ToolTip() As String UIButtonControl1_ToolTip = "text tooltipu" End Function
6.4 Programové řešení Programové řešení odpovídá možnostem použitého skriptovacího jazyka a vlastnostem prostředí Microsoft Visual Basic. Objekty Visual Studia jsou doplněny o objekty ArcObjects, ze kterých je ArcMap, ArcCatalog a v podstatě celý ArcGIS sestaven. Nástroj je funkční ve všech licencích a umožňuje procházet anotace uložené v personální i souborové geodatabázi, nezávisle na tom, zda je anotační vrstva prolinkována s mateřskou vrstvou. Data, na kterých byl nástroj testován, jsou k dispozici na přiloženém CD-ROMu.
21
6.4.1 Úvodní formulář Po stisknutí tlačítka, které je vytvořeno, se objeví úvodní formulář nástroje. Jsou na něm tlačítka, jichž lze užít k přístupu k jednotlivým nástrojům, které jsou podrobněji popsané níže. Je zde také tlačítko pro zobrazení nápovědy a ukončení nástroje.
Obr. 9: Vzhled úvodního formuláře
Zdrojový kód úvodního formuláře: Private Sub cmdLayer_Click() Rem load tool for checking selected annotation layer frmFORM.Show End Sub Private Sub cmdAll_Click() Rem load tool for checking all annotation layers frmAdd.Show End Sub Private Sub cmdHelp_Click() Rem help info MsgBox "Help is available in Help.pdf.", vbOKOnly, "HELP" End Sub Private Sub cmdEnd_Click() Rem end End End Sub
22
6.4.2 Řešení nástroje Hlavní nástroj, jež umožňuje kontrolu popisů, se spustí klepnutím na tlačítko
„CHECK
EACH
ANNOTATION
LAYERS
INDIVIDUALLY“
v úvodním formuláři. Při tvorbě nástroje pro umisťování popisů v ArcGIS bylo nejprve nutné zjistit, jaké ArcObjects použít, aby se dalo uchopit vrstvu či jednotlivý popis a dále s nimi pracovat. K tomuto účelu posloužil číselný identifikátor označující anotační vrstvy. Jména anotačních vrstev jsou po inicializaci formuláře vložena do objektu combobox. Uživatel vybere, kterou z anotačních vrstev chce procházet. Po zvolení vrstvy se v kolonce Label string na formuláři objeví textový řetězec prvního popisu a view aplikace ArcMap je zaměřeno na střed daného popisu. Proces zaměření view na střed popisu je zajištěn nastavením extentu active view na envelope extentu prvku. Souřadnice envelopu prvku jsou poupraveny tak, aby bylo možné vidět i okolí popisu.
Obr. 10: Vzhled formuláře nástroje pro kontrolu popisů Za pomocí tlačítek „NEXT >>>“ a „<<
23
Obr. 11: Nástroj Select Elements
Obr. 12: Spuštěný nástroj a okno Properties
Dále je na formuláři umístěno tlačítko „Go To“, jež po zadání pozice umožní přejít na požadovaný popis. Tlačítko END slouží k ukončení programu. Pokud chce uživatel procházet další vrstvu, tak danou vrstvu vybere v comboboxu. Použití tohoto nástroje je vhodné, je-li potřeba zkontrolovat málo anotačních vrstev, z nichž každá vrstva obsahuje velké množství popisů. Zdrojový kód nástroje pro kontrolu popisů je v příloze č. 1.
24
6.4.3 Nástroj pro hromadné procházení Nastane-li situace, kdy je ke kontrole velké množství vrstev obsahujících malé množství popisů, je vhodné použít nástroj, který zkopíruje prvky zvolených vrstev do jedné anotační vrstvy. Ten lze spustit přes úvodní formulář, kde se klepne na tlačítko „CHECK ALL ANNOTATION LAYERS TOGETHER“ a zobrazí se formulář, který je vyobrazen níže.
Obr. 13: Vzhled formuláře na „sesypávání“ anotací Cílová anotační vrstva by neměla obsahovat žádná data, aby nedošlo k nechtěné změně dat. Proto je nejlepším řešením vytvoření nové anotační vrstvy. Pro libovolnou neanotační vrstvu se vloží popisy a převedou se na anotace. Nová vrstva bude uložená v geodatabázi a nebude prolinkovaná s „mateřskou“ vrstvou. Po vytvoření nové anotační vrstvy je nutné otevřít jí odpovídající atributovou tabulku a vymazat z ní všechny prvky.
25
Obr. 14: Náhled okna pro převod popisů na anotace
Je-li nová vrstva již připravena, lze začít pracovat s nástrojem na pokročilou kontrolu popisů. V prvním comboboxu se vybere zdrojová vrstva, ve druhém vrstva cílová, tedy nově vytvořená. Po zmáčknutí tlačítka „ADD FEATURES FROM FEATURES TO TARGET“ se provede požadovaná operace, zobrazí se zpráva, že přesun proběhl úspěšně, a další instrukce. Postup se opakuje, dokud v cílové vrstvě nejsou všechny požadované původní vrstvy. Nyní se opětovně
spustí
nástroj
CHECK
EACH
ANNOTATION
LAYER
INDIVIDUALLY pro kontrolu popisů, ve kterém se vybere vrstva, do níž byly popisy zkopírovány. Následuje zdrojový kód nástroje pro slučování vrstev: Option Explicit Rem variables declaration Dim pMxDoc As IMxDocument Dim pMap As IMap Rem variables to get featureclass Dim pId As New UID
26
Dim pEnumLayer As IEnumLayer Dim pLayer As ILayer Dim pLayerT As ILayer Dim pMxDocT As IMxDocument Dim pMapT As IMap Dim pEnumLayerT As IEnumLayer Dim pSrcFl As IFeatureLayer Dim pTrgFl As IFeatureLayer Dim pSrcFc As iFeatureClass Dim pTrgFc As iFeatureClass Rem variables to add features from source to target annotation layer Dim pFeatCursor As IFeatureCursor Dim pFeature As IFeature Dim pGLF As IFDOGraphicsLayerFactory Dim pDataset As IDataset Dim pFdoGl As IFDOGraphicsLayer Dim pAnnoFeat As IAnnotationFeature Dim pAnClone As IClone Dim pGsElem As IElement '==================================== Private Sub UserForm_Initialize() Rem hide previous form frmIni.Hide Rem get annotaion layers names to comboboxes Set pMxDoc = Application.Document Set pMap = pMxDoc.FocusMap pId = "{5CEAE408-4C0A-437F-9DB3-054D83919850}" Set pEnumLayer = pMap.Layers(pId, True) pEnumLayer.Reset Set pLayer = pEnumLayer.Next Do While Not pLayer Is Nothing cmbSource.AddItem pLayer.Name cmbTarget.AddItem pLayer.Name Set pLayer = pEnumLayer.Next Loop cmdAdd.Enabled = False imgSource.Visible = True imgTarget.Visible = False imgAdd.Visible = False End Sub '==================================== Private Sub cmbSource_Change() Rem select source annotation layer Set pMxDoc = Application.Document Set pMap = pMxDoc.FocusMap pId = "{5CEAE408-4C0A-437F-9DB3-054D83919850}" Set pEnumLayer = pMap.Layers(pId, True) pEnumLayer.Reset Do Set pLayer = pEnumLayer.Next Loop Until pLayer.Name = cmbSource.Text cmdAdd.Enabled = True imgSource.Visible = False
27
imgTarget.Visible = True imgAdd.Visible = False End Sub '==================================== Private Sub cmbTarget_Change() Rem select target annotation layer Set pMxDocT = Application.Document Set pMapT = pMxDoc.FocusMap pId = "{5CEAE408-4C0A-437F-9DB3-054D83919850}" Set pEnumLayerT = pMapT.Layers(pId, True) pEnumLayerT.Reset Do Set pLayerT = pEnumLayerT.Next Loop Until pLayerT.Name = cmbTarget.Text cmdAdd.Enabled = True imgSource.Visible = False imgTarget.Visible = False imgAdd.Visible = True End Sub '==================================== Private Sub cmdAdd_Click() Rem add annotation features from source to target Set pSrcFl = pLayer Set pTrgFl = pLayerT Set pSrcFc = pSrcFl.FeatureClass Set pTrgFc = pTrgFl.FeatureClass Set pFeatCursor = pSrcFc.Search(Nothing, True) Set pFeature = pFeatCursor.NextFeature Set pGLF = New FDOGraphicsLayerFactory Set pDataset = pTrgFc Set pFdoGl = pGLF.OpenGraphicsLayer(pDataset.Workspace, pTrgFc.FeatureDataset, pDataset.Name) pFdoGl.BeginAddElements While Not pFeature Is Nothing Set pAnnoFeat = pFeature Set pAnClone = pAnnoFeat.Annotation Set pGsElem = pAnClone.Clone pFdoGl.DoAddFeature pFeature, pGsElem, 0 Set pFeature = pFeatCursor.NextFeature Wend pFdoGl.EndAddElements MsgBox "Features were succesfully added.", vbInformation, "INFO" MsgBox "Start tool again." & vbCrLf & "" & vbCrLf & "Select that you want to check each annotation layer individually." & vbCrLf & "" & vbCrLf & "Select TARGET layer where you put features." End End Sub '================================== Private Sub cmdEnd_Click() Rem ends it End End Sub
28
6.5 Ukázka praktického nasazení nástroje Před spuštěním samotného nástroje se zapne editace. Dále se na záložce Selection v tabulce obsahu (Table of Content) doporučuje zatržení pouze anotačních vrstev, aby nedošlo k editaci nechtěné vrstvy. Nástroj se zapíná tlačítkem v nástrojové liště. Zmíněné prvky jsou červeně zvýrazněny na obrázku níže.
Obr. 15: Záložka Selection a tlačítko nástroje.
Je-li nutné upravit polohu popisu, jeho textový řetězec nebo parametry písma, tak se v liště nástrojů vybere nástroj „Select Elements“. Poklepáním na daný popis se zobrazí okno vlastností popisu a nastaví se dle potřeby.
29
Obr. 16: Okno vlastností pro editaci textového řetězce popisu a vlastností písma
V případě, že je práce s nástrojem předčasně ukončena, tak tlačítko „Go To“ dovoluje, po zadání pozice, přejít na prvek, kde byla práce přerušena. Po překontrolování všech popisů je možné vybrat další vrstvu k editaci nebo ukončit nástroj a pokračovat v dalších pracích na vzniku mapy.
Obr. 17: Před použitím nástroje
30
Obr. 18: Po použití nástroje
Nástroj je vhodné použít pro kontrolu popisů například mapy botanické zahrady v Olomouci. Mapa obsahuje vrstvy dlaždice, záhony a vrstvu bylina, kde je velké množství popisů.
Obr. 19: Náhled části mapy botanické zahrady v Olomouci
31
Jako další příklad bych uvedl mapu železniční dopravy Olomouckého kraje obsahující vrstvy orp (obce s rozšířenou působností), železniční trať a železniční stanice. Poslední zmíněná vrstva obsahuje několik stovek popisů, jež jsou ne vždy vhodně umístěny standardními nástroji.
Obr. 20: Náhled části mapy železniční dopravy olomouckého kraje
32
7 Diskuse Nástroj pro umisťování popisů, který byl vytvořen v rámci této bakalářské práce, je nadstavbou nad programem ArcGIS. Firma ESRI jakožto jeho producent je jednou z předních společností vyvíjejících GIS software. Standardní nástroje pro umisťování popisů jsou dostatečně propracované, avšak mohou nastat situace, kdy vzniká nějaký konflikt - pro toto pokročilé popisování je určena extenze Maplex. Tato extenze je účinným nástrojem. Například umí odhalit překryv nebo je možné nastavit šířku mezery mezi písmeny při popisování polygonů. Co však tyto nástroje neumí, je systematické procházení všech popisů jednoho po druhém, kdy uživatel vizuálně překontroluje každý popis převedený na anotace a uložený v geodatabázi a v případě potřeby upraví jeho umístění, textový řetězec a nebo vlastnosti písma. Zde vidím přínos mé bakalářské práce. První krok při vytváření takového nástroje spočívá v osvojení si skriptovacího/programovacího jazyka. Jak již bylo zmíněno v kapitole Nástroj pro umisťování popisů v ArcGIS, tak nejprve bylo nutné zjistit, jak uchopit tu danou anotační vrstvu, ten daný popis. Tento problém byl vyřešen za pomoci číselného kódu, jež označuje anotační vrstvy. Jejich názvy jsou posléze načteny do objektu combobox. Jako druhou komplikaci bych uvedl programové ošetření umístění view na právě procházený popis. Řešením bylo nastavení extentu active view na envelope extentu prvku. Dílčí potíží se ukázalo být přespřílišné nazoomovaní na daný prvek, což bylo zajištěno úpravou mezních souřadnic envelopu. Odstavec výše mě také přivádí na myšlenku stejného měřítka přiblížení na střed všech popisů. Při inicializaci by mohlo být uloženo měřítko prvního prvku do proměnné a poté by zůstávalo stejné při ostatních přiblíženích. Je zde však jeden velmi podstatný důvod, proč to nelze zrealizovat. Uvažujme, že prvním popisem bude velmi krátký textový řetězec. Uložilo-li by se toto měřítko do proměnné a poté by view bylo přiblíženo v tomto měřítku na popis s velmi
33
dlouhým textovým řetězcem, vedlo by to k situaci, jež nejlépe vystihují obrázky níže.
Obr. 21: Náhled view prvního prvku
Obr. 22: View přiblížené se stejným měřítkem na prvek s dlouhým textovým řetězcem
34
Poslední nesnází se ukázal být export a následná distribuce nástroje. Počátečním cílem byl uživatelský toolbox, od něhož bylo však upuštěno, protože nástroje v něm umístěné nedovolují interaktivní práci — po zadání vstupních parametrů proběhnou jednorázově. Výsledkem jsou tedy formuláře s objekty a zdrojovým kódem (soubory *.frm a *.frx), které uživatel importuje do prostředí VBA. Nástroj by měl být publikován na stránkách ESRI Support, kde však nyní probíhá rekonstrukce. Je sice možné stahovat existující nadstavby, ale sekce pro upload je prozatím uzavřena. Nástroj bude publikován, jakmile to bude možné.
35
8 Závěr Cílem této bakalářské práce, zpracované na Katedře geoinformatiky Přírodovědecké fakulty Univerzity Palackého v Olomouci, bylo vytvoření nástroje pro umisťování popisů v ArcGIS a jeho publikace na stránkách ESRI Support. Popisy se rozumí anotace, na které je možno popisy převést. Nejprve uživatel použije všechny dostupné nástroje pro umisťování popisů v ArcGIS. Poté převede popisy na anotace. Vytvořený nástroj umožňuje postupně procházet všechny anotace uložené v geodatabázi, přičemž uživatel volí, ve které vrstvě chce popisy procházet. Dále uživatel může editovat textový řetězec a jeho vlastnosti. Jako doplňkový vznikl nástroj umožňující zkopírování prvků z jedné anotační vrstvy do druhé. Toho je příhodné použít za situace, kdy je potřeba zkontrolovat větší množství vrstev obsahujících málo prvku. Výsledný nástroj je doplněn komentáři v anglickém jazyce. Archiv, ve kterém bude nástroj publikován na stránkách ESRI Support, obsahuje návod na instalaci a použití nástroje. Umisťování popisů je jedním z mnoha úkonů, jež je nutné vykonat při vzniku mapy. Popisy zaplňují značné množství prostoru v mapě, a tím ovlivňují její čitelnost. Proto je důležité, aby jejích umístění bylo důsledné. Nástroj pro umisťování popisů v ArcGIS je účelným prostředkem kontroly popisů před finálními pracemi na mapě.
36
9 Seznam použitých zdroj Literatura [a] KANG-TSUNG, Chang. Programming ArcObjects with VBA : A TaskOriented Approach. [s.l.] : CRC Press, 2008. 360 s. ISBN 0-8493-9283-7. [b] KAŇOK, J. Tematická kartografie. Ostrava : Ostravská universita, 1999. 318 s. [c] KRAAK, M. J.; ORMELING, F. Cartography : Visualization of Geospatioal data. Second Edition. London : Prentice Hall, 2003. 205 s. ISBN 0-13-088890-7. [d] MATĚJČEK, I. Programová rozšíření funkcionality tvorby popisů v ArcGIS. Olomouc, 2008. 48 s. Bakalářská práce. Univerzita Palackého v Olomouci, Přírodovědecká fakulta, katedra geoinformatiky. [e] MURDYCH, Z. Tématická kartografie. Praha : MŠMT, 1987. 248 s. [f] PIETRASOVÁ, P. Sbírka úloh pro použití extenze Maplex pro ArcGIS. Olomouc, 2006. 37 s. Bakalářská práce. Univerzita Palackého v Olomouci, Přírodovědecká fakulta, katedra geoinformatiky. [g] PRAVDA, J.; KUSENDOVÁ, D. Počítačová tvorba tematických máp. Bratislava : Univerzita Komenského, 2004. 264 s. [i] SLOCUM, T.; MCMASTER, R.; KESSLER, F. Thematic Cartography and geographic Visualization. [s.l.] : Prentice Hall, 2004. 518 s. ISBN 0-13-035123-7. [j] VALENT, Tomáš. Programování nadstavby pro tvorbu kartodiagramů v ArcGIS. Olomouc, 2010. 48 s. Diplomová práce. Univerzita Palackého v Olomouci, Přírodovědecká fakulta, katedra geoinformatiky. [k] VEVERKA, B.; ZIMOVÁ, R. Topografická a tematická kartografie. Praha : Vydavatelství ČVUT, 2008. 198 s.
37
[l] VOŽENÍLEK, V. Aplikovaná kartografie I. - tématické mapy. Olomouc : UP, 1999. 170 s. [m] VOŽENÍLEK, V. GIS I - pojetí, historie, základní komponenty. Olomouc : UP, 2000. 173 s. [n] VOŽENÍLEK, V. Diplomové práce z geoinformatika. Olomouc : Vydavatelství Univerzity Palackého, 2002. 31 s. Internetové zdroje [o] ARCDATA PRAHA - ArcGIS [online]. 1992 - 2006 [cit. 2010-05-11]. ArcGIS. Dostupné z WWW:
. [p] ARCDATA PRAHA - Distribuovaný software [online]. 1992 - 2006 [cit. 201005-11]. Distribuovaný software. Dostupné z WWW: . [q] ESRI Training | Exploring the VBA Environment [online]. 2010 [cit. 2010-0511]. Dostupné z WWW: . [r] ESRI Training | Getting Started with ArcObjects in ArcGIS [online]. 2010 [cit. 2010-05-11]. Dostupné z WWW: .
38
Summary Aim of bachelor thesis is to form Tool for label placement in ArcGIS and its publication on ESRI Support web pages. Labels mean annotations in this case. User uses all tools for label placement in ArcGIS at first. Created tool can browse each annotation which is stored in geodatabase step by step whereas user votes in which layer wants descriptions browse. User can edit text string and its properties if it is necessary. User can start tool by clicking on tool button in toolbar. After that there is welcome form where user chooses from some buttons. First button (CHECK EACH ANNOTATION LAYER INDIVIDUALLY) starts tool for annotation layer placement. User select annotation layer in combobox at first and view is zoomed to the first feature. Than click NEXT >>>/<<< BACK button to zoom to next/previous feature. If user wants to step to another feature there is Go To button. Click END button to end tool. An additional tool was made. It can copy features from one annotation layer to another annotation layer. User would use it in situation when it is necessary check many layers which contain a few features. User starts this tool by clicking on the second button (CHECK ALL ANNOTATION LAYER TOGETHER). Select source annotation layer in the first combobox and select target annotation layer in the second combobox than click ADD FEATURES FROM SOURCE TO TARGET to realize action. When action is finished the form is closed. Start CHECK EACH ANNOTATION LAYER INDIVIDUALLY tool and select target annotation layer in combobox to check it. Final tool has English commentaries. An archive contains tool, instructions for installation and use it is publish at ESRI Support. Label placement is one of many steps, which is necessary to do when you are creating a map. Labels fill large area in map and influent its readability by this. It is important to place labels consequentially. Tool for label placement in ArcGIS is efficient instrument of checking labels before final works on map.
39
Přílohy
Seznam příloh:
Příloha č. 1: Zdrojový kód nástroje pro kontrolu popisů (vázaná) Příloha č. 2: Nástroj pro umisťování popisů v ArcGIS – CD (volná)
Příloha č. 1: Zdrojový kód nástroje pro kontrolu popisů
Option Explicit Rem variables declaration Dim pMxDoc As IMxDocument Dim pMap As IMap Dim pEnumLayer As IEnumLayer Dim pLayer As ILayer Dim pId As New UID Dim pFeatLayer As IFeatureLayer Dim pFc As iFeatureClass Dim pCur As IFeatureCursor Dim pFeat As IFeature Dim annotCount As Long Dim pTable As ITable Dim pRow As IRow Dim i As Long Dim AnnoTxStr As Variant 'must be variant because there can be in table Rem variable for row number in table Dim m As Double 'variable for row number in table Dim GoToNmbr As Long Rem variables for zooming to feature Dim pEnve As IEnvelope Dim pQf As IQueryFilter 'variables that filter out Dim NullCount As Long Dim NcHelp As Long Dim GoToHelp As Long '================================================ Private Sub UserForm_Initialize() Rem variables declaration, touch on annotation layer Set pMxDoc = Application.Document Set pMap = pMxDoc.FocusMap Rem selection of annotation layers from table of content pId = "{5CEAE408-4C0A-437F-9DB3-054D83919850}" Set pEnumLayer = pMap.Layers(pId, True) pEnumLayer.Reset Set pLayer = pEnumLayer.Next Rem adds annotation layer's name into the list in combobox Do While Not pLayer Is Nothing cmbAnnoList.AddItem pLayer.Name
Set pLayer = pEnumLayer.Next Loop ' cmdNext.Enabled = False cmdBack.Enabled = False cmdGoTo.Enabled = False frmIni.Hide End Sub '================================================ Private Sub cmbAnnoList_Change() Rem variables declaration and pointer's set Set pMxDoc = Application.Document Set pMap = pMxDoc.FocusMap Rem selection of annotation layers from table of content pId = "{5CEAE408-4C0A-437F-9DB3-054D83919850}" Set pEnumLayer = pMap.Layers(pId, True) pEnumLayer.Reset Rem adds annotation layer's name into the list Do Set pLayer = pEnumLayer.Next Loop Until pLayer.Name = cmbAnnoList.Text'SelectedAnnoLayerName m = 1 NullCount = 0 Rem get total annotation count in layer Set pFeatLayer = pLayer Rem take out features with null value and no geometry Set pQf = New QueryFilter pQf.WhereClause = "TextString Is Not Null" Set pFc = pFeatLayer.FeatureClass Set pCur = pFc.Search(pQf, False) Set pFeat = pCur.NextFeature annotCount = pFeat.Table.RowCount(pQf) txtAnnoCount.Text = m & "/" & annotCount Rem get first TextString from selected annotation layer Set pTable = pFeat.Table Set pRow = pTable.GetRow(m) i = pTable.FindField("TextString") AnnoTxStr = pRow.value(i) If IsNull(AnnoTxStr) Then Do m = m + 1 Set pRow = pTable.GetRow(m)
i = pTable.FindField("TextString") AnnoTxStr = pRow.value(i) Rem pocitadlo kolik polozek je null NullCount = NullCount + 1 Loop Until Not IsNull(AnnoTxStr) txtLblStr.Text = AnnoTxStr Else txtLblStr.Text = AnnoTxStr End If m = 0 'set start value after changing layer cmdBack.Enabled = False 'enabled back button cmdNext.Enabled = True cmdGoTo.Enabled = True Rem zoom to feature Set pEnve = pFeat.Extent.Envelope Rem get larger extent pEnve.XMin = pFeat.Extent.Envelope.XMin – (pFeat.Extent.Envelope.XMax pFeat.Extent.Envelope.XMin) * 7/4 pEnve.XMax = pFeat.Extent.Envelope.XMax + (pFeat.Extent.Envelope.XMax pFeat.Extent.Envelope.XMin) * 7/4 pEnve.YMin = pFeat.Extent.Envelope.YMin (pFeat.Extent.Envelope.YMax pFeat.Extent.Envelope.YMin) * 7/4 pEnve.YMax = pFeat.Extent.Envelope.YMax + (pFeat.Extent.Envelope.YMax pFeat.Extent.Envelope.YMin) * 7/4 Rem get extent to activeview a its refresh pMxDoc.ActiveView.Extent = pEnve NcHelp = 0 End Sub '=============================================== Private Sub cmdNext_Click() Rem get next feature Set pMxDoc = Application.Document Set pMap = pMxDoc.FocusMap pId = "{5CEAE408-4C0A-437F-9DB3-054D83919850}" Set pEnumLayer = pMap.Layers(pId, True) pEnumLayer.Reset Do Set pLayer = pEnumLayer.Next Loop Until pLayer.Name = cmbAnnoList.Text Set pFeatLayer = pLayer Set pFc = pFeatLayer.FeatureClass
Set pCur = pFc.Search(pQf, False) Set pFeat = pCur.NextFeature annotCount = pFeat.Table.RowCount(pQf) Set pTable = pFeat.Table If m < pFeat.Table.RowCount(Nothing) Then m = m + 1 txtAnnoCount.Text = m & "/" & annotCount Set pRow = pTable.GetRow(m) i = pTable.FindField("TextString") AnnoTxStr = pRow.value(i) If IsNull(AnnoTxStr) Then Do m = m + 1 Set pRow = pTable.GetRow(m) i = pTable.FindField("TextString") AnnoTxStr = pRow.value(i) Loop Until Not IsNull(AnnoTxStr) txtAnnoCount.Text = m - NullCount & "/" & annotCount txtLblStr.Text = AnnoTxStr NcHelp = NcHelp + 1 Else txtLblStr.Text = AnnoTxStr End If If NcHelp > 0 Then txtAnnoCount.Text = m - NullCount & "/" & annotCount If GoToHelp > 0 Then txtAnnoCount.Text = m NullCount & "/" & annotCount cmdBack.Enabled = True Rem zoom to next feature Set pFeat = pFc.GetFeature(m) Set pEnve = pFeat.Extent.Envelope Rem get larger extent pEnve.XMin = pFeat.Extent.Envelope.XMin (pFeat.Extent.Envelope.XMax pFeat.Extent.Envelope.XMin) * 7/4 pEnve.XMax = pFeat.Extent.Envelope.XMax + (pFeat.Extent.Envelope.XMax pFeat.Extent.Envelope.XMin) * 7/4 pEnve.YMin = pFeat.Extent.Envelope.YMin (pFeat.Extent.Envelope.YMax pFeat.Extent.Envelope.YMin) * 7/4 pEnve.YMax = pFeat.Extent.Envelope.YMax + (pFeat.Extent.Envelope.YMax pFeat.Extent.Envelope.YMin) * 7/4 Rem get extent to activeview a its refresh
pMxDoc.ActiveView.Extent = pEnve pMxDoc.ActiveView.Refresh End Sub '=============================================== Private Sub cmdBack_Click() Rem setting pointers Set pMxDoc = Application.Document Set pMap = pMxDoc.FocusMap pId = "{5CEAE408-4C0A-437F-9DB3-054D83919850}" Set pEnumLayer = pMap.Layers(pId, True) pEnumLayer.Reset Do Set pLayer = pEnumLayer.Next Loop Until pLayer.Name = cmbAnnoList.Text Set pFeatLayer = pLayer Set pFc = pFeatLayer.FeatureClass Set pCur = pFc.Search(pQf, False) Set pFeat = pCur.NextFeature annotCount = pFeat.Table.RowCount(pQf) Set pTable = pFeat.Table If NullCount > 0 Then If m > NullCount Then m = m - 1 txtAnnoCount.Text = m - NullCount & "/" & annotCount Else If m > 1 Then m = m - 1 txtAnnoCount.Text = m & "/" & annotCount End If Set pRow = pTable.GetRow(m) i = pTable.FindField("TextString") AnnoTxStr = pRow.value(i) If Mid(txtAnnoCount.Text, 1, InStr(1, txtAnnoCount.Text, "/") - 1) = 1 Then cmdBack.Enabled = False txtLblStr.Text = AnnoTxStr Rem get previous feature Set pFeat = pFc.GetFeature(m) Set pEnve = pFeat.Extent.Envelope Rem get larger extent pEnve.XMin = pFeat.Extent.Envelope.XMin (pFeat.Extent.Envelope.XMax pFeat.Extent.Envelope.XMin) * 7/4 pEnve.XMax = pFeat.Extent.Envelope.XMax + (pFeat.Extent.Envelope.XMax pFeat.Extent.Envelope.XMin) * 7/4
pEnve.YMin = pFeat.Extent.Envelope.YMin (pFeat.Extent.Envelope.YMax pFeat.Extent.Envelope.YMin) * 7/4 pEnve.YMax = pFeat.Extent.Envelope.YMax + (pFeat.Extent.Envelope.YMax pFeat.Extent.Envelope.YMin) * 7/4 Rem get extent to activeview a its refresh pMxDoc.ActiveView.Extent = pEnve pMxDoc.ActiveView.Refresh End Sub '=============================================== Private Sub cmdGoTo_Click() Rem inserting number of position where you want to step Do Do m = InputBox("Insert position between 1 and " & annotCount, "Go To", CStr(Mid(txtAnnoCount.Text, 1, InStr(1, txtAnnoCount.Text, "/") - 1))) Loop Until m <= annotCount And m >= 1 Loop While Len(m) < Len(annotCount) If m > annotCount And m < 1 Then m = CStr(Mid(txtAnnoCount.Text, 1, InStr(1, txtAnnoCount.Text, "/") - 1)) If NullCount > 0 Then m = m + NullCount GoToHelp = GoToHelp + 1 End If Set pMxDoc = Application.Document Set pMap = pMxDoc.FocusMap pId = "{5CEAE408-4C0A-437F-9DB3-054D83919850}" Set pEnumLayer = pMap.Layers(pId, True) pEnumLayer.Reset Do Set pLayer = pEnumLayer.Next Loop Until pLayer.Name = cmbAnnoList.Text Set pFeatLayer = pLayer Set pFc = pFeatLayer.FeatureClass Set pCur = pFc.Search(pQf, False) Set pFeat = pCur.NextFeature annotCount = pFeat.Table.RowCount(pQf) If NullCount > 0 Then txtAnnoCount.Text = m - NullCount & "/" & annotCount Else
txtAnnoCount.Text = m & "/" & annotCount End If Set pTable = pFeat.Table Set pRow = pTable.GetRow(m) i = pTable.FindField("TextString") AnnoTxStr = pRow.value(i) txtLblStr.Text = AnnoTxStr cmdBack.Enabled = True Rem zoom to goto feature Set pFeat = pFc.GetFeature(m) Set pEnve = pFeat.Extent.Envelope Rem get larger extent pEnve.XMin = pFeat.Extent.Envelope.XMin (pFeat.Extent.Envelope.XMax pFeat.Extent.Envelope.XMin) * 7/4 pEnve.XMax = pFeat.Extent.Envelope.XMax + (pFeat.Extent.Envelope.XMax pFeat.Extent.Envelope.XMin) * 7/4 pEnve.YMin = pFeat.Extent.Envelope.YMin (pFeat.Extent.Envelope.YMax pFeat.Extent.Envelope.YMin) * 7/4 pEnve.YMax = pFeat.Extent.Envelope.YMax + (pFeat.Extent.Envelope.YMax pFeat.Extent.Envelope.YMin) * 7/4 Rem get extent to activeview a its refresh pMxDoc.ActiveView.Extent = pEnve pMxDoc.ActiveView.Refresh End Sub '================================================ Private Sub cmdEnd_Click() Rem ends application End End Sub
Příloha č. 2: Nástroj pro umisťování popisů v ArcGIS – CD (volná)
CD -
text.pdf (text bakalářské práce)
-
als.zip (nástroj)
-
vzorova_data: - pgbUkazka.mdb - fgbUkazka2.gdb - pgbEmpty_annotation_layer.mdb - BotanZahrada.mdb)
-
html (WWW stránky o bakalářské práci)