使用空间索引在空间中获取最近的几何

时间:2011-10-14 22:54:26

标签: geometry spatial spatialite

我想使用空间SQL查询获取Spatialite中给定点的最近特征。我想用索引表加快速度。应根据定义的点和给定的容差计算空间索引边界,在查询中应使用全部/部分在rtree边界框内的所有要素。

我尝试了几种方法,但我总是空间索引边界问题

像这样:

SELECT *,Distance(GeomFromText('POINT(19.02658 47.51574)'),mo_utak_polyline.Geometry)as distance from mo_utak_polyline WHERE ROWID IN(SELECT pkid FROM idx_mo_utak_polyline_Geometry WHERE xmin&gt; 19.01408 AND xmax&lt; 19.03908 AND ymin&gt; 47.50324 AND ymax <47.52824)和距离&lt; = 0.0025)按距离排序

或者这个:

SELECT *,Intersects(GeomFromText('POINT(19.02658 47.51574)'),megyehatar_region.Geometry)与FROM megyehatar_region WHERE ROWID IN相交(SELECT pkid FROM idx_megyehatar_region_Geometry WHERE xmin&gt; 14.02658 AND xmax&lt; 24.02658 AND ymin&gt; 42.51574 AND ymax <52.51574)AND intersects = 1

我总能获得完全由我的索引定义的边界框包含的功能。这对我来说是一个很大的问题,例如:当我尝试查询线条特征时,当它们的长度完全不同时,它可以是1厘米甚至1000公里,因此很难设置空间索引边界框的大小

您认为哪种方法最好?

如何更改查询的这一部分

SELECT pkid FROM idx_mo_utak_polyline_Geometry WHERE xmin&gt; 19.01408 AND xmax&lt; 19.03908 AND ymin&gt; 47.50324 AND ymax&lt; 47.52824)

不仅要返回边界框包含的特征,还要返回与它相交的特征?

提前致谢!

4 个答案:

答案 0 :(得分:0)

以下内容如何:

SELECT count(*) FROM idx_mo_utak_polyline_Geometry WHERE 
MBRContains(BuildMBR('19.01408','47.50324' , '19.03908', '47.52824'), BuildMBR(xmin,ymin , xmax, ymax)) OR
MBRIntersects(BuildMBR('19.01408','47.50324' , '19.03908', '47.52824'), BuildMBR(xmin,ymin , xmax, ymax)) 

答案 1 :(得分:0)

首先进行索引查询,而不是 相交 ,更好的是 距离== 0 来自索引查询的几何:

你的点坐标 - X,Y

    SELECT * FROM table 
        WHERE pk_uid IN (SELECT pkid FROM idx_table_geometry 
                         WHERE xmin < X AND ymin < Y AND xmax > X AND ymax > Y) 
              AND distance( makepoint(X,Y), geometry ) == 0

答案 2 :(得分:0)

这个线程有点旧(与此同时,空间索引的处理似乎在空间方面有所改变),但这就是我刚刚在我的项目中提出的(2015年)。该查询应该从点层中获取每个点,并从线图层中找到最近的线。

我不确定这段代码的结构是否合理以及它对大型数据集的计算速度有多快(我的测试集很小)。

我非常有兴趣获得反馈,如果你看到这个查询有所改进(我的sql非常生疏 - 已经有一段时间......)

initOptionDefaults

答案 3 :(得分:0)

在SpatiaLite 4.4或更高版本中,现在有一个非常好的KNN(K-Nearest Neighbors)索引。我最近写了一个查询,大约500个点中的每个点查找来自500万行记录的最近的线串。使用KaeptnHaddock提到的较新的VirtualSpatialIndex方法,查询运行了大约3分钟。使用新的KNN索引,查询耗时不到20秒。这是我的KNN查询:

select k.* from knn k, points p
WHERE f_table_name = 'linestrings' 
AND ref_geometry = p.geometry
AND max_items = 1;