微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

spatialite之空间索引

首先最好下载spatialite_gui这个工具,不过外国人的网站也奇怪,要下载到exe工具还得在网站上好好找一番。

https://www.gaia-gis.it/fossil/spatialite_gui/index

进入正题

一、空间索引的概念

对于可以用于移动设备,当然也可以用于pc的sqlite扩展,spatialite。

一个比较重要的概念就是空间索引了。

假设我们建好的表是testTable,主键为testTableId,可以增加图形列

SELECT AddGeometryColumn('testTable','GeometryColum',4326,'polyGON','XY')

然后我们可以执行

SELECT CreateSpatialIndex('testTable','GeometryColum')

就建立了空间索引。 关于这种索引的详细说明,可以查看官网

http://www.gaia-gis.it/gaia-sins/index.html

以及

http://www.gaia-gis.it/gaia-sins/spatialite-cookbook/html/rtree.html

当然官网很多术语等。看完了专业术语。至于这个叫做Rtree的索引怎么用。还得自己研究啊。

CreateSpatialIndex语句会创建空间索引表,如果我们用spatialite_gui.exe这个工具就可以打开查询索引表。

索引表的命名规则是idx_Tablename_GeometryColumnName,索引表一般放在Spatial Index类下。

打开查看可以看到如下结构。每个表建的索引都是一样结构。 pkid就是对于数据表的主键值。

就是说这个RTree 索引的核心其实是把每个图形的范围记录在了索引表中。 范围就是后面的4个数字。

二、空间索引的使用

如何使用RTree是一个即简单又复杂的问题。

1、例子

最简单的使用如下:

select * from testTable where ST_Within( MakePoint(106.1,25.6,4326),GeometryColum) and testTableId

in (selectpkid from idx_testTable_GeometryColum where xmin>106.1-0.003 andymin>25.6-0.003 and xmax<106.1+0.003 and ymax <25.6+0.003)

2、解释

使用以上sql语句查询testTable就是一种最基本的对空间索引的使用。

其中:MakePoint是spatialite的函数就是按照x,y,srid(4326是wgs 经纬坐标的id).

testTable是表名

GeometryColum是图形列名

testTableId是测试表主键

pkid是索引表主键,和testTableId对应的

idx_testTable_GeometryColum是索引表名

xmin>106.1-0.003 andymin>25.6-0.003 and xmax<106.1+0.003 and ymax <25.6+0.003, 这个条件构造了一个范围条件,就是以查询点为中心长宽0.006的矩形范围。

以上语句查询的执行过程其实就是现在按照范围数字在索引表查到了范围0.006度内的记录,然后再将符合的记录和查询点(106.1,25.6)进行ST_Within进行空间包含判断。

最终返回包含该点的记录。

3、原理

spatialite是首先执行属性条件过滤然后再进行空间查询的。也就是说即使该testTable表有大量数据,但是我们根据索引表范围限制,永远在指定的范围内查有限的记录。

测试一下可以发现,使用了索引速度一般能提高20至100倍的空间图形查询速度。测试方法也可以不用编程直接使用spatialite_gui.exe这个工具即可。 没有关联idx_testTable_GeometryColum条件就是一般查询

三、更加复杂的设计

以上我们只是指定了一个固定的范围就是0.003*2度,但是实际上这个范围没有什么科学性。

实际使用中怎么办呢。个人认为有两种办法。

1、一种是针对自己数据可以使用的最大索引范围

就是select max(xmax-xmin) from idx_testTable_GeometryColum

select max(ymax-ymin) from idx_testTable_GeometryColum

得到自己用的表的记录中最大范围作为索引查询的范围

2、是针对自己使用的数据的最优范围

确定最优范围的根本问题就是即保障执行效率,又保障数据准确。

简单来说最小的查询范围速度最快,但是范围越小。可能查到的数据被过滤掉很多。有可能查不到或者查不全。

目前来看如果要最优的使用索引,第一要分析数据,第二还要结合编程实现。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


SQLite架构简单,又有Json计算能力,有时会承担Json文件/RESTful的计算功能,但SQLite不能直接解析Json文件/RESTful,需要用Java代码硬写,或借助第三方类库,最后再拼成insert语句插入数据表,代码非常繁琐,这里就不展示了。参考前面的代码可知,入库的过程比较麻烦,不能只用SQL,还要借助Java或命令行。SPL是现代的数据计算语言,属于简化的面向对象的语言风格,有对象的概念,可以用点号访问属性并进行多步骤计算,但没有继承重载这些内容,不算彻底的面向对象语言。...
使用Python操作内置数据库SQLite以及MySQL数据库。
破解微信数据库密码,用python导出微信聊天记录
(Unity)SQLite 是一个软件库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是在世界上最广泛部署的 SQL 数据库引擎。SQLite 源代码不受版权限制。本教程将告诉您如何使用 SQLite 编程,并让你迅速上手。.................................
安卓开发,利用SQLite实现登陆注册功能
相比大多数数据库而言,具有等优势,广泛应用于、等领域。
有时候,一个项目只有一个数据库,比如只有SQLite,或者MySQL数据库,那么我们只需要使用一个固定的数据库即可。但是一个项目如果写好了,有多个用户使用,但是多个用户使用不同的数据库,这个时候,我们就需要把软件设计成可以连接多个数据库的模式,用什么数据库,就配置什么数据库即可。4.Users实体类,这个实体类要和数据库一样的,形成一一对应的关系。11.Sqlite数据库,需要在代码里面创建数据库,建立表,再建立数据。8.我们开启MySQL数据库,然后进行调试,看程序的结果。2.安装SqlSugar。
基于Android的背单词软件,功能强大完整。
SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统。说白了就是使用起来轻便简单,