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
предложение делать то, что вы хотите - то есть ограничить строки на основе их расстояния от исходной фигуры.