SDO_INTERSECTION无法正确读取返回

时间:2018-12-12 11:13:28

标签: sql oracle geospatial spatial-query

这是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;

Intersección城市:2001

geomResultado在我执行代码时正确返回SDO_GTYPE,它返回2001,因为carretera1和carretera2之间的交集是一个POINT。但是,我无法使用geomResultado.SDO_POINT.X返回此类POINT的X坐标。有任何想法吗?我认为我的代码还可以。

编辑:此外,当我尝试使用此代码尝试查找没有真正相交的两条线的交点时,查询结果为空,因此问题出在SDO_POINT 100%中。

2 个答案:

答案 0 :(得分:1)

Oracle有两种存储点几何的方法

第一个位于sdo_geometry的sdo_point部分。

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;

答案 1 :(得分:0)

正如Rene所建议的那样,解决此问题的方法只是使用以下方法来查询坐标:

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

用于X和Y坐标。