Spatialite真的很慢吗?


9

我在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真的效率低下吗?


9
请参见此处,了解一些关于spaceiteite速度的测试-如果您使用索引,则表明在大型数据集上进行ST_Intersects操作的速度提高了200倍!
Simbamangu

感谢您的链接Fezter。该示例的唯一问题是,他必须编写额外的SQL代码以包含边界框(并且,他不得不强制将其作为信封输入)。如果下一版本的spacespaceite会简单地利用已经存在的空间索引,那就太好了。
2012年

欢迎来到gis.stackexchange.com!该网站的格式意味着发布的答案应该是原始问题的答案。回答答案或评论时,最好使其成为评论。
肖恩

Answers:


16

不,SpatiaLite不会那么慢,您只需要使用空间索引即可。由于SQLite设计的局限性,在查询中使用空间索引并不像在PostGIS中那样隐蔽。

这是从SpatiaLite Cookbook http://www.gaia-gis.it/spatialite-3.0.0-BETA/spatialite-cookbook/html/neighbours.html修改的示例

在多边形数据集上创建空间索引之后

    SELECT map1.*
      FROM map1, map2
     WHERE ST_Touches(map1.geometry, map2.geometry)
       AND map2.ROWID IN (
           SELECT pkid
             FROM idx_map1_geometry
            WHERE pkid MATCH RTreeIntersects(
                  MbrMinX(map1.geometry),
                  MbrMinY(map1.geometry),
                  MbrMaxX(map1.geometry),
                  MbrMaxY(map1.geometry)));

DavidF:谢谢您的回答。那肯定会加快速度。太糟糕的是,空间运算没有隐式使用空间索引。但是,我认为最后一个AND子句可以附加到任何一个问题上。您认为spacespaceite有一天会隐式支持空间索引吗?

我的理解是,该问题是SQLite体系结构中固有的。当然,您可以向SpatiaLite Google论坛发布更多问题。 groups.google.com/forum/?fromgroups#!forum/spatialite-users
DavidF 2012年

请注意,最新版本的Spatialite实现了虚拟空间索引,并且上述语法不再起作用。WHERE子句将被重写为WHERE map2.ROWID(从SpatialIndex的SELECT ROWID WHERE f_table_name ='map1'AND search_frame = map1.geometry)
rudivonstaden 2014年

4

在埃里克·韦斯特拉(Eric Westra)的书“ Python地理空间开发”第188页中,显示了对于CONTAINS操作,如果遵循所涉及的空间索引过程,至少Spatialite的运行速度可能比MySQL和PostGIS快,这也许令人惊讶。


这并不“令人惊讶”,因为简单查询在SQLite中的运行速度比MySQL InnoDB引擎快2到3倍。
米歇尔·莱昂

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.