【问题标题】:Get nearest geometry in spatiality using spatial index使用空间索引获取最近的空间几何
【发布时间】:2011-12-08 03:11:08
【问题描述】:

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

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

像这样:

SELECT *, Distance(GeomFromText('POINT(19.02658 47.51574)'),mo_utak_polyline.Geometry) 作为距离 mo_utak_polyline WHERE ROWID IN (SELECT pkid FROM idx_mo_utak_polyline_Geometry WHERE xmin > 19.01408 AND xmax 47。 47.52824) AND 距离

或者这个:

SELECT *,Intersects(GeomFromText('POINT(19.02658 47.51574)'), megyehatar_region.Geometry) as intersects FROM megyehatar_region WHERE ROWID IN (SELECT pkid FROM idx_megyehatar_region_Geometry WHERE xmin > 14.02658 AND xmax

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

你认为最好的方法是什么?

如何更改这部分查询

从 idx_mo_utak_polyline_Geometry 中选择 pkid,其中 xmin > 19.01408 AND xmax 47.50324 AND ymax

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

提前致谢!

【问题讨论】:

    标签: geometry spatial spatialite


    【解决方案1】:

    以下内容如何:

    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)) 
    

    【讨论】:

      【解决方案2】:

      对索引进行第一次查询,比你可以做的intersects,甚至更好,distance == 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
      

      【讨论】:

        【解决方案3】:

        这个线程有点老了(与此同时,空间索引的处理似乎在 spatialite 中发生了一些变化),但这是我刚刚在我的项目中提出的(2015 年)。查询应该从点层中获取每个点,并从线层中找到最近的线。

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

        如果您看到此查询的改进,我非常有兴趣获得反馈(我的 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))
        )
        

        【讨论】:

          【解决方案4】:

          在 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;
          

          【讨论】:

            猜你喜欢
            • 2012-08-10
            • 2011-08-26
            • 2012-04-25
            • 1970-01-01
            • 2021-08-03
            • 2019-07-18
            • 2016-05-07
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多