Oracle:从 MDSYS.SDO_GEOMETRY 列中提取数据

Oracle: extract data from MDSYS.SDO_GEOMETRY column

我有一个 table 表格,我需要从中提取一些信息。这个 table 有一个 oracle 空间 (MDSYS.SDO_GEOMETRY) 列,我还需要从中获取一些数据。

我从这样一个简单的查询开始:

select id, field1, field2
FROM my_table;

之后,我能够遍历结果以提取空间列中的数据:

SELECT *
        FROM TABLE  (SELECT a.POSITIONMAP.sdo_ordinates
                          FROM my_table
                          WHERE ID = 18742084);

POSITIONMAP.sdo_ordinates 似乎通常包含 4 个值,例如:

100050,887
407294,948
0,577464740471056
-0,816415625470689

我需要最后两个值。我可以通过将查询更改为以下内容来实现:

SELECT * FROM
    (SELECT rownum AS num,
            column_value AS orientatie
        FROM TABLE  (SELECT a.POSITIONMAP.sdo_ordinates
                          FROM my_table
                          WHERE ID = 18742084))
    WHERE num IN (3,4)

遍历第一个查询中的每一行以从 POSITIONMAP 列中提取数据当然对性能不是很友好,因此我的查询很快变慢。

我想在一个查询中检索所有信息,但有一些事情阻止我这样做。

我得到的最接近的是:

select
  id,
  field1, 
  field2
  t.*
  FROM my_table v,
  table (v.POSITIONMAP.sdo_ordinates) t

这为 my_table 中的每一行提供了 4 行。 一旦我尝试将 rownum 条件放入此查询中,我就会收到错误消息:"invalid user.table.column, table.column, or column specification"

有什么方法可以将我想做的事情合并到 1 个查询中吗?

一种方法是使用ROW_NUMBER()解析函数:

SELECT *
FROM   (
  select id,
         field1, 
         field2,
         t.*,
         ROW_NUMBER() OVER ( PARTITION BY v.id ORDER BY ROWNUM ) AS rn
  FROM   my_table v,
         TABLE( v.POSITIONMAP.sdo_ordinates ) t
)
WHERE  rn IN ( 3, 4 )

您可以按如下方式使用sdo_util.getvertices:

select t.x,t.y
  from my_table mt
      ,table(sdo_util.getvertices(mt.positionmap)) t
 where t.id = 2

我假设您的几何图形是线 (gtype=2002) 和点 (gtype=2001)。如果您想要线的 X、Y 值和点的空值,您可以过滤几何对象的 sdo_gtype 属性。

select t.x,t.y
  from my_table mt
      ,table(sdo_util.getvertices(mt.positionmap)) t
 where t.id = 2
 and mt.positionmap.sdo_gtype=2002
 union all
 select null as X,
        null as Y
 from my_table mt
 where mt.positionmap.sdo_gtype=2001