Расстояние между точкой и ближайшим ПОСТРОЕНИЕМ

#sql-server #indexing #gis #distance

#sql-сервер #индексирование #ГИС #расстояние

Вопрос:

Есть две таблицы MSSQL, которые содержат пространственные данные:
— Адресные точки — содержит геолокацию адресов (ТОЧЕЧНАЯ структура)
— Конвейер — содержит геолокацию конвейера (структура LINESTRING)

Таблица адресных точек должна содержать расстояние от ближайшего сегмента конвейера. В настоящее время я пытаюсь написать эффективный запрос. В итоге я получил следующий запрос:

 select a.ogr_fid, min(a.geom.STDistance(p.geom))
from AddressPoints a, Pipeline p
group by a.ogr_fid
  

Однако адресные точки и таблицы конвейера содержат огромное количество данных, которые влияют на скорость выполнения.
Обе таблицы содержат пространственные индексы, но я не уверен, использует ли их этот запрос.

Комментарии:

1. MIN предполагает, что вы ищете расстояние до ближайшего соседа, а не все расстояния. В этой статье MSDN объясняется, как написать запрос ближайшего соседа, который использует пространственные индексы. Требования довольно строгие

Ответ №1:

Я думаю, что я нашел приемлемое решение:

 select a.ogr_fid, min(a.geom.STDistance(p.geom))
from AddressPoint a
inner join Pipeline p on a.geom.STDistance(p.geom) < 200
group by a.ogr_fid
order by a.ogr_fid
  

Этот запрос выполняет ту же работу, что и запрос из вопроса. Однако он выполняется за 1 секунду. Время выполнения первого запроса составляет 47 секунд.