显示 SDO_GEOMETRY (CENTROID) 的信息

Posted

技术标签:

【中文标题】显示 SDO_GEOMETRY (CENTROID) 的信息【英文标题】:Show the information of SDO_GEOMETRY (CENTROID) 【发布时间】:2017-12-08 16:27:51 【问题描述】:

我正在使用 Oracle 的空间数据库,但遇到了一些问题。 我正在使用几何子程序(如 SDO_GEOM.SDO_LENGTH)执行一些程序,它返回一个数字,但是当我使用其他几何子程序(如 SDO_GEOM.CENTROID)时,我不知道如何显示信息,因为这会返回一个 SDO_OBJECT

我是 Spatial 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 吗?

【问题讨论】:

【参考方案1】:

SDO GEOMETRY 确实是一门复杂的学科。如果您打算使用它做很多事情,我建议您认真阅读 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);

【讨论】:

以上是关于显示 SDO_GEOMETRY (CENTROID) 的信息的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 空间查询, 数据类型为 sdo_geometry

oracle 创建SDO_Geometry表

转载Oracle Spatial中SDO_Geometry详细说明

oracle 的 SDO_GEOMETRY

ORACLE SDO_GEOMETRY ToString()?

arcgis如何将多个属性字段合并成一个?