Semestrální práce z předmětu KMA/AGI

Michaela Nováková

Abstrakt

Semestrální práce se zabývá vývojem modulu pro propojení SPI a SGI z různých zdrojů a následným beta testováním modulu.

V současné době je na trhu práce mezera v produktu, který by pomohl propojit grafické podklady katastru nemovitostí s informacemi popisnými pro zobrazení v programu ArcMap. Společnost ARCDATA vyvinula dva nástroje - jeden pro rychlé vytvoření databáze požadované struktury a druhý pro snadné prohlížení popisných dat na základě grafických dat. Problém se nachází mezi těmito dvěma produkty, kde chybí jakýsi spojovací článek, který by zajistil propojení a funkčnost obou těchto aplikací pro všechny zdroje.


Obsah

ISKN Tools pro ArcGIS
Příprava tvorby skriptu
Uživatelský manuál
Popis skriptu
Hlavička skriptu
Úprava souboru popisných informací
Úprava souboru geodetických informací
Zpracování souboru geodetických informací
Import upraveného souboru geodetických informací do geodatabáze
Vybudování relace v geodatabázi
Závěr

Copyright: Michaela Nováková, Karel Jedlička, Západočeská univerzita v Plzni. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License".©

ISKN Tools pro ArcGIS

Cílem semestrální práce bylo vytvořit skript, který by usnadnil práci uživatelům produktu ArcGIS při prohlížení popisných dat katastru nemovitostí na základě grafických podkladů z digitální katastrální mapy (DKM) nebo katastrální mapy digitalizované (KM-D).

V současné době jsou vytvářeny dva druhy katastrálních digitálních map: digitální katastrální mapa (DKM), která je vytvářena přímo z naměřených dat a katastrální mapa obnovená digitalizací grafických map (KM-D), která je vytvářena na základě starých grafických map a nedosahuje tak vysoké přesnosti. Pro snadnější práci s grafickými daty definuje katastr nemovitostí výměnný formát katastru nemovistí (*.VFK). Snahou moderní doby je moci zobrazovat informace elegantním způsobem pomocí GIS, a tak i informace z katastru nemovistí by bylo pěkné zpřístupnit pomocí GIS.

GIS vytvořený na základě DKM lze snadno zobrazit v různých GIS aplikacích, včetně ArcGIS díky produktům ISKN Studio a ISKN View (někdy též souhrnně označovaných jako ISKN Tools), které vyvinula firma ESRI pro práci s výměnným formátem katastru nemovistostí. ISKN Studio umožňuje převést VFK do struktury geodatabáze, která je již zobrazitelná v aplikaci ArcGIS. ISKN View poté slouží jako pomocník při výsledném prohlížení popisných dat. Problém nastává u KM-D, kde tyto dva nástroje nejsou kompatibilní a je třeba doplnit jakýsi mezičlánek pro vzájemnou návaznost ISKN Studia a ISKN View.

Obrázek 1. ISKN Studio dostupné z internetových stránek ArcData Praha

ISKN Studio dostupné z internetových stránek ArcData Praha

Tvorba DKM nebo KM-D v programu KOKEŠ je podporována pouze na úroveň digitální mapy. Pokud bychom chtěli z vytvořené digitální mapy získat plnohodnotný GIS a moci data zobrazovat v některém z GIS produktů, je zapotřebí vyexportovat mapu do formátu *.shp a upravit jí podle pravidel GIS tak, aby se mapa skládala z polygonů s atributovou informací vázající se k jednotlivým polygonům.

Právě tento proces úpravy digitální katastrální mapy na polygonovou vrstvu a následné propojení s atributovými informacemi z Katastru nemovitostí je záležitostí této semestrální práce.

Příprava tvorby skriptu

Při rozhodování o způsobu zpracování skriptu bylo uvažováno řešení pomocí programovacího jazyka Visual Basic for Aplication (VBA) a skriptovacího jazyka Python, které jsou oba podporovány balíkem programů ArcGIS. Díky dostatečné jednoduchosti řešeného problému a vzhledem ke značné funkcionalitě skriptovacího jazyka Python byl právě on zvolen pro následné zpracování programu.

