小编mor*_*t32的帖子

Spatialite:使用虚拟空间索引来计算距离

我目前正在学习使用空间访问方法进行查询优化。我正在阅读空间食谱中的示例并被困在这里 http://www.gaia-gis.it/gaia-sins/spatialite-cookbook/html/pp-adjacent.html

根据教程,为了找到距离小于 1 公里的人口对,我们必须执行此查询

    SELECT pp1.name AS "PopulatedPlace #1",
      GeodesicLength(MakeLine(pp1.geometry, pp2.geometry)) AS "Distance (meters)",
      pp2.name AS "PopulatedPlace #2"
    FROM populated_places AS pp1,
    populated_places AS pp2
    WHERE GeodesicLength(
      MakeLine(pp1.geometry, pp2.geometry)) < 1000.0
      AND pp1.id <> pp2.id
    AND pp2.ROWID IN (
      SELECT pkid
      FROM idx_populated_places_geometry
      WHERE pkid MATCH RTreeDistWithin(
       ST_X(pp1.geometry),
       ST_Y(pp1.geometry), 0.02))
    ORDER BY 2;
Run Code Online (Sandbox Code Playgroud)

由于不再使用地理回调函数 RTree*** 而引发错误。我检查了这个更新,这已被虚拟空间索引的使用所取代。我们必须使用表单的子查询

    SELECT ROWID
    FROM SpatialIndex
    WHERE
       f_table_name = <table_name>
       AND search_frame = <some_geometry>
Run Code Online (Sandbox Code Playgroud)

所以我测试了这个

    SELECT pp1.name AS "PopulatedPlace #1",
      GeodesicLength(MakeLine(pp1.geometry, pp2.geometry)) AS "Distance (meters)", …
Run Code Online (Sandbox Code Playgroud)

sqlite subquery spatial

5
推荐指数
1
解决办法
354
查看次数

标签 统计

spatial ×1

sqlite ×1

subquery ×1