我在 Oracle 18c 中使用名为 ST_GEOMETRY 的用户定义类型 (UDT):
我有一个生成 ST_GEOMETRY 超类型的查询:
select
sde.st_geometry('LINESTRING(1 2,3 4,5 6)', 26917) as geom
from
dual
[SDE.ST_GEOMETRY]
我想选择该几何体的特定顶点 - ST_GEOMETRY 线的 起点:
select
sde.st_startpoint(sde.st_geometry('LINESTRING(1 2,3 4,5 6)', 26917)) as startpoint
from
dual
[SDE.ST_POINT]
请注意,输出是 ST_POINT 子类型,而不是 ST_GEOMETRY 超类型。
起点查询在 SQL 客户端中运行没有错误。但是,我想在 GIS 软件中使用查询,该软件有一个限制,即不能使用 ST_POINT 子类型。它只能使用 ST_GEOMETRY 超类型。
软件供应商将此问题归咎于 Oracle: 错误:无法在 ArcGIS 中定义查询图层,其中数据源在 Oracle 中使用 st_geometry 子类型。软件供应商建议采用以下解决方法(尽管他们没有说如何做到这一点):
从子类型转换几何属性字段(例如, st_point) 到超类型 st_geometry。
所以,我想使用Oracle的TREAT()函数从ST_POINT子类型转换为ST_GEOMETRY超类型:
select
treat(sde.st_startpoint(sde.st_geometry('LINESTRING(1 2,3 4,5 6)', 26917)) as sde.st_geometry) startpoint_geom
from
dual
[SDE.ST_POINT]
该查询在 SQL 客户端中运行没有错误。但它似乎没有正确转换为 ST_GEOMETRY 超类型。输出仍然是 ST_POINT 子类型,这不是我想要的。 (它仍然导致 GIS 软件出现问题。)
如何使用 TREAT() 函数将 UDT 子类型转换为超类型?
我知道还有其他解决方法,例如从
subtype
转换为 text
到 supertype
。但这是丑陋且缓慢的。我更喜欢使用 TREAT() 函数来进行转换,因为我认为这会更干净/更快。
在回复创建 NIL(零顶点)几何体时,我提到错误已更新。现在建议我们使用st_geometry构造函数从子类型转换为超类型。这似乎适用于将 [SDE.ST_POLYFROMTEXT] 转换为 [SDE.ST_GEOMETRY]。