SpatiaLite: Porovnání verzí

Z GeoWikiCZ
mBez shrnutí editace
Řádek 51: Řádek 51:


<source lang="sql">
<source lang="sql">
spatialite> SELECT nazev,Area(the_geom)/1e6 AS plocha FROM obce ORDER BY plocha DESC LIMIT 5;
spatialite> SELECT nazev,Area(geom)/1e6 AS plocha FROM obce ORDER BY plocha DESC LIMIT 5;
Praha|496.077202708984
Praha|496.077202708984
Hradiště|328.857295861328
Hradiště|328.857295861328
Řádek 88: Řádek 88:
time spatialite gis1.sqlite \
time spatialite gis1.sqlite \
"SELECT COUNT(DISTINCT kodob) FROM obce JOIN zeleznice AS \
"SELECT COUNT(DISTINCT kodob) FROM obce JOIN zeleznice AS \
zelez ON intersects(zelez.geometry, obce.geometry);"
zelez ON intersects(zelez.geom, obce.geom);"
</source>
</source>



Verze z 13. 4. 2011, 17:17

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

Nejprve stáhneme inicializační soubor, např.

wget  http://www.gaia-gis.it/spatialite/init_spatialite-2.3.sql.gz
gzip -d init_spatialite-2.3.sql.gz

Vytvoříme a inicializujeme databázi 'gisdb.sqltite' (metadatové tabulky geometry_columns a spatial_ref_sys).

spatialite gisdb.sqlite < /usr/local/share/init_spatialite-2.3.sql

alternativně

spatialite -init /usr/local/share/init_spatialite-2.3.sql gisdb.sqlite

Nyní je databáze připravena pro práci s geoprostorovými daty.

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.geom, obce.geom);"
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/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.

Přidání SpatiaLite vrstvy v QGISu (1)
Přidání SpatiaLite vrstvy v QGISu (2)

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

Související články

Externí odkazy