我目前正在学习使用空间访问方法进行查询优化。我正在阅读空间食谱中的示例并被困在这里 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)