Program byl vyvíjen pod balíkem ArcGIS verze 9.1. a jazykem Python verze 2.1 a 2.4. S každou novou verzí programu ArcGIS se bohužel mění množina podporovaných příkazů jazyka, a tak jsou vytvořené programy těžko přenositelné pod jinou verzi programu ArcGIS. Různé verze jazyka Python neměly na funkčnost programu vliv.

Skript byl vyvíjen tak, aby jmennými konvencemi navázal na aplikaci ISKN Studio, která umožňuje export dat z výměnného formátu katastru nemovitostí do geodatabáze. Také byl brán ohled na další aplikaci ISKN View, která slouží k elegantnímu prohlížení popisných dat pomocí GIS. I v tomto případě byly dodrženy jmenné konvence pro kompatibilitu obou nástrojů.

Uživatelský manuál

Nejprve je třeba získat z vytvářené KM-D soubor ve formátu *.SHP. Po otevření podkladů KM-D ve formátu *.VYK v programu KOKEŠ musíme vyexportovat data do formátu *.SHP pomocí příkazu v hlavním panelu příkazů.

Ve druhém kroku potřebujeme získat aktuální databázi s údaji z katastru nemovitostí. Nainstalujeme program ISKN Studio, který je dostupný na stránkách firmy ArcDATA a.s. Praha. Použijeme také šablonu template.vfk z roku 2006, která je ke stažení na stejném místě a kterou překopírujeme do adresáře ...\ISKN Studio\Data. Pokud by nám program hlásil problémy s načtením šablony, je třeba zkontrolovat jeho strukturu, chyba by mohla být v redundanci některého z řádků šablony. Poté již stačí podle návodu k ISKN Studio založit novou databázi a vyexportovat do ní data ve formátu výměnného formátu katastru nemovitostí *.VFK.

Nyní přichází na řadu klíčový krok - spuštění skriptu. Stáhneme si vyhotovený skript do libovolného adresáře počítače a k němu do stejného adresáře umístíme liniové a textové vrstvy KM-D ve formátu *.SHP. Na stejné místo také přidáme vyexportovanou geodatabázi ve formátu *.MDB.

Obrázek 2. Uložení vstupních souborů ve společném adresáři

Uložení vstupních souborů ve společném adresáři

Poté otevřeme program Pythonwin a načteme do něj skript. Zkontrolujeme absolutní cesty ve skriptu - k ArcToolboxům a také názvy vrstev KM-D ve formátu *.SHP a spustíme skript.

Obrázek 3. Cesty k souborům a názvy, na které je třeba dát pozor

Cesty k souborům a názvy, na které je třeba dát pozor

Po chvilce budeme požádáni k zadání čísla katastrálního území.

Obrázek 4. Vstupní okno pro zadání čísla katastrálního území

Vstupní okno pro zadání čísla katastrálního území

Proběhnutí skriptu chvilku potrvá, v závislosti na rychlosti počítače a objemu dat. Pokud vše proběhne v pořádku, nezahlásí Pythonwin žádnou chybu a vypíše nenápadnou hlášku o úspěšném dokončení příkazu. Pokud by se vyskytly chyby, musíme se pokusit podle chybových hlášek odhalit zdroj problému.

Obrázek 5. Správné proběhnutí skriptu

Správné proběhnutí skriptu

Posledním krokem je zobrazení popisných dat katastru nemovitostí na základě hotového GIS. Nainstalujeme si podpůrnou aplikaci pro ArcGIS ISKN View. V programu ArcMap v nabídce Tools aktivujeme ISKN View a tím se nám přidá na lištu jednoduché tlačítko, na které po načtení podkladu - geografické vrstvy OP_POLY skriptem upravené databáze - klikneme a tím aktivujeme nástroj k prohlížení dat katastru nemovitostí.

Popis skriptu

Představovaný propojovací skript má za úkol propojit soubor popisných informací (SPI), v našem případě ve formátu *.VFK a soubor geodetických informací (SGI) ve formátu *.SHP. Skript nejprve otevře geodatabázi z aplikace ISKN Studio, načte shp-files z programu KOKEŠ a vytvoří mezi nimi primární klíč, aby bylo možné v geodatabázi vybudovat relaci mezi těmito dvěma zdroji. Poté z grafických liniových a bodových dat ve formátu *.shp vytvoří polygonovou vrstvu, která již ponese přidanou atributovou hodnotu - primární klíč. Tato nově vytvořená polygonová vrstva je následně uložena do geodatabáze a na závěr je na základě primárního klíče vybudována relace mezi touto polygonovou vrstvou a atributovou tabulkou s popisnými informacemi z katastru nemostí.

