SDO_INTERSECTION не может прочитать возврат правильно - PullRequest
0 голосов
/ 12 декабря 2018

Итак, это документация SDO_INTERSECTION: https://docs.oracle.com/cd/B28359_01/appdev.111/b28400/sdo_objgeom.htm#SPATL1118

А это мой код:

PROCEDURE ciudadInterseccionCarretera (carretera1 IN VARCHAR2,carretera2 IN 
VARCHAR2) IS
tupla Extremadura%ROWTYPE;
geomResultado SDO_GEOMETRY;
BEGIN

        SELECT SDO_GEOM.SDO_INTERSECTION(ex1.Geom,ex2.Geom,0.05) INTO geomResultado
        FROM Extremadura ex1, Extremadura ex2
        WHERE ex1.Nombre = carretera1 AND ex2.Nombre = carretera2;

        DBMS_OUTPUT.PUT_LINE('ciudad Intersección : '||geomResultado.SDO_GTYPE||' '||geomResultado.SDO_POINT.X);
 END ciudadInterseccionCarretera;

ciudad Intersección: 2001

geomResultado возвращает SDO_GTYPE правильнокогда я выполняю код, он возвращает 2001, поскольку ПЕРЕКЛЮЧЕНИЕ между carretera1 и carretera2 - это ТОЧКА.Однако я не могу вернуть, например, координату X такого POINT, используя geomResultado.SDO_POINT.X.Есть идеи?Я думаю, что мой код в порядке ..

РЕДАКТИРОВАТЬ: Кроме того, когда я пытаюсь использовать этот код, пытаясь найти пересечение двух линий, которые на самом деле не пересекаются, результат запроса будет пустым, поэтомупроблема в SDO_POINT 100%.

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Как предположил Рене, решение этой проблемы состояло в том, чтобы просто запросить координаты, используя:

geomResultado.SDO_ORDINATES(1);
geomResultado.SDO_ORDINATES(2);

Для координат X и Y.

0 голосов
/ 12 декабря 2018

У Oracle есть два способа хранения точечной геометрии

Первый находится в части sdo_point sdo_geometry.

sdo_geometry (2001, null, sdo_point (x, y, null), null, null)

Другой является ординатой в массиве ординат:

sdo_geometry (2001, null, null, sdo_elem_info_array (1,1,1), sdo_ordinate_array (x, y))

В этом случае sdo_intersection возвращает геометрию с координатами в массиве ординат.Вы должны получить значения оттуда.

Пример:

declare
   l_geo1 sdo_geometry := sdo_geometry(2001
                                      ,null
                                      ,null
                                      ,sdo_elem_info_array(1, 2, 1)
                                      ,sdo_ordinate_array(0, 0, 10, 10));
   l_geo2 sdo_geometry := sdo_geometry(2001
                                      ,null
                                      ,null
                                      ,sdo_elem_info_array(1, 2, 1)
                                      ,sdo_ordinate_array(0, 10, 10, 0));

   l_geo3 sdo_geometry;

   l_x number;
   l_y number;
begin

   l_geo3 := sdo_geom.sdo_intersection(l_geo1, l_geo2, 0.05);

   l_x := l_geo3.sdo_ordinates(1);
   l_y := l_geo3.sdo_ordinates(2);

   dbms_output.put_line(l_x || ' ' || l_y);
end;
...