SpatiaLite

Prostorové rozšíření SpatiaLite umožňuje ukládat v databázi SQLite geoprostorová data - podobně jako např. PostGIS pro databázový systém PostgreSQL.
SpatiaLite také podporuje ukládání a analýzu rastrových dat - viz RasterLite.
Více v přednáškách předmětu Úvod do zpracování prostorových dat.
Pod operačním systémem Debian GNU/Linux nainstalujeme SpatiaLite příkazem
sudo apt-get install spatialite-gui libspatialite2 spatialite-bin
Založení databáze
spatialite gisdb.sqlite spatialite> .tables geom_cols_ref_sys geometry_columns_auth views_geometry_columns geometry_columns spatial_ref_sys virts_geometry_columns spatialite> .exit
Import dat
Pro tento účel můžeme vyexportovat data např. z cvičné databáze PostGIS do formátu ESRI ShapeFile.
pgsql2shp pgis_student gis1.obce
Data ve formátu ESRI Shapefile naimportujeme
spatialite_tool -i -shp obce -d gisdb.sqlite -t obce -c UTF-8 -s 2065 -g geom
anebo přímo z interpretu SpatiaLite
spatialite> .loadshp ./obce obce UTF-8 2065 geom
Ukázka jednoduchého dotazu
spatialite> SELECT nazev,Area(geom)/1e6 AS plocha FROM obce ORDER BY plocha DESC LIMIT 5;
Praha|496.077202708984
Hradiště|328.857295861328
Brdy|259.774799202647
Libavá|238.31301229512
Brno|230.03067746875
OGR
Pro import/export dat lze využít i knihovnu OGR, která volitelně SQLite podporuje.
Příklad konverze dat z PostGIS do SpatiaLite.
ogr2ogr -append -f SQLite gisdb.sqlite pg:dbname=pgis_student gis1.obce
Poznámka: Před importem dat je nutné vložit SRID 102067 do tabulky 'spatial_ref_sys'.
INSERT into spatial_ref_sys (srid, auth_name, auth_srid, ref_sys_name, proj4text) values
(9102067, 'esri', 102067, 'S-JTSK', '+proj=krovak +lat_0=49.5 +lon_0=24.83333333333333
+alpha=30.28813975277778 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +units=m +no_defs');
Replikace cvičné databáze PostGIS
Příklad importu dat z cvičné databáze PostGIS, schéma gis1.
ogr2ogr -f SQLite -dsco "SPATIALITE=yes" gis1.sqlite PG:'dbname=pgis_student schemas=gis1'
Test časové náročnosti dotazu
- SpatiaLite
time spatialite gis1.sqlite \
"SELECT COUNT(DISTINCT kodob) FROM obce JOIN zeleznice AS \
zelez ON intersects(zelez.geometry, obce.geometry);"
real 1m17.940s user 1m17.853s sys 0m0.036s
- PostGIS
time psql pgis_student -c \
"SELECT COUNT(DISTINCT kodob) FROM gis1.obce AS obce JOIN gis1.zeleznice AS \
zelez ON ST_Intersects(zelez.geom, obce.geom);"
real 0m0.582s user 0m0.016s sys 0m0.008s
Virtuální tabulky
Příklad přípojení dat ve formátu Shapefile jako virtuální tabulku.
CREATE VIRTUAL TABLE obce USING VirtualShape(obce, UTF-8, 2065);
Síťové analýzy
Pro síťové analýzy lze použít virtuální tabulku VirtualNetwork, která implementuje Dijkstrův algoritmus pro vyhledání nejkratší cesty.
Prvním krokem je vytvoření sítě (tj. dat reprezentující graf). Podmínky jsou následující:
- Každá entita reprezentuje jednu hranu (LineString)
- Každé hraně je přiřazena dvojice uzlů - počáteční a koncový uzel
- Síť musí být topologicky konzistentní
- Každá hrana musí být ohodnocena
Příklad
Stáhneme testovací databázi.
wget http://www.gaia-gis.it/spatialite-2.3.1/test-network-2.3.zip unzip test-network-2.3.zip
spatialite test-network-2.3.sqlite spatialite> .tables Roads geom_cols_ref_sys spatial_ref_sys Roads_net geometry_columns views_geometry_columns Roads_net_data geometry_columns_auth virts_geometry_columns
Tabulka 'Roads' obsahuje informace o hranách a uzlech sítě.
.header ON .mode column
SELECT * FROM Roads;
PK_UID F_NODE T_NODE Type Speed TravelTime Geometry ---------- ---------- ---------- ------------------------- ---------- ----------- ---------- 1 1 4 Track, trail, or footpath 25 3366.262555 2 3 5 Primary and secondary roa 60 731.781584 3 2 5 Dual lane (divided) highw 90 473.932218 4 5 8 Dual lane (divided) highw 90 172.213277 5 9 8 Primary and secondary roa 60 229.290357 ...
SELECT PK_UID, F_NODE, T_NODE,
X(StartPoint(Geometry)), Y(StartPoint(Geometry)), X(EndPoint(Geometry)), Y(EndPoint(Geometry))
FROM Roads
WHERE F_NODE = 500 OR T_NODE = 500;
PK_UID F_NODE T_NODE X(StartPoint(Geometry)) Y(StartPoint(Geometry)) X(EndPoint(Geometry)) Y(EndPoint(Geometry)) ---------- ---------- ---------- ----------------------- ----------------------- --------------------- --------------------- 590 500 493 451431.332913083 5035043.8070646 460761.5959512 5035818.19827513 591 406 500 450462.268978926 5051471.8728337 451431.332913083 5035043.8070646 686 569 500 431913.235465203 5026366.2154841 451431.332913083 5035043.8070646 719 500 591 451431.332913083 5035043.8070646 453777.698716646 5019713.60939104
Topologická konzistence sítě se může zkontrolovat pomocí nástroje spatialite_network.
spatialite_network -d test-network-2.3.sqlite -T Roads -f F_NODE -t T_NODE -c TravelTime -g Geometry SQLite version: 3.6.16 SpatiaLite version: 2.3.1 Step I - checking for table and columns existence spatialite-network-validator ================================================================== SpatiaLite db: test-network-2.3.sqlite validating table: Roads columns layout ================================================================== FromNode: F_NODE ToNode: T_NODE Cost: TravelTime Geometry: Geometry assuming arcs to to be BIDIRECTIONAL simple validation required [NETWORK-DATA table creation is disabled] ================================================================== Step II - checking value types consistency Step III - checking topologic consistency Step IV - final evaluation Statistics ================================================================== # Arcs : 8270 # Nodes: 3186 Node max incoming arcs: 7 Node max outcoming arcs: 7 # Nodes cardinality=1: 490 [terminal nodes] # Nodes cardinality=2: 828 [meaningless, pass-through] ================================================================== OK: network passed validation you can apply this configuration to build a valid VirtualNetwork OK: validation passed
Dále tabulka 'Roads_net' obsahuje binární data odpovídající grafu sestaveného z dat uložených v tabulce 'Roads'.
SELECT * FROM Roads_net
WHERE NodeFrom = 1 AND NodeTo = 512;
ArcRowid NodeFrom NodeTo Cost Geometry ---------- ---------- ---------- ------------ ---------- 1 512 20626.221351 1 1 4 3366.262555 11 4 16 1418.458904 13 16 18 231.478398 42 18 47 2153.035087 53 47 56 593.539445 85 56 82 1609.677774 109 82 104 1173.010472 133 104 127 563.796034 211 127 195 1352.700731 238 195 217 355.297045 259 217 233 154.855523 294 233 265 250.381625 325 265 293 519.554469 376 293 330 1618.368949 375 330 313 553.572367 365 313 321 162.804166 364 321 320 899.380942 608 320 512 3650.046865
Vizualizace dat v QGISu
QGIS nabízí od verze 1.1.0 zásuvný modul pro SpatialLite.


Poznámka: V současné době neumožňuje QGIS vizualizovat data připojené jako virtuální tabulky.