sdo_relate ORA-13343: 多边形几何坐标少于四个

sdo_relate ORA-13343: a polygon geometry has fewer than four coordinates

我正在尝试执行 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

然而它仍然returns下面的错误:

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 个点的多边形?

这里有几个方面...

首先:优化器可以自由地以任何顺序应用谓词。在您的情况下,看起来它首先应用空间过滤器,然后在顶点数上应用选择器。这意味着在 顶点数测试之前 出现异常。

优化器这样做是很自然的:更改顺序将意味着完整 table 扫描仅 return 具有 4 个或更多点的几何图形,然后通过空间过滤器传递结果。那会很慢,优化器理所当然地优先使用索引。

没有机制(提示或其他方式)来控制此行为。使用子查询或视图不会有任何区别:优化器会将查询扁平化为一个简单的查询。可能带有 NO_MERGE 提示的子查询可以工作:但它会产生上述效果,即强制进行完整的 table 扫描并使所有几何图形完全通过空间过滤器。不是什么好东西。

其次:顶点少于4个的多边形不正确。最简单的多边形是三角形。它有三个点(A-B-C),但所有多边形都必须闭合,即被编码为四个顶点:A-B-C-A。这是 OGC Simple Features for SQL 规范定义的规则之一。多边形必须遵守其他规则:

  • 没有冗余顶点
  • 方向(外圈counter-clockwise,内圈顺时针,即孔)
  • 没有自摸环
  • 环的顺序(外环之后必须是内环)

不遵守规则的形状无效。当您使用无效形状时会发生什么实际上是未定义的。根据错误的性质和您对此形状执行的操作(查询、测量、缓冲、裁剪、合并...),您可能会遇到以下任何行为:

  1. 错误被忽略,您得到正确的结果
  2. 你得到一个例外(你的情况)
  3. 没有错误,但结果不正确

最坏的可能结果是#3:您不能相信您的申请结果。它可能 return 包裹的 m2 面积错误。或者它可能会说两个相邻的地块不重叠,而实际上它们重叠......这非常糟糕。

在操作和处理空间数据时,数据质量头等重要。请注意,错误通常是不可见的:大多数 map-mapping 工具具有足够的弹性,仍然可以显示形状,并且缺陷是最不可能通过视觉检测到的。

解决方法很简单:确保您的数据有效。为此,您可以使用 SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT()。 运行 它覆盖每个形状。它会告诉你哪些形状不正确,错误是什么。

还有SDO_UTIL.RECTIFY_GEOMETRY()。这个将尝试纠正最常见的错误:

  • 删除冗余顶点
  • 重定向和 re-orders 环
  • 更正一些 self-orientations

它不会更正您看到的错误(少于四分),因为它不确定实际上是什么错误。你需要看看这些形状是什么,更重要的是它们来自哪里。然后更正它们或删除它们。