создать многоугольник с отверстием как Oracle SDO_GEOMETRY из двух геометрий круга

В примере, приведенном в Oracle Docs, есть способ создать многоугольник с отверстием со следующим синтаксисом:

SDO_GEOMETRY(
    2003,  -- two-dimensional polygon
    NULL,
    NULL,
    SDO_ELEM_INFO_ARRAY(1,1003,1, 19,2003,1), -- polygon with hole
    SDO_ORDINATE_ARRAY(2,4, 4,3, 10,3, 13,5, 13,9, 11,13, 5,13, 2,11, 2,4,
        7,5, 7,10, 10,10, 10,5, 7,5)
  )

В моем случае у меня есть два SDO_GEOMETRY, созданные следующим образом:

SELECT sdo_util.circle_polygon (longitude_1,
                                latitude_1,
                                r_1,                                         
                                tol)
           INTO inner_circle_geom
           FROM DUAL;


SELECT sdo_util.circle_polygon (longitude_2,
                                latitude_2,
                                r_2,                                         
                                tol)
           INTO outer_circle_geom
           FROM DUAL;

Как я могу создать многоугольник с отверстием, используя две указанные выше геометрии?

я пытался использовать

...
SDO_ORDINATE_ARRAY(outer_circle_geom.sdo_ordinates, inner_circle_geom.sdo_ordinates)

Но я получаю ошибку

PLS-00306: wrong number or types of arguments in call to 'SDO_ORDINATE_ARRAY'

РЕДАКТИРОВАТЬ: версия Oracle 10g


person FrancescoDS    schedule 20.11.2020    source источник
comment
Пробовали ли вы SDO_GEOM.SDO_XOR или SDO_GEOM.SDO_DIFFERENCE?   -  person MT0    schedule 20.11.2020
comment
@MT0 Вы имеете в виду, что предлагаете использовать SDO_XOR или SDO_DIFFERENCE с кругами в качестве параметров вместо создания геометрии, указанной выше (многоугольник с отверстием)?   -  person FrancescoDS    schedule 20.11.2020
comment
Это была моя мысль. Я не использую пространственный Oracle, поэтому я не совсем знаю, как его реализовать. Я начал с этой db‹›fiddle, но где-то что-то не так, и я не узнайте, является ли это генерацией форм или чем-то, что я неправильно настроил в системе координат, или это просто неправильный подход.   -  person MT0    schedule 20.11.2020


Ответы (2)


Мысль MT0 верна. Вы можете использовать select sdo_geom.sdo_difference(
sdo_util.circle_polygon (longitude_2, latitude_2,r_2, tol),
sdo_util.circle_polygon (longitude_1, latitude_1,r_1, tol), tol)
from dual;

person GregStef    schedule 20.11.2020

Вы можете определить его вручную, используя информацию об элементе:

  • с SDO_ETYPE из 1003 и SDO_INTERPRETATION из 4, чтобы определить внешний круг, используя три точки на окружности; и
  • с SDO_ETYPE из 2003 и SDO_INTERPRETATION из 4, чтобы определить внутренний круг, используя три точки на окружности.

Например, если вам нужны две концентрические окружности с центром в точке 0,0 с внешним радиусом 10 и внутренним радиусом 5, тогда:

SDO_GEOMETRY(
  2003, -- In the format D0XX where D is the number of dimensions and
        -- an XX value of 03 is a polygon (with or without holes)
  NULL,
  NULL,
  SDO_ELEM_INFO_ARRAY(
     1,    -- offset for the first ordinate of this element
     1003, -- this element is an exterior polygon ring 
     4,    -- which is a circle defined by 3 points on the circumference
     
     7,    -- offset for the first ordinate of this element
     2003, -- this element is an interior polygon ring
     4     -- which is a circle defined by 3 points on the circumference
  ),
  SDO_ORDINATE_ARRAY(
    10.00,   0.00, -- first point on exterior circle
     0.00,  10.00, -- second point on exterior circle
   -10.00,   0.00, -- third point on exterior circle

     5.00,   0.00, -- first point on interior circle
     0.00,  -5.00, -- second point on interior circle
    -5.00,   0.00  -- third point on interior circle
  )
);

db‹›fiddle здесь

person MT0    schedule 26.11.2020
comment
это не решает проблему. здесь вы дали SDO_ORDINATE_ARRAY() с заданными точками, но я хочу создать SDO_ORDINATE_ARRAY из двух элементов SDO_GEOMETRY - person FrancescoDS; 02.12.2020