Skript byl vytvářen tak, aby byl co nejsnáze přenositelný na různé PC. Před spuštěním skriptu je třeba nakopírovat skript do adresáře s geodatabází vytvářenou programem ISKN Studio (export.mdb) a s liniovou a s textovou vrstvou DKM z programu KOKEŠ (např. PJ_Zelcany_DKM_l.SHP a PJ_Zelcany_DKM_t.SHP).

Také je třeba překontrolovat umístění ArcToolboxů na PC a případně změnit cestu ke zdroji. Ve skriptu byla použita absolutní cesta C:/Program Files/ArcGIS/ArcToolbox/Toolboxes/... . Ostatní cesty byly zadávány relativně a tudíž by s jejich změnou neměl být problém.

Nebezpečí se může skrývat u geodatabáze, kde je třeba překontrolovat u tabulky PAR registraci s geodatabází, která je u ArcGIS verze 9.1 vyžadována. Registraci provedeme jedině ručně, otevřením v programu ArcCatalog, pravým kliknutím na tabulku PAR a výběrem příkazu Register with geodatabase... . Registrace s databází vybuduje atributový sloupec OID, pokud ještě v tabulce neexistuje.

Hlavička skriptu

Každý skript v jazyku Python pro program ArcGIS musí začínat několika klíčovými řádkami. První dvě řádky jsou povinné. Nejprve je třeba naimportovat systémové moduly a poté vytvořit geoprocesor jako objekt. Dále může následovat nastavení úrovně licence produktu ArcGIS. Důležité je načtení odpovídajících toolboxů, které budou v dalších řádkách využity voláním jejich funkce. Samozřejmě je také možné nastavit pracovní prostředí. V tomto případě bylo využito nastavení adresáře jako výchozího prostředí podle umístění skriptu.

Ukázka kódu číslo 1: Hlavička skriptu

import sys, win32com.client, string, os # Import system modules gp = win32com.client.Dispatch("esriGeoprocessing.GpDispatch.1") # Create the Geoprocessor object gp.SetProduct("ArcInfo") # Set the necessary product code gp.AddToolbox("C:/Program Files/ArcGIS/ArcToolbox/Toolboxes/Data Management Tools.tbx") gp.AddToolbox("C:/Program Files/ArcGIS/ArcToolbox/Toolboxes/Conversion Tools.tbx") gp.AddToolbox("C:/Program Files/ArcGIS/ArcToolbox/Toolboxes/Analysis Tools.tbx") # Load required toolboxes... # dulezite je prenastavit cestu k ArcToolbox podle instalace na PC gp.workspace = os.getcwd() # nastaveni pracovniho prostredi jako cesty ke skriptu

Úprava souboru popisných informací

Pro propojení souboru popisných informací (SPI) se souborem geodetických informací (SGI) bylo nejprve třeba najít a vytvořit možný primární klíč k jednoznačné identifikaci údajů.

Z databáze ISKN byla vyexportována tabulka s údaji o parcelách, ve které se nacházelo několik důležitých atributů: ID = identifikační číslo záznamu, KATUZE_KOD = kód katastrálního území, KMENOVE = kmenové číslo parcely a PODDELENI = poddělení čísla parcely. Ostatní atributy nebyly exportovány.

Obrázek 6. SPI: Exportované atributry z databázové tabulky parcel Export.mdb/PAR

SPI: Exportované atributry z databázové tabulky parcel Export.mdb/PAR

Přímá úprava tabulky v geodatabázi nefungovala, zřejmě kvůli uzamknutí personální databáze v okamžiku úpravy. Jako primární klíč bylo zvoleno identifikační číslo záznamu (které je generováno ISKN a které je dále využíváno programem ISKN View), ale pro propojení obou zdrojů bylo nejprve třeba použít kombinaci čísla katastrálního území, čísla parcely a jejího poddělení.

