大型数据库表上的最近邻搜索 - SQL和/或ArcGis

时间:2011-09-14 10:58:30

标签: sql ms-access geospatial arcgis

很抱歉发布可能很明显的内容,但我没有太多的数据库经验。任何帮助将不胜感激 - 但请记住,我是一个初学者: - )

我有一张这样的桌子:
Table.fruit
ID类型Xcoordinate Ycoordinate Taste Fruitiness
1 Apple 3 3好1,5
2橙色5 4坏2,9
3 Apple 7 77 Medium 1,4
4香蕉4 69坏9,5
5梨9 15中0,1
6 Apple 3 38好-5,8
7 Apple 1 4好3
8香蕉15 99坏6,8
9梨298 18789中10,01
...... ...... ...... 1000 Apple 1344 1388 Bad 5
...... ...... ...... 1958香蕉759 1239好1 1959年香蕉3 4中等5,2

我需要: 给我一张表

n(例如:n = 5)最接近原始表中的EACH点,包括距离 表5最近(请注意距离是假的)。因此,结果表具有ID1,ID2和ID1与ID2之间的距离(不幸的是,还不能发布图像)。

ID.Fruit1 ID.Fruit2距离 1 1959 1 1 7 2 1 2 2 1 5 30 1 14 50 2 1959 1 2 1 2 ...... ...... 1000 1958 400 1000 Xxx Xxx ...... ......

我该怎么做(理想情况下使用SQL /数据库管理)或ArcGis或类似的?有任何想法吗? 不幸的是,我的表包含15000个数据集,因此如果我选择n = 5,结果表将有75000个数据集。 任何建议都非常感激。

编辑:

非常感谢您对目前的意见和建议。让我稍微扩展一下: 第一个提出的方法是整个表格的强力扫描,渲染巨大的文件大小,或者,可能是崩溃,正确吗? 现在,水果只是一个虚拟,真正的表包含一个修复ID,名义属性(“水果类型”等),X和Y空间列(在Gauss-Krueger中)和一些数字属性。 现在,我想有一种方法可以将“边界框”编码到此中,因此距离计算是针对我的问题点(假设为1)和具有一定边长的正方形内的每个其他点进行的。我可以想象(远程)编码或查询,但我如何让我的ID列中的每一点都有脚本执行此操作。我理解它的方式,这应该为我的“Table.Fruit”中的每个记录/点创建一个“子表”,其中包含记录/点周围的正方形内的所有点,并添加一个距离字段 - 或者,一个大的新表( “Table.5nearest”)。我希望这有点道理。有任何想法吗?再次谢谢

2 个答案:

答案 0 :(得分:1)

为了获得所有水果之间的所有距离是相当简单的。在Access SQL中(尽管您可能需要在任何地方添加括号以使其工作:P):

select   fruit1.id,
         fruit2.id,
         sqr(((fruit2.xcoordinate - fruit1.xcoordinate)^2) + ((fruit2.ycoordinate - fruit1.ycoordinate)^2)) as distance
from     fruit as fruit1
join     fruit as fruit2
on       fruit2.id <> fruit1.id
order by distance;

我不知道Access是否具有必要的复杂性来限制每个水果的“前n”记录;因此,在您的记录集上,此查询将返回2.25亿条记录(或者更有可能在尝试时崩溃)!

答案 1 :(得分:1)

感谢您对目前的评论;与此同时,我选择了一个预制解决方案,一个名为Hawth's Tools的ArcGis加载项。这对于找到具有x和y值的任何点要素的n个最近邻居来说真的很轻松。所以我希望它可以帮助那些有类似问题和疑问的人。 但是,现在它给我留下了更多与数据库相关的问题。你知道我如何获得任何DBMS(最好是Access),给我一个包含所有组合的列表吗?也就是说,如果我有一个在空间排列15000个水果的点特征,我如何获得所有“纯香蕉邻域”(苹果,柠檬等)和所有其他组合? 干杯和祝福。