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,内圈顺时针,即孔)
- 没有自摸环
- 环的顺序(外环之后必须是内环)
不遵守规则的形状无效。当您使用无效形状时会发生什么实际上是未定义的。根据错误的性质和您对此形状执行的操作(查询、测量、缓冲、裁剪、合并...),您可能会遇到以下任何行为:
- 错误被忽略,您得到正确的结果
- 你得到一个例外(你的情况)
- 没有错误,但结果不正确
最坏的可能结果是#3:您不能相信您的申请结果。它可能 return 包裹的 m2 面积错误。或者它可能会说两个相邻的地块不重叠,而实际上它们重叠......这非常糟糕。
在操作和处理空间数据时,数据质量头等重要。请注意,错误通常是不可见的:大多数 map-mapping 工具具有足够的弹性,仍然可以显示形状,并且缺陷是最不可能通过视觉检测到的。
解决方法很简单:确保您的数据有效。为此,您可以使用 SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT()
。 运行 它覆盖每个形状。它会告诉你哪些形状不正确,错误是什么。
还有SDO_UTIL.RECTIFY_GEOMETRY()
。这个将尝试纠正最常见的错误:
- 删除冗余顶点
- 重定向和 re-orders 环
- 更正一些 self-orientations
它不会更正您看到的错误(少于四分),因为它不确定实际上是什么错误。你需要看看这些形状是什么,更重要的是它们来自哪里。然后更正它们或删除它们。
我正在尝试执行 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,内圈顺时针,即孔)
- 没有自摸环
- 环的顺序(外环之后必须是内环)
不遵守规则的形状无效。当您使用无效形状时会发生什么实际上是未定义的。根据错误的性质和您对此形状执行的操作(查询、测量、缓冲、裁剪、合并...),您可能会遇到以下任何行为:
- 错误被忽略,您得到正确的结果
- 你得到一个例外(你的情况)
- 没有错误,但结果不正确
最坏的可能结果是#3:您不能相信您的申请结果。它可能 return 包裹的 m2 面积错误。或者它可能会说两个相邻的地块不重叠,而实际上它们重叠......这非常糟糕。
在操作和处理空间数据时,数据质量头等重要。请注意,错误通常是不可见的:大多数 map-mapping 工具具有足够的弹性,仍然可以显示形状,并且缺陷是最不可能通过视觉检测到的。
解决方法很简单:确保您的数据有效。为此,您可以使用 SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT()
。 运行 它覆盖每个形状。它会告诉你哪些形状不正确,错误是什么。
还有SDO_UTIL.RECTIFY_GEOMETRY()
。这个将尝试纠正最常见的错误:
- 删除冗余顶点
- 重定向和 re-orders 环
- 更正一些 self-orientations
它不会更正您看到的错误(少于四分),因为它不确定实际上是什么错误。你需要看看这些形状是什么,更重要的是它们来自哪里。然后更正它们或删除它们。