Vně databáze byly v tabulce pomocí kurzoru postupně procházeny jednotlivé záznamy a do nového sloupce tabulky bylo uloženo unikátní číslo parcely složené z kombinace čísla katastrální území, čísla parcely a poddělení parcely. Oddělovač mezi číslem parcely a jeho poddělením byl použit stejný jako v SGI - zpětné lomítko. Nový sloupec s unikátním číslem parcely byl nazván KOD_PAR.

Obrázek 7. SPI: Vytvořený sloupec KOD_PAR s jednoznačným číslem parcely

SPI: Vytvořený sloupec KOD_PAR s jednoznačným číslem parcely

Ukázka kódu číslo 2: Úprava souboru popisných informací

PAR = "export.mdb/PAR" # tabulka db ISKN SPI = "SPI.dbf" # vyexportovana tabulka seme = gp.workspace # adresar pro umisteni vyexportovane tabulky gp.TableToTable_conversion(PAR, seme, "SPI", "", "ID ID VISIBLE;STAV_DAT STAV_DAT HIDDEN; DATUM_VZNIKU DATUM_VZNI HIDDEN;DATUM_ZANIKU DATUM_ZANI HIDDEN;PRIZNAK_KONTEXTU PRIZNAK_KO HIDDEN; RIZENI_ID_VZNIKU RIZENI_ID_ HIDDEN;RIZENI_ID_ZANIKU RIZENI_ID1 HIDDEN;PKN_ID PKN_ID HIDDEN; PAR_TYPE PAR_TYPE HIDDEN;KATUZE_KOD KATUZE_KOD VISIBLE;KATUZE_KOD_PUV KATUZE_K_1 HIDDEN; DRUH_CISLOVANI_PAR DRUH_CISLO HIDDEN;KMENOVE_CISLO_PAR KMENOVE VISIBLE;ZDPAZE_KOD ZDPAZE_KOD HIDDEN; PODDELENI_CISLA_PAR PODDELENI VISIBLE;DIL_PARCELY DIL_PARCEL HIDDEN;MAPLIS_KOD MAPLIS_KOD HIDDEN; ZPURVY_KOD ZPURVY_KOD HIDDEN;DRUPOZ_KOD DRUPOZ_KOD HIDDEN;ZPVYPA_KOD ZPVYPA_KOD HIDDEN; TYP_PARCELY TYP_PARCEL HIDDEN;VYMERA_PARCELY VYMERA_PAR HIDDEN;CENA_NEMOVITOSTI CENA_NEMOV HIDDEN; DEFINICNI_BOD_PAR DEFINICNI_ HIDDEN;TEL_ID TEL_ID HIDDEN;PAR_ID PAR_ID HIDDEN;BUD_ID BUD_ID HIDDEN; IDENT_BUD IDENT_BUD HIDDEN", "", ) # export tabulky z ISKN DB (atributy ID, KATUZE_KOD, KMENOVE, PODDELENI exportovany, ostatni ne) gp.AddField_management(SPI, "KOD_PAR", "TEXT", "", "", "", "", "NON_NULLABLE", "NON_REQUIRED", "",) # pridani noveho sloupce "KOD_PAR" do exportovane tabulky cur = gp.UpdateCursor(SPI) row = cur.Next() while row <> None: # naplneni sloupce "KOD_PAR" kompletnim cislem parcely # pro nepoddelena cisla parcel: if row.PODDELENI == 0: row.KOD_PAR = str(int(row.KATUZE_KOD)) + "-" + str(int(row.KMENOVE)) # pro poddelena cisla parcel: else: row.KOD_PAR = str(int(row.KATUZE_KOD)) + "-" + str(int(row.KMENOVE)) + "/" + str(int(row.PODDELENI)) cur.UpdateRow(row) row = cur.Next()

Úprava souboru geodetických informací

Analogický postup byl zvolen při práci se souborem geodetických informací SGI.

Při tvorbě digitální katastrální mapy a při následném exportování do formátu *.shp jsou informace o liniích, bodech a textu uloženy každé zvlášť. V souboru s textovými daty (např. PJ_Zelcany_DKM_t.SHP) zůstanou v atributech uloženy informace o čísle parcely a případně o jejím poddělení dohromady ve stejném sloupci (oddělené zpětným lomítkem). KM-D se vytváří po jednotlivých katastrálních územích, a tak je třeba číslo katastrálního území do tabulky zpětně dozadat.

