Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Geometry 使用空间索引获取空间中最近的几何体_Geometry_Spatial_Spatialite - Fatal编程技术网

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

Geometry 使用空间索引获取空间中最近的几何体,geometry,spatial,spatialite,Geometry,Spatial,Spatialite,我想使用SpatialSQL查询获得Spatialite中距离给定点最近的特征。我想使用索引表来加速它。空间索引边界应从定义点和给定公差开始计算,查询中应使用全部/部分位于rtree边界框内的所有特征 我尝试过几种方法,但我总是遇到空间索引边界的问题 像这样: 选择*,距离GeomfromText'POINT19.02658 47.51574',mo__________________________________________________________________________

我想使用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

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


提前谢谢

以下内容如何:

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;