VFK / GDAL
VFK driver je součástí knihovny GDAL od verze 1.7. Zdrojový kód lze získat ze SVN (pod otevřenou licencí X/MIT) projektu GDAL/OGR.
Podpora formátu VFK v knihovně GDAL nedávno prošla značným vylepšení, v současnosti doporučujeme minimálně verzi 2.0 knihovny. Verze GDAL 1.9 a nižší obsahuje zastaralý kód, který neposkytuje stabilní podporu pro čtení dat ve formátu VFK.
Kompilace (pro vývojáře)
Pro přístup k datům ve formátu VFK je nutné knihovnu GDAL zkompilovat s podporou SQLite. V opačném případě bude přístup datům ve formátu VFK bude velmi pomalý (data v paměti, prvky vyhledávány sekvenčním průchodem) a často i nefunkční (v případě, že ve vstupním souboru nebudou datové věty &D řazeny logicky). Od verze GDAL 1.10 je VFK driver zkompilován pouze s podporou SQLite.
Návod pro GNU/Linux:
svn co https://svn.osgeo.org/gdal/trunk/gdal cd gdal ./configure --with-sqlite make make install
Poznámky pro kompilaci pod různými OS.
Po instalaci si ověříme podporu pro VFK:
ogrinfo --formats | grep VFK -> "VFK" (readonly)
Instalace (pro uživatele)
MS Windows
Jedna z možností je využít framework OSGeo4W.
Postup:
- Stáhnout a spustit OSGeo4W instalátor 32bit anebo 64bit
- Zvolit "Express Desktop Install",
- Zaškrtnout "GDAL",
![]() |
![]() |
Funkcionalitu lze otestovat z příkazové řádky OSGeo4W (nabídka Start | OSGeo4W | OSGeo4W | OSGeo4W shell).
Poznámky k ovládání
ogrinfo
Nástroj ogrinfo je součástí knihovny GDAL.
Při prvním čtení dat VFK je vytvořena interní SQLite databáze, do které jsou tato data uložena. Obsah databáze (je uložena ve stejném adresáři jako VFK soubor s příponou .db
) lze ověřit například pomocí aplikace SQLite Database Browser. První čtení dat VFK bude trvat vždy delší dobu než opětovném načtení (již z databáze), viz příklad níže.
ogrinfo exportvse.vfk
1: PAR (Polygon) 2: BUD (Polygon) ... 74: BUDOBJ (None) 75: ADROBJ (None)
První načtení:
real 0m10.451s
Další načtení:
real 0m0.150s
Geometrie prvků je sestavena až když o ni uživatel požádá, např.
ogrinfo exportvse.vfk PAR -fid 1
OGRFeature(PAR):1 ID (String) = 3067989306 STAV_DAT (Integer) = 0 ... PS_ID (String) = (null) IDENT_PS (String) = n POLYGON ((-782056.31 -1163421.42,-782056.5 -1163421.35, ...))
První dotaz na geometrii (data jsou již načtena do interní databáze, nicméně bez sestavené geometrie, viz obrázek výše).
real 0m2.175s
Opětovný dotaz na geometrii:
real 0m0.363s
Sestavená geometrie je uložena přímo v databázi (viz obrázek níže) pro všechny potřebné bloky, v tomto případě PAR → HP → SBP → SOBR.
Chování knihovny lze ovlivnit proměnnými prostředí, viz manuál. Například OGR_VFK_DB_SPATIAL zamezí uložení geometrie přímo do databáze, potom se sestavuje geometrie vždy znovu.
OGR_VFK_DB_SPATIAL=NO ogrinfo exportvse.vfk PAR -fid 1
První načtení:
real 0m2.297s
Druhé načtení:
real 0m2.302s
Ve výchozím nastavení jsou při prvním načtení do interní SQLite databáze zpracovány všechny VFK bloky (v podobě tabulek). Proměnná prostředí OGR_VFK_DB_READ_ALL_BLOCKS toto chování ovlivňuje. Při OGR_VFK_DB_READ_ALL_BLOCKS=NO načte knihovna do databáze pouze potřebné bloky, v tomto případě PAR → HP → SBP → SOBR.
OGR_VFK_DB_READ_ALL_BLOCKS=NO ogrinfo exportvse.vfk PAR -fid 1
Ladění chyb
Při chybě nejprve aktivujte mód, ve kterém se vypisují debugovací zprávy. Tento mód aktivujeme z příkazové řádky:
set CPL_DEBUG=ON
Výpis lze přesměrovat do souboru (v tomto případě "log.txt"), např.
ogrinfo exportvse.vfk 2>log.txt
Debug mód deaktivujeme podobně:
set CPL_DEBUG=OFF
Ladící skripty
Testovací Python skripty jsou dostupné z Git repozitáře:
git clone git@github.com:landam/ogr-vfk-testing.git
Ke stažení i jako archiv ogr-vfk-testing-master.zip.
Pro spuštění je nutný interpret pro jazyk Python.
Příklad použití:
python read-vfk-test/read-vfk.py exportvse.vfk
Reading '/home/landa/geodata/vfk/exportvse.vfk'... -------------------------------------------------------------------------------- Fetching PAR ... 607 polygon features detected Fetching BUD ... 58 polygon features detected Fetching BUDOBJ ... 33 features detected Fetching ADROBJ ... 33 features detected -------------------------------------------------------------------------------- 23.6 seconds process time (first pass - from VFK file) -------------------------------------------------------------------------------- 0.12 seconds process time (second pass - from SQLite DB) --------------------------------------------------------------------------------
QGIS
Pro QGIS existuje specializovaný plugin - QGIS VFK Plugin.
Stav projektu
Ovladač OGR-VFK je stále ve fázi vývoje. Budeme rádi za Vaši zpětnou vazbu.
Seznam vrstev obsahující geometrii prvků DKM:
- Bod (Point)
- OB, OBBP, OBPEJ, OP, SOBR, SPOL
- Linie (Line String)
- SBP, HP, DPM, SBM
- Polygon (Polygon)
- PAR, BUD
Vrstva | Typ |
---|---|
HP | PL |
OP | NL / NB |
OB | PL / NB |
DPM | NB / PB / NL / PL |
OBBP | PB / NB |
HBPEJ | NL |
OBPEJ | NB |
kde:
- NB – nepolohopisný bodový prvek
- PB – polohopisný bodový prvek
- NL – nepolohopisný liniový prvek
- PL – polohopisný liniový prvek
![]() Diagram tematických vrstev (zdroj: [1]) |
Příklady použití
Příklad ogrinfo
$ ogrinfo data.vfk PAR -q -fid 1 Layer name: PAR OGRFeature(PAR):1 ID (Integer) = 92340708 STAV_DAT (Integer) = 0 DATUM_VZNIKU (DateTime) = (null) DATUM_ZANIKU (DateTime) = (null) PRIZNAK_KONTEXTU (Integer) = 3 RIZENI_ID_VZNIKU (Integer) = 379087708 RIZENI_ID_ZANIKU (Integer) = (null) PKN_ID (Integer) = (null) PAR_TYPE (String) = "PKN" KATUZE_KOD (Integer) = 616567 KATUZE_KOD_PUV (Integer) = (null) DRUH_CISLOVANI_PAR (Integer) = 1 KMENOVE_CISLO_PAR (Integer) = 1 ZDPAZE_KOD (Integer) = (null) PODDELENI_CISLA_PAR (Integer) = 1 DIL_PARCELY (Integer) = (null) MAPLIS_KOD (Integer) = 6780 ZPURVY_KOD (Integer) = 2 DRUPOZ_KOD (Integer) = 13 ZPVYPA_KOD (Integer) = (null) TYP_PARCELY (Integer) = (null) VYMERA_PARCELY (Integer) = 809 CENA_NEMOVITOSTI (Real) = (null) DEFINICNI_BOD_PAR (String) = "" TEL_ID (Integer) = 64156708 PAR_ID (Integer) = (null) BUD_ID (Integer) = 25735708 IDENT_BUD (String) = "a" POLYGON ((-651240.46999999997206 -1069564.110000000102445,-651217.300000000046566 -1069525.409999999916181, -651212.400000000023283 -1069517.21999999997206,-651215.810000000055879 -1069515.679999999934807, -651219.959999999962747 -1069524.169999999925494,-651225.680000000051223 -1069521.5, -651235.0 -1069517.149999999906868,-651239.520000000018626 -1069527.510000000009313, -651241.260000000009313 -1069526.75,-651242.770000000018626 -1069530.179999999934807, -651241.020000000018626 -1069530.939999999944121,-651253.819999999948777 -1069560.239999999990687, -651244.46999999997206 -1069564.21999999997206,-651240.46999999997206 -1069564.110000000102445))
Více souborů VFK pro jednoho území
Často jsou soubory VFK distribuovány ve více souborech pro jedno území. Pro zpracování v GDAL je třeba všechny soubory jednoho území nahrát do jedné databáze. Příklad pro dva soubory SGI a SPI:
ogrinfo --config OGR_VFK_DB_NAME uzemi.db SGI.vfk
ogrinfo --config OGR_VFK_DB_NAME uzemi.db SPI.vfk
Od verze GDAL 2.2 je možné volat přímo i db:
ogrinfo -so uzemi.db
Ukázka skriptu v jazyce Python
Ukázka skriptu v jazyce Python:
1 #!/usr/bin/env python
2
3 """
4 Skript porovna zname a vypoctene vymery parcel a vysledek vytiskne
5 v podobe tabulky.
6
7 parcelni cislo|vypoctene vymera|znama vymera|rozdil
8
9 ./par-vymera.py cesta/k/souboru/vfk
10 """
11
12 import sys
13
14 import ogr
15
16 def usage():
17 print >> sys.stderr, __doc__
18
19 def open_ds(filename):
20 """Otevrit datasource (VFK)"""
21 ds = ogr.Open(filename)
22
23 if ds is None:
24 print >> sys.stderr, 'Nelze otevrit OGR datasource "%s"' % filename
25
26 return ds
27
28 def get_layer_par(ds):
29 """Ziskat vrstvu 'PAR'"""
30 layer = ds.GetLayer('PAR')
31
32 if layer is None:
33 print >> sys.stderr, 'Nelze nacist OGR vrstvu "PAR"'
34
35 return layer
36
37 def read_feat_par(layer):
38 """Nacist prvky ve vrstve 'PAR'"""
39 tab = list()
40
41 defn = layer.GetLayerDefn()
42 if defn is None:
43 print >> sys.stderr, 'Nelze ziskat informace o vrstve'
44 return -1
45
46 idx_id = defn.GetFieldIndex("ID")
47 idx_area = defn.GetFieldIndex("VYMERA_PARCELY")
48
49 layer.ResetReading()
50 while True:
51 feat = layer.GetNextFeature()
52 if feat is None:
53 break
54
55 pc = feat.GetFieldAsInteger(idx_id)
56 area = feat.GetFieldAsInteger(idx_area)
57
58 geom = feat.GetGeometryRef()
59 if geom is None:
60 area_comp = -1
61 else:
62 area_comp = geom.GetArea()
63
64 tab.append((pc, area, area_comp))
65
66 return tab
67
68 def print_tab(tab):
69 """Vytisknout tabulku"""
70 for pc, area_attrb, area_comp in tab:
71 print '%d %10d %10.1f %5.1f' % (pc, area_attrb, area_comp, area_attrb - area_comp)
72
73 def main():
74 if len(sys.argv) != 2:
75 usage()
76 return 0
77
78 ds = open_ds(sys.argv[1])
79 if ds is None:
80 return 1
81
82 layer_par = get_layer_par(ds)
83 if layer_par is None:
84 return 1
85
86 tab = read_feat_par(layer_par)
87 if tab == -1:
88 return 1
89
90 print_tab(tab)
91
92 ds.Destroy()
93
94 return 0
95
96 if __name__ == "__main__":
97 sys.exit(main())
Příklad výstupu:
92340708 809 809.3 -0.3 92341708 1108 1107.8 0.2 92342708 397 397.1 -0.1
Známé problémy
Rychlost načítání dat
- Načítání dat je i při opětovném použití příliš pomalé
Ovladač pro formát VFK v knihovně GDAL prošel ve verzi 2.0 řadou vylepšení a optimalizací načítání dat. Na testovacím PC:
- GDAL 1.11: 9646 ms
- GDAL 2.0: (první načtení při kterém se vytváří DB): 2805 ms
- GDAL 2.0: (opětovné načtení DB): 625 ms
Pro otestování pod MS Windows následujte tento návod.
Křivky, kružnice, kruhové oblouky
- Křivky jsou knihovnou GDAL podporovány až ve vývojové verzi 2.0. To má zásadní vliv na korektní zpracování prvků z bloku SBP s parametry spojení 11 (křivka), 15 (kružnice) a 16 (kruhové oblouky), viz ukázky níže.
Nevalidní geometrie
- Driver reportuje prvky s nevalidní geometrií, jak zjistím o jaké prvky se jedná?
Existují dvě možnosti:
1) Dotázat se na prvky přímo ve vytvořené SQLite databázi. Např. pro
Warning 1: SBP: 2 features with invalid or empty geometry found
by SQL dotaz v DB vypadal následovně:
select id,ogr_fid,bp_id from sbp where poradove_cislo_bodu=1 and geometry is null;
5705088306|6052|5791638306 5705260306|6127|5791543306
2) Spustit import znovu s proměnnými prostředí OGR_VFK_DB_OVERWRITE (vynutí si znovuvytvoření DB) a CPL_DEBUG (tzv. debug mód ve kterém najdete bližší informace o prvcích, které vedly k nevalidní geometrii). Výstup z debug módu přesměrujte např. do souboru 'log.txt'.
OGR_VFK_DB_OVERWRITE=YES CPL_DEBUG=ON ogrinfo exportvse.vfk PAR -fid 1 2>log.txt
OGR-VFK: VFKReaderSQLite::PrepareStatement(): SELECT ogr_fid from SOBR WHERE ID = 5791638306 OGR-VFK: SBP: invalid linestring fid = 6052 OGR-VFK: VFKReaderSQLite::PrepareStatement(): SELECT ogr_fid from SOBR WHERE ID = 5791543306 OGR-VFK: SBP: invalid linestring fid = 6127
Náměty na další vývoj
- Revize vrstev s geometrií, implementace GeometryCollection pro vybrané prvky.
- Implementace podpory pro změnových souborů
- Rozšíření databázového backendu na PostgreSQL/PostGIS
- Podpora pro soubory ve formátu XML
Související články
- VFK (Výměnný formát ISKN)
- QGIS VFK Plugin
Kontakt na autora
- Martin Landa <landa.martin gmail.com>
Projekt byl institucionálně podpořen Katedrou geomatiky (Fakulta stavební, ČVÚT v Praze).