Obrázek 8. SGI_t: Původní atributy souboru s textovými daty

SGI_t: Původní atributy souboru s textovými daty

Nejprve tedy byly vytvořeny dva nové sloupce v tabulce SGI_t, jeden pro uložení unikátního čísla parcely SGI_t.KOD_PAR a druhý SGI_t.PAR_ID, do kterého měl být nakopírován primární klíč - identifikační číslo záznamu z SPI. V dalším kroku byl uživatel požádán o zadání šestimístného čísla katastrálního území, které bylo uloženo do proměnné. Poté byly opět pomocí kurzoru postupně procházeny jednotlivé záznamy tabulky a do sloupce SGI_t.KOD_PAR bylo uloženo číslo sestávající se z kódu katastrálního území a čísla parcely včetně jejího případného poddělení.

Obrázek 9. SGI_t: Vytvořený sloupec KOD_PAR s jednoznačným číslem parcely

SGI_t: Vytvořený sloupec KOD_PAR s jednoznačným číslem parcely

Na závěr byly obě tabulky SPI a SGI propojeny pomocí vytvořeného čísla parcely SGI_t.KOD_PAR a do sloupce SGI_t.PAR_ID bylo překopírováno identifikační číslo záznamu z SPI.

Obrázek 10. SGI_t: Vytvořený sloupec PAR_ID s identifikačním číslem záznamu z tabulky SPI

SGI_t: Vytvořený sloupec PAR_ID s identifikačním číslem záznamu z tabulky SPI

Ukázka kódu číslo 3: Úprava souboru geodetických informací

SGI_t = "PJ_Zelcany_DKM_t.SHP" # shp-file s daty SGI gp.AddField_management(SGI_t, "KOD_PAR", "TEXT", "", "", "", "", "NON_NULLABLE", "NON_REQUIRED", "",) # pridani noveho sloupce "KOD_PAR" do shp gp.AddField_management(SGI_t, "PAR_ID", "DOUBLE", "", "", "", "", "NON_NULLABLE", "NON_REQUIRED", "",) # pridani noveho sloupce "PAR_ID" do shp KU = raw_input("Prosim zadejte sestimistne cislo katastralniho uzemi:") # pro KU Zelcany: 654965 cur1 = gp.UpdateCursor(SGI_t) row1 = cur1.Next() while row1 <> None: # naplneni sloupce "KOD_PAR" kompletnim cislem parcely row1.KOD_PAR = str(KU)+ "-" + str(row1.TEXT) cur2 = gp.UpdateCursor(SPI, "KOD_PAR='"+row1.KOD_PAR+"'") row2 = cur2.Next() while row2 <> None: row1.PAR_ID=row2.ID row2 = cur2.Next() cur1.UpdateRow(row1) row1 = cur1.Next()

Zpracování souboru geodetických informací

Pro zobrazení SGI jako plnohodnotného GIS bylo zapotřebí získat grafické informace jako plochy nesoucí své odpovídající atributové informace.

V programu KOKEŠ jsou linie ukládány do tří různých vrstev. Číslo jedna charakterizuje vlastnickou hranici, číslo čtyři nevlastnickou hranici a číslo sedm ostatní pomocné linie. Na základě tohoto rozdělení byl stanoven jednoduchý postup k tvorbě ploch z vlastnických i nevlastnických hranic.

Nejprve byly vybrány všechny linie vlastnické, s číslem jedna. Pomocí funkce FeatureToPolygon byly nad těmito liniemi vytvořeny plochy, kterým byla přidána atributová informace o čísle parcely. Ve druhém kroku byly vybrány všechny vlastnické i nevlastnické linie, tzn. číslo 1 a 4 a stejnou funkcí byly i nad těmito liniemi vytvořeny polygony, avšak bez přidání atributové informace. V posledním kroku bylo provedeno sjednocení obou druhů polygonů pomocí funkce Union, které zaručilo rozdělení území na nejmenší polygony a zároveň zachovalo správnou informaci o vlastníku polygonu.

