Spatialite je rozšíření SQLite pro uložení geografických vrstev.
Spatialite existuje upravená pro Android.
Při volání následujících příkazů mi sqlite vracelo chybu unable to open database file
.
db.exec("DROP TABLE 'idx_%q_%q';", null, argsGeom); db.exec("VACUUM;", null, argsTable);
Zjistil jsem, že chyba je v tom, že sqlite při těchto příkazech vytváří dočasný soubor, který se nepodařilo vytvořit.
Pomohlo nastavit při otevření databáze pragmu temp_store
na 2. To má za následek, že všechno co sqlite potřebuje, vytváří v paměti.
db.exec("PRAGMA temp_store = 2;", null, null);
Význam pragmy temp_store
je vysvětlený zde.
vytvoření nové vrstvy a jejího indexu
CREATE TABLE test_geom ( id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, measured_value DOUBLE NOT NULL); SELECT AddGeometryColumn('test_geom', 'geometry', 4326, 'POINT', 'XY'); SELECT CreateSpatialIndex('test_geom', 'geometry');
vrátí extent vrstvy podle indexu
SELECT MIN(xmin) AS xmin, MAX(xmax) AS xmax, MIN(ymin) AS ymin, MAX(ymax) AS ymax FROM "idx_tabulka_geometry"
vrátí objekty protínající zadaný obdélník (využívá index)
SELECT AsBinary(Transform(geometry, ?)) FROM "tabulka" WHERE ROWID IN (SELECT pkid FROM "idx_tabulka_geometry" WHERE pkid MATCH RTreeIntersects(?, ?, ?, ?))
vrátí objekty protínající zadaný obdélník (bez využití indexu)
SELECT AsBinary(Transform(geometry, ?)) FROM "tabulka" WHERE MbrIntersects(BuildMBR(?, ?, ?, ?), Transform(geometry, ?)) = 1
inicializuje databázi
SELECT InitSpatialMetaData()
převede bodovou vrstvu places
se sloupcem geometrie GEOMETRY
na shapefile obce.shp
v kodování UTF-8
.dumpshp places GEOMETRY obce UTF-8 POINT