Mam kilka tysięcy wielokątów w SpatiaLite. Próbuję wykonać zapytanie „dotyka”:
select map1.* from map1,map2
where touches(map1."Geometry",map2."Geometry")
i wow, czy to jest WOLNE!
Jeśli jednak poproszę go o zrobienie tego tylko dla jednej paczki na mapie 1, działa ona bardzo szybko.
select map1.* from map1,map2
where touches(map1."Geometry",map2."Geometry")
and map1."ROWID" = 753
Oczekuję, że pierwsze zapytanie będzie działało wolniej, ale jest zadziwiająco wolne. Działa bardzo szybko w SQLServer, Manifold GIS i PostGIS. Czy Spatialite jest po prostu naprawdę nieefektywny?
spatialite
ajl
źródło
źródło
Odpowiedzi:
Nie, SpatiaLite nie jest tak wolny, wystarczy użyć indeksu przestrzennego. Z powodu ograniczeń w projekcie SQLite użycie indeksu przestrzennego w zapytaniu nie jest tak niewidoczne, jak w PostGIS.
Oto przykład zmodyfikowany ze SpatiaLite Cookbook http://www.gaia-gis.it/spatialite-3.0.0-BETA/spatialite-cookbook/html/neighbours.html
Po utworzeniu indeksu przestrzennego w zestawach danych wielokątów
źródło
W książce Erica Westry „Python Geospatial Development” strona 188 pokazuje, że dla operacji ZAWIERA co najmniej Spatialite może, być może, co zaskakujące, działać szybciej niż MySQL i PostGIS - jeśli zastosowana zostanie procedura indeksowania przestrzennego.
źródło
Pisałem o tym blog już jakiś czas temu. Zobacz http://www.frogmouth.net/blog/?p=23
Micha napisał również ciekawy blog na ten temat .
źródło