Po tomto postupu mohly být odstraněny redundantní atributy z SGI (Id, TEXT a KOD_PAR). Pro snadnější manipulaci byl přidán také příkaz k vytvoření adresáře intermediate a funkce ke smazání meziproduktů tvorby polygonů, které byly do tohoto adresáře ukládány a poté smazání tohoto pracovního adresáře.

Ukázka kódu číslo 4: Zpracování souboru popisných informací

os.mkdir(os.getcwd()+"\intermediate") # tvorba pracovniho adresare sele2 = "intermediate/sele2.shp" poly1 = "intermediate/poly1.shp" poly2 = "intermediate/poly2.shp" SGI_poly = "SGI_poly.shp" gp.Select_analysis(SGI_l, sele1, "VRSTVA = '1' ") # tvorba ploch s informaci o cislu parcely gp.FeatureToPolygon_management(sele1, poly1, "", "ATTRIBUTES", SGI_t) gp.Select_analysis(SGI_l, sele2 , "VRSTVA = '1' OR VRSTVA = '4'") gp.FeatureToPolygon_management(sele2, poly2, "", "ATTRIBUTES", "") gp.Union_analysis("'intermediate/poly1.shp' '';'intermediate/poly2.shp' ''", SGI_poly, "NO_FID", "", "GAPS") gp.DeleteField_management(SGI_poly, "Id; TEXT; KOD_PAR") # smazani nepotrebnych sloupcu tabulky SGI def delete(path): for each in os.listdir(path): # funkce pro mazani obsahu adresare name = os.path.join(path, each) try: os.remove(name) except: delete(name) os.rmdir(name) delete(os.getcwd()+"\intermediate") # volani funkce ke smazani obsahu adresare os.rmdir(os.getcwd()+"\intermediate") # smazani pracoviho adresare

Import upraveného souboru geodetických informací do geodatabáze

Po všech provedených úpravách nad SGI bylo možné naimportovat tato data do geodatabáze.

Import se provedl jednoduchou funkcí FeatureClassToFeatureClassConversion. Přičemž zachován zůstal pouze sloupec PAR_ID, ostatní atributové sloupce nebyly nakopírovány.

Obrázek 11. SGI_poly: Importované atributy do databázové tabulky OP_POLY

SGI_poly: Importované atributy do databázové tabulky OP_POLY

Ukázka kódu číslo 5: Import upraveného souboru geodetických informací do geodatabáze

export_mdb = "export.mdb" gp.FeatureClassToFeatureClass_conversion(SGI_poly, export_mdb, "OP_POLY", "", "Id Id HIDDEN; TEXT TEXT_ HIDDEN;KOD_PAR KOD_PAR HIDDEN", "SAME_AS_TEMPLATE", "SAME_AS_TEMPLATE", "", "0", ) # konverze SHP s SGI do DB

Vybudování relace v geodatabázi

Posledním krokem, který zbýval k finálnímu propojení SPI a SGI v geodatabázi bylo vybudování relace mezi tabulkou parcel PAR a naimportovanou digitální katastrální mapou OP_POLY. Relace byla vytvořena příkazem CreateRelationShipClass a byla nazvána podle dostupných podkladů pro další možné zpracování pomocí ISKN Tools.

Obrázek 12. Export.mdb: Vybudování relace mezi SPI (PAR) a SGI (OP_POLY)

Export.mdb: Vybudování relace mezi SPI (PAR) a SGI (OP_POLY)

Ukázka kódu číslo 6: Vybudování relace v geodatabázi

OP_POLY = "export.mdb/OP_POLY" PAR_OP_POLY = "export.mdb/PAR_OP_POLY" gp.CreateRelationshipClass_management(PAR, OP_POLY, PAR_OP_POLY, "SIMPLE", "OP_POLY", "PAR", "NONE", "ONE_TO_ONE", "NONE", "ID", "PAR_ID", "", "") # tvorba relace mezi SPI a SGI v DB

Závěr

V této semestrální práci byl vyvinut skript pro propojení souboru geodetických informací se souborem popisných informací. Skript byl vytvářen tak, aby byl co nejsnáze přenositelný a aby zaručil kompatibilitu s produkty ISKN Studio a ISKN View.