Oracle Spatial (Locator) - Найти полигоны на расстоянии / радиусе

Я пытаюсь реализовать функцию, которая возвращает все записи моей таблицы, которые содержат многоугольники (которые описывают области) в пределах определенного радиуса (расстояния). Я нашел функцию SDO_GEOM.SDO_WITHIN_DISTANCE и прочитайте этот пост.

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

2 ответа

Прежде всего, вам нужно использовать оператор SDO_WITHIN_DISTANCE, а не функцию SDO_GEOM.WITHIN_DISTANCE. Первый выполнит поиск, используя пространственный индекс в таблице полигонов. Второго не будет (и так будет очень медленно).

Тогда SDO_WITHIN_DISTANCE может или не может быть тем, что вам нужно, в зависимости от того, как вы определяете "в радиусе". Если под этим вы подразумеваете, что ближайшая граница многоугольника должна быть в радиусе, то SDO_WITHIN_DISTANCE - это то, что вам нужно.

Предположим, у вас есть таблица AREAS (ID, GEOMETRY) и таблица LOCATIONS (ID, GEOMETRY), и вы хотите найти все области в пределах 10 км от точки 42:

select a.id
from areas a, locations l
where l.id=42
and sdo_within_distance (a.geometry, l.geometry, 'distance=10 unit=km') = 'TRUE';

С другой стороны, если вы хотите найти полигоны, которые полностью содержатся в радиусе, то вам нужно построить буфер размером 10 км и использовать его в качестве области поиска для поиска подходящих полигонов:

select a.id
from areas a, locations l
where l.id=42
and sdo_inside (
  a.geometry,
  sdo_geom.sdo_buffer ( 
    l.geometry,
    10,
    0.05,
    'unit=km'
  ) 
) = 'TRUE';

Можно использовать SDO_GEOM.SDO_WITHIN_DISTANCE в WHERE предложение делать то, что вы хотите - то есть ограничить строки на основе их расстояния от исходной фигуры.

Другие вопросы по тегам