Сформулирую задачу формально:
Для каждого объекта (полигона/точки) в таблице
a найти ближайший объект из таблицы
b (по расстоянию между центроидами) и записать значение поля
name из таблицы
b в поле
name_from_b таблицы
a.
Предполагаю, что таблица
a содержит уникальную колонку
id
1. Создание запроса
distances
На этом шаге мы создаем промежуточную таблицу, в которой для каждого объекта из таблицы
a вычислено минимальное расстояние до любой точки из таблицы
b.
В редакторе SQL-запроса заполните поля следующим образом:
- Выбрать колонки:
a.ID as id_a,
Min(CentroidDistance(a.obj, b.obj, 'm')) as distance,
a.obj
- Из таблицы: a, b
- С условием: 1=1
- Группировать по: a.ID
Группировка по a.ID означает, что для каждого уникального ID из таблицы
a будет создана одна строка результата. Функция Min() применится внутри каждой группы, то есть найдет минимальное расстояние среди всех точек
b для данного объекта
a.
- Создать запрос: distances
2. Создание запроса
names
Теперь, когда у нас есть таблица
distances с минимальными расстояниями, нужно найти конкретную точку из
b, которая находится на этом минимальном расстоянии, и взять её имя.
В редакторе SQL-запроса заполните поля:
- Выбрать колонки: distinct distances.id_a, b.name
Ключевое слово distinct удаляет дубликаты строк. Это нужно на случай, если две или более точек из
b находятся на одинаковом минимальном расстоянии от объекта
a (редкая ситуация, но возможная). Без distinct в результате могут быть повторяющиеся id_a. Аналогичного результата можно было бы достигнуть сгруппировав результат по id_a
- Из таблицы: distances, b
- С условием: CentroidDistance(distances.obj, b.obj, 'm') = distances.distance
Это условие выполняет "обратный поиск". Мы берем минимальное расстояние, которое уже вычислено в таблице distances, и находим в таблице
b тот объект, расстояние до которого в точности равно этому минимальному значению. Это и есть ближайший объект.
- Создать запрос: names
3. Обновить колонку
Вызовите Таблица - Обновить колонку
- Обновить таблицу: a
- Обновить колонку: name_from_b
- Значения извлечь из: names
- Вычислить: Значение
- для: name
Нажмите "Объединить" и в диалоге настройте параметры:
Совместить по:
- колонке: ID из таблицы a
- и колонке: id_a из таблицы names
После выполнения всех шагов таблица
a будет содержать в поле
name_from_b имена ближайших объектов из таблицы
b.