我今天开始与SpatiaLite玩,已经偶然发现了一个问题。
对于tableOne中存储的每个点位置,我想从tableTwo中选择一个最近的(线性距离)点。
到目前为止,我想出了一个使用VIEW的笨拙解决方案:
CREATE VIEW testview AS
SELECT
A.id ,
B.myValue,
Distance(A.Geometry, B.Geometry) AS distance
FROM tableOne AS A, tableTwo AS B
WHERE distance < 10000
ORDER BY A.Id, distance;
然后:
SELECT * FROM testview
WHERE distance = (SELECT MIN(distance) FROM testview AS t WHERE t.id = testview.id)
似乎能胜任。
两个问题:
有没有一种方法可以执行这种查询而无需创建VIEW?
还有其他方法可以优化此查询以获得更好的性能吗?在现实世界中,tableOne将具有成百上千的记录,而tableTwo将具有130万。
我可以为您提供一种速度快几个数量级的方法,但是它需要您使用postgresql 9的knngist索引而不是
—
spacespaceite
实际上比GRASS,ArcGIS,QGIS,SQLServer和几乎任何其他空间db / Desktop GIS都快(尽管还没有尝试使用Oracle最近邻功能)。请让我知道是否可以选择。
—
Ragi Yaser Burhum 2011年
@Ragi:我知道PostGIS将是解决此类问题的更有效方法。但是,此练习的最终目标是制作小型便携式应用程序,在这种情况下,SpatiaLite是赢家。
—
radek 2011年
您的便携式应用程序的开发平台是什么?
—
艾伦·阿黛尔
@Allan:同时在这两个平台上工作:Windows Server 2008和Ubuntu。
—
radek 2011年