VFK / GDAL

Z FreeGIS portál
Přejít na: navigace, hledání

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 1.10 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:

  1. Stáhnout a spustit OSGeo4W instalátor 32bit anebo 64bit
  2. Zvolit "Express Desktop Install",
  3. Zaškrtnout "GDAL",
  4. Pro otestování nejaktuálnější verze podpory VFK stáhněte soubor gdal110.dll pro 32bit anebo 64bit (TODO) a překopírujte ho do adresáře C:\OSGeo4W\bin (původní soubor je vhodné zazálohovat).
Osgeo4w-gdal-0.png Osgeo4w-gdal-1.png

Funkcionalitu lze otestovat z příkazové řádky OSGeo4W (nabídka Start | OSGeo4W | OSGeo4W | OSGeo4W shell).

OSGeo4W Shell: Příkaz ogrinfo

Testování

Pro testování použije nejnovější verzi knihovny GDAL (2.0.0dev) z balíčku OSGeo4W_vfr. Tento ZIP arhiv rozbalte, příkazovou řádku spustíte pomocí skriptu OSGeo4W.bat.

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

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
Obsah databáze po načtení dat (bez geometrie)

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.

Obsah databáze po načtení dat (včetně geometrie)

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
Obsah databáze po načtení dat (OGR_VFK_DB_READ_ALL_BLOCKS=NO)

Python 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. V současnosti se pracuje na podpoře VFK 5.0.

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řehled datových bloků pro sestavení geometrie prvků digitální katastrální mapy

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))

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.
Znázornění křivek ve verzi GDAL 1.11 a 2.0
Znázornění kružnic daných třemi body ve verzi GDAL 1.11 a 2.0
Znázornění kružnic daných středem a poloměrem ve verzi GDAL 1.11 a 2.0
Znázornění kruhových oblouků ve verzi GDAL 1.11 a 2.0

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.
  • Podpora pro křivky jako liniové 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

Kontakt na autora

Projekt byl institucionálně podpořen Katedrou geomatiky (Fakulta stavební, ČVÚT v Praze).