Поиск ближайших соседей в большой таблице базы данных — SQL и/или ArcGis

Извините за публикацию того, что, вероятно, очевидно, но у меня нет большого опыта работы с базами данных. Будем признательны за любую помощь, но помните, я новичок :-)

У меня есть такая таблица:
Table.fruit
ID type Xcoordinate Ycoordinate Вкус Фруктовость
1 Яблоко 3 3 Хорошо 1,5
2 Апельсин 5 4 Плохо 2,9
3 Яблоко 7 77 Среднее 1,4
4 Банановое 4 69 Плохое 9,5
5 Груша 9 15 Среднее 0,1
6 Яблочное 3 38 Хорошее -5,8
7 Яблочное 1 4 Хорошее 3
8 Банан 15 99 Плохой 6,8
9 Груша 298 18789 Средний 10,01
… … … … … …
1000 Яблоко 1344 1388 Плохой 5
… … … … … …
1958 Банан 759 1239 Хорошее 1
1959 Банан 3 4 Среднее 5,2

Мне нужно: Таблица, которая дает мне

n (например: n=5) ближайших точек к КАЖДОЙ точке в исходной таблице, включая расстояние Table.5ближайшего (обратите внимание, что расстояния являются поддельными). Таким образом, результирующая таблица имеет ID1, ID2 и расстояние между ID1 и ID2 (к сожалению, пока не могу публиковать изображения).

ID.Fruit1 ID.Fruit2 Distance 1 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 или подобном? Любые идеи? К сожалению, моя таблица содержит 15 000 наборов данных, поэтому результирующая таблица будет содержать 75 000 наборов данных, если я выберу n=5. Любые предложения БОЛЬШИМ образом оценены.

РЕДАКТИРОВАТЬ:

Большое спасибо за ваши комментарии и предложения. Позвольте мне немного расширить это: первый предложенный метод — это своего рода сканирование всей таблицы целиком, отображающее огромные файлы или, скорее всего, сбои, верно? Теперь фрукт — это просто муляж, реальная таблица содержит идентификатор исправления, номинальные атрибуты («типы фруктов» и т. д.), пространственные столбцы X и Y (по Гауссу-Крюгеру) и некоторые числовые атрибуты. Теперь, я думаю, есть способ закодировать в этом «ограничивающую рамку», поэтому расчет расстояний выполняется для моей рассматриваемой точки (скажем, 1) и каждой другой точки в квадрате с определенной длиной ребра. Я могу представить (удаленно) кодирование или запрос для этого, но как мне заставить скрипт делать это для КАЖДОЙ точки в моем столбце идентификаторов. Насколько я понимаю, это должно либо создать «подтаблицу» для каждой записи/точки в моем «Table.Fruit», содержащую все точки в квадрате вокруг записи/точки с добавленным полем расстояния, либо одну большую новую таблицу ( "Табл.5ближайший")). Я надеюсь, что это имеет какой-то смысл. Любые идеи? Еще раз спасибо


person TheFaScient    schedule 14.09.2011    source источник
comment
Является ли SQL Sever Express 2008 вариантом для Вы? Если это так, вы можете прочитать blogs.lessthandot.com/index.php/DataMgmt/DataDesign/ или blogs.lessthandot.com/index.php/DataMgmt/DBProgramming/   -  person Fionnuala    schedule 14.09.2011


Ответы (2)


Получить все расстояния между всеми фруктами довольно просто. В 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» записями для каждого фрукта; поэтому этот запрос к вашему набору записей вернет 225 миллионов записей (или, что более вероятно, завершится ошибкой при попытке)!

person Xophmeister    schedule 14.09.2011
comment
Возможно, лучшим решением было бы вернуть все соседние фрукты в пределах определенного диапазона. Доступ должен иметь возможность управлять этим, добавляя sqr(((fruit2.xcoordinate - fruit1.xcoordinate)^2) + ((fruit2.ycoordinate - fruit1.ycoordinate)^2)) < SOME_RANGE к условиям присоединения. - person Xophmeister; 14.09.2011
comment
Я также должен упомянуть - поскольку это меня несколько беспокоит - что вы могли бы лучше нормализовать свои данные. Поле fruit.type должно быть преобразовано в ссылку на таблицу fruit_type; аналогично для поля fruit.taste. - person Xophmeister; 14.09.2011
comment
Я полностью за нормализацию, но последнее, что нужно этому запросу, — это еще одно соединение. Управлять списком фруктов не так сложно, и названия редко меняются. - person JeffO; 14.09.2011
comment
Большое спасибо за ваши ответы, Xophmeister и Джефф О. - person TheFaScient; 15.09.2011

Спасибо за ваши комментарии; тем временем я выбрал готовое решение, надстройку для ArcGis под названием Инструменты Хаута. Это действительно работает как ветерок, чтобы найти n ближайших соседей к любому точечному объекту со значением x и y. Поэтому я надеюсь, что это может помочь кому-то с похожими проблемами и вопросами. Однако теперь у меня остается проблема, связанная с базой данных. У вас есть идея, как я могу получить любую СУБД (желательно Access), чтобы выдать мне список всех моих комбинаций? То есть, если у меня есть точечный объект с 15000 фруктами, расположенными в пространстве, как мне получить все «чистые банановые кварталы» (яблоко, лимон и т. д.) и все остальные комбинации? Привет и наилучшие пожелания.

person TheFaScient    schedule 04.10.2011