我正在尝试做一个SDO_relate,但是它正在返回一个错误。
我的代码:
ON sdo_relate (f.tls_da_location, ntp.boundary, 'MASK=ANYINTERACT') = 'TRUE'
WHERE ntp.boundary IS NOT NULL我试过这个和sdo_util.getnumvertices (ntp.boundary) > 4
但是,它仍然返回以下错误:
ORA-29902: error in executing ODCIIndexStart() routine
ORA-13249: Internal error: Memory Resident R-tree
ORA-13343: a polygon geometry has fewer than four coordinates
ORA-06512: at "MDSYS.SDO_INDEX_METHOD_10I", line 333
12801. 00000 - "error signaled in parallel query server %s"
*Cause: A parallel query server reached an exception condition.
*Action: Check the following error message for the cause, and consult
your error manual for the appropriate action.
*Comment: This error can be turned off with event 10397, in which
case the server's actual error is signaled instead.有没有其他人建议忽略这些没有4分的多边形?
发布于 2022-02-16 08:51:50
这里有几个方面..。
First:优化器可以自由地以任何顺序应用谓词。在您的示例中,它似乎首先应用了空间过滤器,然后将选择器应用于顶点数。这意味着在对顶点数进行测试之前,您将得到异常。
优化器这样做是很自然的:改变顺序将意味着一个完整的表扫描,只返回带有4个点或更多点的几何图形,然后通过空间过滤器传递结果。这将是非常缓慢的,优化器正确地倾向于首先使用索引。
没有控制此行为的机制(提示或其他机制)。使用子查询或视图没有任何区别:优化器会将查询简化为简单的查询。可能有一个带有NO_MERGE提示的子查询可以工作:但它会产生上述效果,强制进行完整的表扫描,并通过空间过滤器完全传递所有几何图形。这不是件好事。
第二:少于4个顶点的多边形是不正确的。最简单的多边形是三角形。它有三个点(A.),但所有多边形都必须闭合,即编码为四个顶点:A.。这是OGC简单特性为SQL规范定义的规则之一。还有一些多边形必须遵守:
不存在多余的vertices
不遵守规则的形状是无效。当您使用无效形状时会发生什么实际上是未定义的。根据错误的性质和在此形状上所做的操作(查询、度量、缓冲区、剪辑、合并.),您可能会得到以下任何行为:
最糟糕的结果是#3:您不能信任应用程序的结果。它可能返回一个包裹的m2中的错误区域。或者说两个相邻的包裹不重叠,而在现实中是这样的.这太糟了。
在空间数据的处理和处理中,数据质量是的头等重要的。请注意,错误通常是不可见的:大多数地图映射工具具有足够的弹性,仍然可以显示形状,而缺陷是最不可能视觉检测到的。
解决方案很简单:确保数据是有效的。为此,您可以使用SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT()。把它翻遍每一个形状。它会告诉你哪些形状是不正确的,以及错误是什么。
还有SDO_UTIL.RECTIFY_GEOMETRY()。这一次将试图纠正最常见的错误:
vertices
,并重新订购self-orientations。
它不能纠正你所看到的错误(少于四点),因为它不确定什么是真正的错误。你需要看看这些形状是什么,更重要的是它们来自哪里。然后要么改正,要么把它们移除。
https://stackoverflow.com/questions/71027581
复制相似问题