Расчет расстояния от одного слоя до другого
Расчет расстояния от одного слоя до другого
Здравствуйте! Подскажите пожалуйста, есть ли такая возможность рассчитать расстояния массово от одного слоя до другого? Есть два графических слоя tab, один содержит точечный объект, другой имеет 20 полигонов. Можно ли от центра этих полигонов рассчитать расстояние до точечного объекта и результат получить в табличной форме?
Re: Расчет расстояния от одного слоя до другого
Добрый день.
Есть Калькулятор расстояний viewtopic.php?f=5&t=4361 , но расстояния рассчитывается как кротчайшее расстояние между объектами ( не от центроидов )
Есть Калькулятор расстояний viewtopic.php?f=5&t=4361 , но расстояния рассчитывается как кротчайшее расстояние между объектами ( не от центроидов )
Re: Расчет расстояния от одного слоя до другого
Это можно сделать с помощью SQL-запроса.
- futurengineer
- Пользователь
- Сообщения: 7
- Зарегистрирован: 06 мар 2025, 14:00
Re: Расчет расстояния от одного слоя до другого
Добрый день!
Не могли бы Вы подсказать, как правильно составить запрос при немного других условиях.
Есть два слоя (первый (a) - точки+полигоны, второй (b)- точки).
Нужно найти ближайший к центроиду объекта из а объект из b и записать значение поля b.name в поле a.name_from_b
То есть записать название ближайшего объекта из другого слоя. Расстояние не нужно.
Заранее благодарен!
Re: Расчет расстояния от одного слоя до другого
Сформулирую задачу формально:
Для каждого объекта (полигона/точки) в таблице a найти ближайший объект из таблицы b (по расстоянию между центроидами) и записать значение поля name из таблицы b в поле name_from_b таблицы a.
Предполагаю, что таблица a содержит уникальную колонку id
1. Создание запроса distances
На этом шаге мы создаем промежуточную таблицу, в которой для каждого объекта из таблицы a вычислено минимальное расстояние до любой точки из таблицы b.
В редакторе SQL-запроса заполните поля следующим образом:
- Выбрать колонки:
- С условием: 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.
Для каждого объекта (полигона/точки) в таблице a найти ближайший объект из таблицы b (по расстоянию между центроидами) и записать значение поля name из таблицы b в поле name_from_b таблицы a.
Предполагаю, что таблица a содержит уникальную колонку id
1. Создание запроса distances
На этом шаге мы создаем промежуточную таблицу, в которой для каждого объекта из таблицы a вычислено минимальное расстояние до любой точки из таблицы b.
В редакторе SQL-запроса заполните поля следующим образом:
- Выбрать колонки:
- Из таблицы: a, ba.ID as id_a,
Min(CentroidDistance(a.obj, b.obj, 'm')) as distance,
a.obj
- С условием: 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.
