У меня есть несколько тысяч полигонов в SpatiaLite. Я пытаюсь сделать запрос "прикосновения":
select map1.* from map1,map2
where touches(map1."Geometry",map2."Geometry")
и вау, это МЕДЛЕННО!
Однако, если я попрошу сделать это только для одной посылки в map1, она будет работать очень быстро.
select map1.* from map1,map2
where touches(map1."Geometry",map2."Geometry")
and map1."ROWID" = 753
Я ожидаю, что первый запрос будет выполняться медленнее, но он удивительно медленный. Он работает очень быстро в SQLServer, Manifold GIS и PostGIS. Spatialite просто действительно неэффективен?
spatialite
AJL
источник
источник
Ответы:
Нет, SpatiaLite не такой медленный, вам просто нужно использовать пространственный индекс. Из-за ограничений в дизайне SQLite использование пространственного индекса в запросе не так невидимо, как в PostGIS.
Вот пример, измененный из поваренной книги SpatiaLite http://www.gaia-gis.it/spatialite-3.0.0-BETA/spatialite-cookbook/html/neighbours.html
После создания пространственного индекса в ваших наборах полигонов
источник
В книге Эрика Вестры «Python Geospatial Development» на странице 188 показано, что для операции CONTAINS, по меньшей мере, Spatialite может, что удивительно, работать быстрее, чем MySQL и PostGIS, - если соблюдается процедура пространственной индексации.
источник
Я написал блог об этом некоторое время назад. Смотрите http://www.frogmouth.net/blog/?p=23
Миха также написал интересный блог на эту тему .
источник