SDO_INTERSECTION 无法正确阅读 return
SDO_INTERSECTION unable to read return properly
所以这是 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;
城市交叉点 : 2001
geomResultado 在我执行代码时 returning SDO_GTYPE 正确,它 returns 2001 因为 carretera1 和 carretera2 之间的交点是一个点。但是我无法 return,例如使用 geomResultado.SDO_POINT.X 的此类 POINT 的 X 坐标。有任何想法吗?我觉得我的代码没问题..
编辑:此外,当我尝试使用此代码试图找到两条线的交点时,实际上并不相交,查询结果为空,所以问题出在 SDO_POINT 100 %.
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 returns 坐标在纵坐标数组中的几何体。您必须从那里获取值。
示例:
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;
正如 Rene 所建议的,这个问题的解决方案只是使用以下方法请求坐标:
geomResultado.SDO_ORDINATES(1);
geomResultado.SDO_ORDINATES(2);
对于 X 和 Y 坐标。
所以这是 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;
城市交叉点 : 2001
geomResultado 在我执行代码时 returning SDO_GTYPE 正确,它 returns 2001 因为 carretera1 和 carretera2 之间的交点是一个点。但是我无法 return,例如使用 geomResultado.SDO_POINT.X 的此类 POINT 的 X 坐标。有任何想法吗?我觉得我的代码没问题..
编辑:此外,当我尝试使用此代码试图找到两条线的交点时,实际上并不相交,查询结果为空,所以问题出在 SDO_POINT 100 %.
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 returns 坐标在纵坐标数组中的几何体。您必须从那里获取值。
示例:
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;
正如 Rene 所建议的,这个问题的解决方案只是使用以下方法请求坐标:
geomResultado.SDO_ORDINATES(1);
geomResultado.SDO_ORDINATES(2);
对于 X 和 Y 坐标。