Поиск ближайшего соседа в большой таблице базы данных - SQL и / или ArcGis - PullRequest
1 голос
/ 14 сентября 2011

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

У меня есть такая таблица:
Table.fruit
Тип ID 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 Apple 3 38 Хорошо -5,8
7 яблоко 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) ближайших точек к КАЖДОЙ точке в исходной таблице, включая расстояние Таблица 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 ххх ххх ………

Как я могу это сделать (в идеале с управлением SQL / базой данных) или в ArcGis или аналогичной? Есть идеи? К сожалению, моя таблица содержит 15000 наборов данных, поэтому итоговая таблица будет иметь 75000 наборов данных, если я выберу n = 5. Любые предложения приветствуются.

EDIT:

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

Ответы [ 2 ]

1 голос
/ 04 октября 2011

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

1 голос
/ 14 сентября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...