我正在尝试为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
答案 0 :(得分:3)
您的示例有几个问题。
发生第一个错误(“窗口SRID与图层SRID不匹配”),因为表中的几何图形使用坐标系标识符(SRID)正确编码,但查询窗口没有。这意味着查询系统无法将您传递的坐标与您查询的数据相关联。请注意,查询窗口的SRID不必与要查询的表的SRID相同。
然后您不需要从WKT显式转换:SDO_GEOMETRY构造函数自动执行此操作。只需将WKT字符串与查询窗口的SRID一起传递,如下所示:
SDO_GEOMETRY('POLYGON ((28.125 40.979898069620155, 30.9375 40.979898069620155, 30.9375 43.068887774169625, 28.125 43.068887774169625, 28.125 40.979898069620155))',4326)
第二个错误(“没有空间索引时不支持接口”)是因为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上定义索引。如果该表已经在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';
答案 1 :(得分:1)
我做了:
SDO_INSIDE(SDO_UTIL.FROM_WKTGEOMETRY(SDO_UTIL.TO_WKTGEOMETRY(SHAPE)), SDO_UTIL.FROM_WKTGEOMETRY('INSERT LARGE WKT TEXT HERE'))
一切都开始了。