Расчет расстояния от одного слоя до другого

Вопросы связанные с работой ГИС Аксиома
Ответить
Аватара пользователя
Matveev
Пользователь
Сообщения: 21
Зарегистрирован: 19 фев 2024, 06:18

Расчет расстояния от одного слоя до другого

Сообщение Matveev » 23 мар 2026, 09:08

Здравствуйте! Подскажите пожалуйста, есть ли такая возможность рассчитать расстояния массово от одного слоя до другого? Есть два графических слоя tab, один содержит точечный объект, другой имеет 20 полигонов. Можно ли от центра этих полигонов рассчитать расстояние до точечного объекта и результат получить в табличной форме?
Аватара пользователя
gisamap
Пользователь
Сообщения: 579
Зарегистрирован: 18 окт 2019, 11:03

Re: Расчет расстояния от одного слоя до другого

Сообщение gisamap » 23 мар 2026, 09:38

Добрый день.
Есть Калькулятор расстояний viewtopic.php?f=5&t=4361 , но расстояния рассчитывается как кротчайшее расстояние между объектами ( не от центроидов )
Аватара пользователя
Александр
Администратор
Сообщения: 820
Зарегистрирован: 18 апр 2019, 11:21

Re: Расчет расстояния от одного слоя до другого

Сообщение Александр » 23 мар 2026, 13:00

Это можно сделать с помощью SQL-запроса.
sql_1.png
Аватара пользователя
Matveev
Пользователь
Сообщения: 21
Зарегистрирован: 19 фев 2024, 06:18

Re: Расчет расстояния от одного слоя до другого

Сообщение Matveev » 24 мар 2026, 04:49

Спасибо!
Аватара пользователя
futurengineer
Пользователь
Сообщения: 7
Зарегистрирован: 06 мар 2025, 14:00

Re: Расчет расстояния от одного слоя до другого

Сообщение futurengineer » Сегодня, 08:06

Александр писал(а): 23 мар 2026, 13:00 Это можно сделать с помощью SQL-запроса.
sql_1.png
Добрый день!
Не могли бы Вы подсказать, как правильно составить запрос при немного других условиях.
Есть два слоя (первый (a) - точки+полигоны, второй (b)- точки).
Нужно найти ближайший к центроиду объекта из а объект из b и записать значение поля b.name в поле a.name_from_b
То есть записать название ближайшего объекта из другого слоя. Расстояние не нужно.
Заранее благодарен!
Аватара пользователя
Александр
Администратор
Сообщения: 820
Зарегистрирован: 18 апр 2019, 11:21

Re: Расчет расстояния от одного слоя до другого

Сообщение Александр » Сегодня, 16:00

Сформулирую задачу формально:
Для каждого объекта (полигона/точки) в таблице a найти ближайший объект из таблицы b (по расстоянию между центроидами) и записать значение поля name из таблицы b в поле name_from_b таблицы a.

Предполагаю, что таблица a содержит уникальную колонку id

1. Создание запроса distances
На этом шаге мы создаем промежуточную таблицу, в которой для каждого объекта из таблицы a вычислено минимальное расстояние до любой точки из таблицы b.
sql_distances.png
В редакторе 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_names.png
В редакторе 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. Обновить колонку

Вызовите Таблица - Обновить колонку
update_column.png
- Обновить таблицу: a

- Обновить колонку: name_from_b

- Значения извлечь из: names

- Вычислить: Значение

- для: name


Нажмите "Объединить" и в диалоге настройте параметры:
update_column_join.png
Совместить по:
- колонке: ID из таблицы a
- и колонке: id_a из таблицы names

После выполнения всех шагов таблица a будет содержать в поле name_from_b имена ближайших объектов из таблицы b.
Ответить