Oracle Spatial:我无法让 sdo_inside 工作

Oracle Spatial: I can't get sdo_inside to work

我正在尝试为 Oracle Spatial Database 构建地图切片服务器。我需要使用边界框过滤查询,以便我可以获得单独的图块数据。

我将边界框数据转换为 WKT,并尝试将 SDO_UTILS.FROM_WKTGEOMETRY 与 SDO_INSIDE 结合使用,以便我可以获得图块数据。这是我的查询结果:

select SDO_UTIL.TO_WKTGEOMETRY(SDO_UTIL.SIMPLIFY(sdo_cs.transform(SHAPE, sdo_cs.map_epsg_srid_to_oracle(4326)), 6, 0.000001)) as GEOM,
column_1,
column_2,
column_3
from tablename 
where SDO_INSIDE(SHAPE, SDO_UTIL.FROM_WKTGEOMETRY(TO_CHAR('POLYGON ((28.125 40.979898069620155, 30.9375 40.979898069620155, 30.9375 43.068887774169625, 28.125 43.068887774169625, 28.125 40.979898069620155))'))) = 'TRUE'

这个查询说:

ORA-29902: Runtime error on ODCIIndexStart()
ORA-13208: [window SRID does not match layer SRID]
ORA-06512: location "MDSYS.SDO_INDEX_METHOD_10I", line 333

然后我在列 SHAPE 和 sdo_util.from_wktgeometry 几何图形上尝试了 sdo_cs.transform,方法与查询的第一行相同,但它收到另一个错误。

编辑:我检查了可能包含答案的问题,我应用了转换,得到的是:

ORA-13226: interface not supported without a spatial index
ORA-06512: location "MDSYS.MD",  line 1723
ORA-06512: location "MDSYS.MDERR",  line 8
ORA-06512: location "MDSYS.SDO_3GL",  line 88

我做到了:

SDO_INSIDE(SDO_UTIL.FROM_WKTGEOMETRY(SDO_UTIL.TO_WKTGEOMETRY(SHAPE)), SDO_UTIL.FROM_WKTGEOMETRY('INSERT LARGE WKT TEXT HERE'))

一切都开始工作了。

您的示例存在几个问题。

第一个错误 ("window SRID does not match layer SRID") 的发生是因为您的 table 中的几何图形使用坐标系标识符 (SRID) 进行了正确编码,但您的查询 window 没有。这意味着查询系统无法将您传递的坐标与您查询的数据的坐标相关联。请注意,查询 window 的 SRID 不必与被查询 table 的相同。

那么您不需要显式地从 WKT 进行转换:SDO_GEOMETRY 构造函数会自动执行此操作。只需将 WKT 字符串与查询的 SRID 一起传递给它 window,如下所示:

SDO_GEOMETRY('POLYGON ((28.125 40.979898069620155, 30.9375 40.979898069620155, 30.9375 43.068887774169625, 28.125 43.068887774169625, 28.125 40.979898069620155))',4326)

第二个错误 ("interface not supported without a spatial index") 是因为 SDO_INSIDE 的第一个参数没有空间索引。如果要执行任何类型的空间查询,则需要空间索引。

您使用以下方法将查询返回的形状转换为 WGS84:

sdo_cs.transform(SHAPE, sdo_cs.map_epsg_srid_to_oracle(4326))

仅当 SHAPE 列中的数据位于 WGS84 以外的其他坐标系时才需要。为什么需要 map_epsg_srid_to_oracle(4326) 调用?

最后,你说这行得通:

SDO_INSIDE(SDO_UTIL.FROM_WKTGEOMETRY(SDO_UTIL.TO_WKTGEOMETRY(SHAPE)), SDO_UTIL.FROM_WKTGEOMETRY('INSERT LARGE WKT TEXT HERE'))

这是不可能的 - 除非您在第一个表达式 SDO_UTIL.FROM_WKTGEOMETRY(SDO_UTIL.TO_WKTGEOMETRY(SHAPE)) 上定义了空间索引。这是你做的吗?我不明白这一点。您所需要的只是 SHAPE 列上的空间索引。

考虑到以上情况,以下将起作用(不要忘记在 TABLENAME.SHAPE 上定义索引。如果 table 已经在 WGS84 中,则也不需要转换。

select SDO_UTIL.TO_WKTGEOMETRY(SDO_UTIL.SIMPLIFY(sdo_cs.transform(SHAPE,4326)),6, 0.000001)) as GEOM,
column_1,
column_2,
column_3
from tablename 
where SDO_INSIDE(SHAPE, SDO_GEOMETRY('POLYGON ((28.125 40.979898069620155, 30.9375 40.979898069620155, 30.9375 43.068887774169625, 28.125 43.068887774169625, 28.125 40.979898069620155))',4326)) = 'TRUE';