Синтаксис для простого перекрытия полигонов в Oracle Spatial

У меня есть ситуация, когда мне нужно проверить, занимают ли какие-либо полигоны из таблицы какое-либо место в том же пространстве, что и данный многоугольник в пространстве оракула. В настоящее время я использую SQL, как показано ниже:

SELECT * FROM MY_TABLE WHERE SDO_RELATE(MY_TABLE.GEOM, ?, 'mask=OVERLAPBDYINTERSECT+EQUAL+INSIDE+COVEREDBY+CONTAINS+COVERS') = 'TRUE'

Во многих случаях это происходит довольно медленно, и в документации Oracle они рекомендуют разбивать его по производительности ( http://docs.oracle.com/cd/B19306_01/appdev.102/b14255/sdo_operat.htm), делая это даже дольше (Лично я бы жил с падением производительности, потому что синтаксис безумен):

SELECT * FROM MY_TABLE WHERE SDO_RELATE(MY_TABLE.GEOM, ?, 'mask=OVERLAPBDYINTERSECT') = 'TRUE'
UNION ALL
SELECT * FROM MY_TABLE WHERE SDO_RELATE(MY_TABLE.GEOM, ?, 'mask=EQUAL') = 'TRUE'
UNION ALL
SELECT * FROM MY_TABLE WHERE SDO_RELATE(MY_TABLE.GEOM, ?, 'mask=INSIDE+COVEREDBY') = 'TRUE'
UNION ALL
SELECT * FROM MY_TABLE WHERE SDO_RELATE(MY_TABLE.GEOM, ?, 'mask=CONTAINS+COVERS') = 'TRUE';

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

Спасибо

0 ответов

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