Geometry 使用空间索引获取空间中最近的几何体
我想使用SpatialSQL查询获得Spatialite中距离给定点最近的特征。我想使用索引表来加速它。空间索引边界应从定义点和给定公差开始计算,查询中应使用全部/部分位于rtree边界框内的所有特征 我尝试过几种方法,但我总是遇到空间索引边界的问题 像这样: 选择*,距离GeomfromText'POINT19.02658 47.51574',mo____________________________________________________________________________________ 我总是可以得到完全包含在索引定义的边界框中的特征。这给我带来了一个巨大的问题,例如,当我试图查询线条特征时,当它们的长度完全不同时,可能是1厘米甚至1000公里,因此很难设置空间索引边界框的大小 你认为哪种方法最好 如何更改查询的这一部分 从idx_mo_utak_polyline_几何图形中选择pkid,其中xmin>19.01408,xmax<19.03908,ymin>47.50324,ymax<47.52824 不仅要返回边界框包含的特征,还要返回与边界框相交的特征Geometry 使用空间索引获取空间中最近的几何体,geometry,spatial,spatialite,Geometry,Spatial,Spatialite,我想使用SpatialSQL查询获得Spatialite中距离给定点最近的特征。我想使用索引表来加速它。空间索引边界应从定义点和给定公差开始计算,查询中应使用全部/部分位于rtree边界框内的所有特征 我尝试过几种方法,但我总是遇到空间索引边界的问题 像这样: 选择*,距离GeomfromText'POINT19.02658 47.51574',mo__________________________________________________________________________
提前谢谢 以下内容如何:
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))
对索引进行第一次查询,而不是进行相交,更好的是,到索引查询中得到的几何图形的距离==0: 你的点坐标-X,Y
同时,这个线程有点旧,spatialite中对空间索引的处理似乎有点改变,但以下是我在2015年刚刚完成的项目中提出的内容。该查询应该从pointlayer中获取每个点,并从line layer中查找最近的直线 我不确定这段代码的结构有多好,它在一个大数据集上的计算速度有多快。我的测试集很小 我对获得反馈非常感兴趣,如果您看到此查询的改进,我的sql非常生疏–已经有一段时间了
select *
from pointlayer as p
left join linelayer as l on
Distance(p.geometry, l.geometry) in (
select MIN(Distance(p.geometry, geometry))
from linelayer
where pk in (
select rowid
from SpatialIndex
where f_table_name = 'linelayer'
and search_frame = BuildCircleMbr(X(b.geometry), Y(b.geometry),25))
)
在SpatiaLite版本4.4或更高版本中,现在有一个KNN K-最近邻索引运行得非常好。我最近写了一个查询,大约500个点中的每一个都从500万行记录中查找最近的行字符串。使用KaeptnHaddock提到的较新的VirtualPatialIndex方法,查询运行了大约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;
select k.* from knn k, points p
WHERE f_table_name = 'linestrings'
AND ref_geometry = p.geometry
AND max_items = 1;