我正在使用Oracle的空间数据库,但我遇到了一些问题。我正在使用几何子程序(如SDO_GEOM.SDO_LENGTH)执行一些过程,这些子程序返回一个数字,但是当我使用其他几何子程序(如SDO_GEOM.CENTROID )时,我不知道如何显示信息,因为这会返回一个SDO_OBJECT。
我是空间Oracle子程序的新手,所以我很感谢您的帮助。
这是我正在研究的代码:
PROCEDURE centroId(pnombre IN VARCHAR2) IS
geomEntrada SDO_GEOMETRY;
dist VARCHAR2(100);
tupla caceres%ROWTYPE;
dim SDO_DIM_ARRAY;
-- Cursor para recuperar los barrios
CURSOR cursor_barrio IS
SELECT *
FROM caceres
WHERE tipo = 'Barrio';
BEGIN
-- Recuperar la geometria del parametro de entrada
SELECT Geom INTO geomEntrada
FROM Caceres
WHERE Nombre = pnombre;
-- Obtener dim
SELECT DIMINFO INTO dim
FROM USER_SDO_GEOM_METADATA
WHERE table_name='CACERES'; --Ojo, CACERES en mayúsculas
-- Recorrer todos los barrios
OPEN cursor_barrio;
LOOP
FETCH cursor_barrio INTO tupla;
EXIT WHEN cursor_barrio%NOTFOUND;
--SDO_GEOM.SDO_LENGTH
dist := SDO_GEOM.SDO_CENTROID(geomEntrada,dim);
END LOOP;
DBMS_OUTPUT.PUT_LINE(pnombre||' have this center: ' || dist);
END centroId;我做错什么了?
我怎样才能显示这些信息?可能在用st_asText?
发布于 2017-12-10 04:21:14
SDO几何确实是一门复杂的学科。如果您要做很多事情,我建议您认真阅读Oracle的“空间用户指南和参考”(对于您的Oracle版本),也许几次。
您询问了如何从对象中获取信息,但没有指定目标信息。我将不得不接受提出的逻辑,并假设它收集必要的数据。这除了dist定义和/或它的赋值之外。函数SDO_GEOM.SDO_CENTROID返回的不是序列,而是SDO_GEOMETRY。其中另一个对象是SDO_POINT_TYPE,它本身由3个数字组成;(x,y,z)。地理或地理空间数据对应于经度、纬度、高度。
访问这些值没有什么特别之处,只需使用标准点(.)符号。所以在这里:
declare
dest sdo_geometry;
.
.
.
dest := sdo_geom.sdo_centroid(geomEntrada,dim);
dbms_output.put_line(pnombre||' have this center: '
|| "longitude=' || to_char(l_centroid.sdo_point.x)
|| " latitude=' || to_char(l_centroid.sdo_point.y)
); 从SDO类型访问信息与从任何其他Oracle对象访问信息没有什么不同:您需要知道定义并使用点(.)每个级别的符号。
顺便说一句:上面的参考手册包含了这些定义。
CREATE TYPE sdo_geometry AS OBJECT (
SDO_GTYPE NUMBER,
SDO_SRID NUMBER,
SDO_POINT SDO_POINT_TYPE,
SDO_ELEM_INFO MDSYS.SDO_ELEM_INFO_ARRAY,
SDO_ORDINATES MDSYS.SDO_ORDINATE_ARRAY);
CREATE TYPE sdo_point_type AS OBJECT (
X NUMBER,
Y NUMBER,
Z NUMBER);https://stackoverflow.com/questions/47718390
复制相似问题