Oracle Spatial 中的弧段及弧相关拓扑错误

时间:2022-12-26 14:42:40

1.报告说明

此报告用于验证下列问题:

  • ORACLE SPATIAL 0.05m的最小拓扑容差值是否可以被修改
    • 原始数据通过ARCGIS入库数据精度是否有损失
    • 修改ORACLE SPATIAL图层的最小容差值是否对拓扑检查有影响
    • 修改ORACLE SPATIAL图层的最小容差值是否对面积计算有影响
    • ORACLE SPATIAL中的拓扑错误(不包括弧)是否会影响面积计算
    • ORACLE SPATIAL是否有修改拓扑错误的能力
  • ARCGIS中的弧段数据能否存入ORACLE SPATIAL并正确使用
    • 不同版本的ARCGIS对弧段数据进行入库其动作是否一致
    • ORACLE SPATIAL能否在地理坐标系下对弧进行空间运算
    • 能否对ARCGIS中的弧作相关处理后入库使其可以支持在地理坐标系下的空间运算
    • ORACLE SPATIAL是否有能力将弧转换成多边形

另外说明:样本集包括370522、370104、370102、370725、370503、371626、370105、371526、370502九个县的LCA图层。

2.数据容差问题

国情普查的数据精度为0.0001m,该数据入库后,若容差值设定过大,将会产生很多拓扑错误,例如重复点、自相交等。而据ORACLE官方表示,ORACLE SPATIAL只支持0.05 m的最小数据容差,如下图所示:

Oracle Spatial 中的弧段及弧相关拓扑错误

在该容差值下,很多生产环节相距很近的点被ORACLE当作同一个点,因而产生拓扑错误。而某些拓扑错误又会进一步导致其它次生问题,例如面积统计失败、空间分析失败等。针对这种情况,将尝试通过手动修改ORACLE SPATIAL图层经纬度容差值(USER_SDO_GEOM_METADATA)的方法来规避拓扑错误。验证分如下两步进行:

  1. 使用ARCGIS进行数据入库是否有精度损失
  2. 调整图层容差值是否可以产生预期效果

2.1使用ARCGIS进行数据入库是否有精度损失

2.2.1原始数据精度

原始数据在经纬度坐标系下保留小数点后9位数字,即E-9。如下图:

Oracle Spatial 中的弧段及弧相关拓扑错误

将经纬度换算成单位米,约为110*1000*10-9=0.0001m(赤道位置,一度约为110KM,非赤道位置精度值会小于0.0001m)。

2.2.2SDO_GEOMETRY数据精度

入库后图形数据以SDO_GEOMETRY数据格式存储。SDO_GEOMETRY的坐标串存储在SDO_ORDINATE_ARRAY数组中,该数组的定义如下:

"CREATE OR REPLACE TYPE SDO_ORDINATE_ARRAY AS VARRY(1048576) OF NUMBER"

即该数组是以NUMBER类型组成的数组。NUMBER类型的语法为:NUMBER(p,s):

p:精度位,是总有效数据位数,取值范围是38,可以用字符*表示38。

s:小数位,是小数点右边的位数,取值范围是-84-127,默认值取决于p,如果没有指定p,那么s是最大范围,如果指定了p,那么s=0。

经实验证明,在不指定p和s的情况下,随着小数位数的增加,至少在小数点后18位时仍然没有数据损失(见DUMP内容)。而PL/SQL仅显示小数点后14位,见NUM列。实验过程如下:

Oracle Spatial 中的弧段及弧相关拓扑错误

原始数据精度为E-9,实验说明ORACLE在存储原始坐标串时是有能力不丢失数据的。

2.2.3入库后数据精度

入库后数据坐标串如下图所示:

Oracle Spatial 中的弧段及弧相关拓扑错误

原始数据精度为E-9,入库后数据精度为E-9。入库前后坐标串对比图如下:

Oracle Spatial 中的弧段及弧相关拓扑错误

由上图可知,数据入库没有精度损失。

2.2调整图层容差值是否可以产生预期效果

在ORACLE中该数据精度(分辨率)为E-9,单位换算成米即为E-4(m)。因此可知,容差设定为E-5即为极限,当设定为E-5即表示任何一个坐标点都不会被ORACLE认为是重复点,因为E-5<E-4。另外也说明容差<=E-5已经没有意义。基于上文表述,此列中将会把ORACLE SPATIAL容差下限设定为E-4,验证在该容差下限下的拓扑检查和面积计算。

2.2.1验证原始图层是否存在拓扑错误

在该例中,我们关心的拓扑规则为"是否存在重复点",因此需要首先将原始面状图层转成点状图层进行拓扑验证。

原始面状数据转点状数据后,对点图层进行"Must Be Disjoint"的拓扑验证,拓扑容差设定为0.001m(即E-3)验证结果如下:

Oracle Spatial 中的弧段及弧相关拓扑错误

说明在容差为0.001m时,没有点重复。自然可知在容差为E-4m时,绝对没有点重复。

2.2.2不断调整图层容差值进行拓扑验证

说明:下列组图中,每张图OERR=13349的错误个数均需要+2,因为在进行本组测试之前,删除了两个有重复点的要素。但不影响错误个数随着容差值增大而增大的趋势判断。

  1. 容差值=1E-4

    Oracle Spatial 中的弧段及弧相关拓扑错误

  2. 容差值=5E-4

    Oracle Spatial 中的弧段及弧相关拓扑错误

  3. 容差值=1E-3

    Oracle Spatial 中的弧段及弧相关拓扑错误

  4. 容差值=5E-3

    Oracle Spatial 中的弧段及弧相关拓扑错误

  5. 容差值=1E-2

    Oracle Spatial 中的弧段及弧相关拓扑错误

  6. 容差值=5E-2

    Oracle Spatial 中的弧段及弧相关拓扑错误

由以上组图,可知随着容差值的变大,拓扑错误越来越多。这说明,通过对USER_SDO_GEOM_METADAT中容差值的修改,的确会影响拓扑检查的结果。

2.2.3OARCLE SPATIAL容差值分析

将USER_SDO_GEOM_METADAT中该图层的容差值设定为E-4,然后对ORACLE SPATIAL中的图层进行拓扑验证,验证过程及结果如下:

exec SDO_geom.validate_layer_with_context('TEST_370522','SHAPE','TEST_TOPO');

Oracle Spatial 中的弧段及弧相关拓扑错误

对于同样的数据,ARCGIS和ORACLE SPATIAL的拓扑检查结果不一样,而且在做拓扑检查时ARCGIS使用的容差值大于ORACLE SPATIAL使用的容差值。理论上应该ARCGIS出现更多的拓扑错误,而实验结果却刚好相反。猜测ORACLE SPATIAL设定的容差值没有起到预定的效果。下面来证明。

假设ORACLE SPATIAL默认的最小容差值为0.05m,ARCGIS做拓扑检查的容差值为0.001m。若ORACLE SPATIAL设定的容差值没有起效果,那么对于距离处于0.001<D<0.05m的两个点,ORACLE SPATIAL会认为是同一个点,也就是OERR=13349。将0.001<D<0.05进行单位换算,得知在经纬度坐标系下,9.09E-9<D<4.54E-7即有可能被ORACLE SPATIAL认为是同一个点。从拓扑错误表中任意选一个错误要素:

Oracle Spatial 中的弧段及弧相关拓扑错误

在本例中,我们选OBJECTID=739的要素进行分析。该要素的坐标串如下图:

Oracle Spatial 中的弧段及弧相关拓扑错误

红框部分即为可疑坐标串(点),这两个点的距离可能处于9.09E-9——4.54E-7(0.001——0.05)之间。在ARCMAP中打开该图层,然后计算这两个点之间的距离。

Oracle Spatial 中的弧段及弧相关拓扑错误

通过计算,4号点与5号点之间的距离为0.015m,该距离处于0.001——0.05之间,符合上文的推断。为了验证拓扑错误——重复点——的确是由这两个点引起的,进一步测试在删除该两点任意一点后,拓扑验证情况。

  1. 方法一:直接用ARCMAP删除点

    Oracle Spatial 中的弧段及弧相关拓扑错误

    保存编辑后,再次验证:

    Oracle Spatial 中的弧段及弧相关拓扑错误

    错误个数由50减少到49。

    Oracle Spatial 中的弧段及弧相关拓扑错误

    错误列表中已经没有OBJECTID=739的记录。

  2. 方法二:SDO_UTIL.REMOVE_DUPLICATE_VERTICES(geometry,tolerance)删除
  3. 在tolerance设为E-4时执行:

update TEST_370522 set shape=(select sdo_util.remove_duplicate_vertices(a.shape,1E-4) from TEST_370522 a where objectid=1789)where objectid=1789;

commit;

Oracle Spatial 中的弧段及弧相关拓扑错误

重复点未删除。

  1. 在tolerance设为5E-2时执行

update TEST_370522 set shape=(select sdo_util.remove_duplicate_vertices(a.shape,5E-2) from TEST_370522 a where objectid=1789) where objectid=1789;

commit;

Oracle Spatial 中的弧段及弧相关拓扑错误

重复点被删除。这里说明在tolerance设为E-4时,ORACLE SPATIAL并没有按照默认最小容差5E-2来进行运算,而是真实地按照E-4进行运算,从该函数方法来看,将容差值调整到小于默认最小容差时有效。

2.2.4拓扑错误对面积计算的影响

在上例中的50个重复点中有两个已经得到了解决,那么剩余的48个拓扑错误会影响面积计算吗?接着分如下四步来验证:

  1. 存在拓扑错误要素的绝对差异

    分别计算存在拓扑错误的48个要素的面积差异及差异比率,如下图所示:

    Oracle Spatial 中的弧段及弧相关拓扑错误

    由上图MJC_BL(面积差异的比率)可知,存在拓扑错误的48个要素,其差异部分所占的比率均在1E-4(万分之一级)程度,认为此种程度的差异没有关键影响。

  2. 所有要素计算面积差,并按绝对差异值倒序排列

    分别由ARCGIS和ORACLE SPATIAL计算要素面积,比较面积差,并按面积差倒序排列:

select * from (select objectid,abs(sdo_geom.sdo_area(shape,1E-4)-t.mj) mjc,rowid from TEST_370522 t) order by mjc desc;

Oracle Spatial 中的弧段及弧相关拓扑错误

可见面积差异最大的一些要素并非是有重复点拓扑错误造成的。对于面积差异最大的要素,在本例中,它的形态如下:

Oracle Spatial 中的弧段及弧相关拓扑错误

  1. 所有要素计算面积差比率,并按比率倒序排列

    分别由ARCGIS和ORACLE SPATIAL计算要素面积,得到面积差,再由面积差除以ARCGIS计算面积,得到差异比率,并按比率倒序排列。

    Oracle Spatial 中的弧段及弧相关拓扑错误

    由上图可和,差异率最大的要素,差异率也在1E-4程度,因此认为整个图层,其差异在可接受范围内。

  2. 调整sdo_geom.sdo_area面积计算函数的容差值,由ORACLE计算面积

    使用不同的容差值作为sdo_geom.sdo_area函数的参数进行运算,得到各要素的面积值。经测试发现,随着容差值的变化,ORACLE计算的面积结果不发生变化。

2.3样本集中各县的拓扑检查结果

使用ARCGIS将样本集中的所有数据入库,入库后进行拓扑检查(此时的拓扑容差为默认容差,即0.001m),各县的检查结果如下:

  1. 370522

Oracle Spatial 中的弧段及弧相关拓扑错误

  1. 370104

Oracle Spatial 中的弧段及弧相关拓扑错误

  1. 370102

    Oracle Spatial 中的弧段及弧相关拓扑错误

由上图可知,存在弧段拓扑错误(13035)的要素会导致面积计算失败。关于弧段相关的问题,会在下文详细介绍。

  1. 370725

Oracle Spatial 中的弧段及弧相关拓扑错误

  1. 370503

Oracle Spatial 中的弧段及弧相关拓扑错误

  1. 371626

Oracle Spatial 中的弧段及弧相关拓扑错误

  1. 370105

Oracle Spatial 中的弧段及弧相关拓扑错误

  1. 371526

Oracle Spatial 中的弧段及弧相关拓扑错误

与上文中的其它样本相比,该县新增了拓扑错误类型(13350)——环粘连,环粘连的效果图如下:

Oracle Spatial 中的弧段及弧相关拓扑错误

红点4-5连接线与绿点108-109连接线共线。如下图共线效果图:

Oracle Spatial 中的弧段及弧相关拓扑错误

经测试证明,该拓扑错误类型对面积差异的比率在1E-4级别。无关键影响。

Oracle Spatial 中的弧段及弧相关拓扑错误

  1. 370502

    Oracle Spatial 中的弧段及弧相关拓扑错误

    与上文中的其它样本相比,该县新增了拓扑错误类型(13366)——内外环不合法。该错误的效果图及面积计算结果如下图:

    Oracle Spatial 中的弧段及弧相关拓扑错误

2.4使用ORACLE原生函数修复拓扑错误

ORACLE提供了一些原生函数用来修复拓扑错误,这些函数包括SDO_UTIL.RECTIFY_GEOMETRY、SDO_GEOM.SDO_SELF_UNION、SDO_UTIL.REMOVE_DUPLICATE_VERTICES。根据ORACLE官方文档的介绍,这些方法函数提供了不同的能力:

  1. SDO_GEOM.SDO_SELF_UNION

Oracle Spatial 中的弧段及弧相关拓扑错误

下文将使用SDO_GEOM.SDO_SELF_UNION函数来处理370522县的拓扑错误(见2.3)。

在使用SDO_GEOM.SDO_SELF_UNION函数进行处理之前,拓扑检查(tol=1E-4)的结果如下图:

Oracle Spatial 中的弧段及弧相关拓扑错误

在使用SDO_GEOM.SDO_SELF_UNION函数并将tol参数设置为1E-4处理之后,

Oracle Spatial 中的弧段及弧相关拓扑错误

除了2个要素没有被正确处理,其余46个要素均被处理使其符合了拓扑检查的要求,处理效果如上图:

Oracle Spatial 中的弧段及弧相关拓扑错误

没有被处理的2个要素,选其中之一sdo_rowid='AAAZ7oAARAAC8ThAAM'进行分析,其效果图如下:

Oracle Spatial 中的弧段及弧相关拓扑错误

此时点1762与点1763之间的距离为0.016229,点1762到线段1763的距离为0.011783。

调整该函数中tol参数的值,当tol小于当前值,即1E-4时,存在拓扑错误的2个要素仍然不能被修复。当tol大于当前值,直到调整到大于等于5E-2时,存在拓扑错误的2个要素被修复。修复后的效果如下图:

Oracle Spatial 中的弧段及弧相关拓扑错误

  1. SDO_UTIL.REMOVE_DUPLICATE_VERTICES

Oracle Spatial 中的弧段及弧相关拓扑错误

有关此函数的使用方法及使用效果,见2.2.3。

  1. SDO_UTIL.RECTIFY_GEOMETRY

Oracle Spatial 中的弧段及弧相关拓扑错误

该函数的处理效果即为SDO_GEOM.SDO_SELF_UNION+SDO_UTIL.REMOVE_DUPLICATE_VERTICES。

2.5容差问题验证结论

由上文的验证过程,大致可以得到如下结论:ORACLE SPATIAL的存储坐标点时,没有数据精度损失。在进行拓扑检查时,修改拓扑值,使其小于0.05m,对于拓扑检查结果有影响,但这种影响与所设定容差值预期的影响不一致。另外对于ORACLE SPATIAL的某些方法、函数,修改拓扑值同样会产生效果,例如SDO_UTIL.REMOVE_DUPLICATE_VERTICES。另外,拓扑错误并不一定导致面积运算失败,拓扑错误对面积计算似乎没有关键影响。对于通过ESRI和ORACLE SPATIAL运算得到的面积值,差异差异普遍在1E-4(万分之一)级,可以忽略不计。

总结规纳,形成以下几点结论:

  • 使用ARCGIS入库,将数据存入SDO_GEOMETRY没有数据精度损失
  • 使用ARCGIS入库,除弧形要素以外,其它所有要素的差异普遍在万分之一级别。
  • ORACLE SPATIAL官方表示地理坐标系中的最小容差为0.05m,并表示对于某些函数,当容差值设定小于0.05m时,将使用0.05m作为容差值。但没有说明当容差值设定小于0.05m时,拓扑检查是否会使用0.05m作为容差值。
  • 修改ORACLE SPATIAL中的图层容差值,使其小于0.05m会对拓扑检查结果产生影响
  • 修改ORACLE SPATIAL中的图层容差值,设置任何值均对面积计算没有产生影响
  • ORACLE SPATIAL中的图层容差值(小于0.05m时)对拓扑检查的影响与该值预计产生的影响不一致
  • 除了弧引起的拓扑错误,下文涉及到的其它拓扑错误不影响面积计算。
  • ORACLE SPATIAL的原生函数可以修复点重复、自相交、内外环不合法三类拓扑(SDO_GEOM.SDO_ARC_DENSIFY亦可修改部分弧面错误,见下文介绍)错误。

3.弧段数据问题

弧是一种特殊的线,在ORACLE SPATIAL中,它通过起始点、弧上任意一点、结束点来表达。而弧面则是通过闭合结束点与起始点形成的面状要素。在ORACLE SPATIAL中,据官方文档说明,在平面坐标系下支持弧与弧面的存储与空间分析;而地理坐标系下不支持弧与弧面的存储与空间分析,下图为官方文档的说明:

Oracle Spatial 中的弧段及弧相关拓扑错误

验证将分如下两步进行:

  1. 通过ARCGIS入库,不同软件版本的不同响应动作
  2. 弧段数据入库的解决办法

3.1不同版本ARCGIS进行入库

ORACLE不支持在地理坐标系中对弧进行空间运算,因此对于原始数据中的弧,若想将其存入数据库,有两种方式:

  1. 直接导入要素类(import)或创建要素集后导入要素类。以这种方式入库,ORACLE会首先插入所有记录,然后创建空间索引。因此这种入库方式没有记录丢失,图层保留原始坐标系,即CGCS2000地理坐标系,但此时空间索引不可用。
  2. 先创建空的要素类,然后load data。以这种方式入库,在创建空的要素类时,ORACLE会对空图层创建空间索引,若此时指定了地理坐标系,入库就会报错,导致弧要素及其之后的所有要素入库失败。以这种方式入库,若不希望丢失记录,不能指定地理坐标系。在本例中,若使用此种方式入库,入库时不指定任何坐标参考。

3.1.1原始数据弧

原始数据中的弧,其图形及坐标串如下图:

Oracle Spatial 中的弧段及弧相关拓扑错误

获得原始弧形的WKT内容为:

MULTIPOLYGON (((118.85851139111136 37.429225522990038……212个坐标点)

3.1.2 ARCGIS 10.1.0 + ORACLE 11g

入库后,SDO_ELEM_INFO的内容如下图:

Oracle Spatial 中的弧段及弧相关拓扑错误

SDO_ELEM_INFO字段中,每3个数字组成一个属性单元(又称三元组),该例中仅有一个属性单元[1,1003,1]:

――[1,1003,1]:第一个1表示该几何元素从SDO_ORDINATES中第一个坐标点开始计算;1003表示假如几何类型为面(该例的确为面),则表示为外环多边形(逆时针顺序);第二个1与1003组合起来,表达该要素是由系列直线段组成的多边形。务必标出每个节点的坐标。最后一点要与第一个点相同,构成封闭。

SDO_ORDINATES字段说明:包括5370个坐标串。5370个坐标串密集排布,组成了弧形。将存在ORACLE SPATIAL中的坐标串在ARCGIS中打印出来,并局部放大。可以发现,弧段已经由最初的弧变成了非常密集的点。如下图所示:

Oracle Spatial 中的弧段及弧相关拓扑错误

3.1.3 ARCGIS 10.2.2 + ORACLE 11g

入库后,SDO_ELEM_INFO的内容如下图:

Oracle Spatial 中的弧段及弧相关拓扑错误

该例中SDO_ELEM_INFO有两个属性单元(又称三元组),分别为[1,1005,1]和[1,2,2]。两个属性单元有其各自的含义:

――[1,1005,1]:第一个1表示该几何元素从SDO_ORDINATES中第一个坐标点开始计算,根据1005可知这是一个描述三元组(用于描述要素的类型和几何元素的个数,不用于表达几何元素),第二个2表示该要素由一个几何元素组成。

――[1,2,2]:第一个1表示该几何元素从SDO_ORDINATES中第一个坐标点开始计算,后两个2的组合,说明该几何元素是由曲线片段组成的多义线。每一曲线段由三个点来描述:起点,任意在曲线线上的一点,终点,且前一个曲线终点是下一个曲线的起点。

SDO_ORDINATES字段说明:包括5个坐标串。将存在ORACLE SPATIAL中的坐标串在ARCGIS中打印出来,即上图中的4个(实际上是5个)点。(注意,背景的弧形并非ORACLE中的弧形,ORACLE中的弧因为在地理坐标系下不支持空间索引,因此在此例中无法显示。此处仅是为了说明坐标点的位置,将原始弧形作为背景显示)。ORACLE仍然把弧作为弧段存储,只是对弧段做了一些调整,例如在两个弧中各增加了一个点(即左右两点)。

Oracle Spatial 中的弧段及弧相关拓扑错误

此时将SDO_GEOMETRY转化为WKK,得到的WKT内容为:

CURVEPOLYGON (COMPOUNDCURVE (CIRCULARSTRING (118.858500342 37.4292332830002, 118.859100475185 37.429419573414, 118.858750251 37.4299413079999, 118.858183673607 37.4297431735208, 118.858500342 37.4292332830002)))

可见,ORACLE SPATIAL将该要素表达成了CURVEPOLYGON (COMPOUNDCURVE (CIRCULARSTRING))。

3.1.4 ARCGIS 10.2.2 + ORACLE 12c

入库后,SDO_ELEM_INFO的内容如下图:

Oracle Spatial 中的弧段及弧相关拓扑错误

意义同于ARCGIS 10.2.2 + ORACLE 11g。

3.1.5 ARCGIS 10.3.0 + ORACLE 11g

入库后,SDO_ELEM_INFO的内容如下图:

Oracle Spatial 中的弧段及弧相关拓扑错误

意义同于ARCGIS 10.2.2 + ORACLE 11g。

3.1.6 gwDTT + ORACLE 12c

这是一个附件部分,用以说明使用gwDTT入库时,将怎样处理弧段数据。入库后,SDO_ELEM_INFO和SDO_ORDINATES的内容如下图所示:

Oracle Spatial 中的弧段及弧相关拓扑错误

很显然这是一个有拓扑错误的面状要素,因为坐标串只有3个(第1个坐标串和第3个坐标串是同一个点),不能形成闭合环。对该要素进行拓扑检查:

Oracle Spatial 中的弧段及弧相关拓扑错误

查看错误编码,得知13343表示面状要素坐标少于4个。

3.1.7阶段性结论

由以上几组实验可知,不同版本的ARCGIS在进行入库时,会对弧采取不同的处理方式。对于通过ARCGIS 10.2或ARCGIS 10.3进行入库的数据,由于入库后存在弧,因此若对该数据添加地理坐标参考系并创建空间索引将会报错。ORACLE不支持地理坐标系中的弧,因此对于使用ARCGIS 10.2或ARCGIS 10.3进行入库的数据,需要对弧进行处理。处理方式有两类,一类是在入库前对数据进行处理,例如ARCGIS 10.1在入库时对弧进行了处理(见3.1.2),使其作为多边形进行入库;一类是在入库后对弧进行处理(此时不允许指定地理坐标系),将其处理为多边形,然后再指定地理坐标系并重建空间索引。

3.2使用ORACLE原生函数将弧转成多边形

ORACLE提供了原生函数SDO_GEOM.SDO_ARC_DENSIFY来将弧面转成多边形。官方文档介绍如下:

Oracle Spatial 中的弧段及弧相关拓扑错误

以2.3中370102县的弧面数据为例,使用该方法进行验证。

  1. 直接ARCGIS import方法将图层导入数据库,导入后的图形如下图:

Oracle Spatial 中的弧段及弧相关拓扑错误

  1. 验证该弧段的空间索引

    Oracle Spatial 中的弧段及弧相关拓扑错误

  2. 计算该弧段的面积

    Oracle Spatial 中的弧段及弧相关拓扑错误

    可见,弧面不支持面积计算。

  3. 使用SDO_GEOM.SDO_arc_densify处理后再次创建空间索引

    Oracle Spatial 中的弧段及弧相关拓扑错误

  4. 查看SDO_GEOM.SDO_arc_densify处理效果

    Oracle Spatial 中的弧段及弧相关拓扑错误

    由上图可知,使用此方法时行处理,图形没有任何变化。

    将精度改为1E-4,仍然没有效果。对于复杂的图形,修改的力度非常有限。

3.3弧段数据入库的其它解决办法

3.3.1解决办法

在本次实验中,采用的处理方式为入库前处理。具体过程为:

  1. 获取弧形要素的WKT

    MULTIPOLYGON (((118.85851139111136 37.429225522990038……212个坐标点)

  2. 将WKT转成面状要素
  3. 将该面状要素入库

3.3.2处理结果

将要素转成WKT并通过WKT再次构建要素后入库。入库后,SDO_ELEM_INFO的内容如下图:

Oracle Spatial 中的弧段及弧相关拓扑错误

SDO_ORDINATES: 包括212个坐标串。通过ARCGIS打印坐标串的效果图如下:

Oracle Spatial 中的弧段及弧相关拓扑错误

将该要素与通过ARCGIS 10.1入库后的要素叠置,局部放大后效果图如下:

Oracle Spatial 中的弧段及弧相关拓扑错误

红色点是WKT中记录的点,绿色的点是ORACLE SPATIAL中记录的点。可见ORACLE SPATIAL中记录的点要比WKT中记录的点密集,且密集得多。WKT中的点序大致表达了原始弧形,但一定存在形状变形,由于形状变形导致的面积变化还不确定,需要更进一步地测试。

3.4弧段问题验证结论

总结规纳,形成以下几点结论:

  • ARCGIS 10.1与 ARCGIS 10.2、ARCGIS 10.3在入库时对弧段数据的处理方式是不同的。ARCGIS 10.1将弧转成折线,而ARCGIS 10.2和ARCGIS 10.3将原始弧转成了ORACLE SPATIAL的弧(这两种弧不同)
  • ORACLE SPATIAL 不支持对地理坐标系下的弧建立空间索引
  • ORACLE SPATIAL原生函数SDO_GEOM.SDO_ARC_DENSIFY修改弧能力有限,对于复杂的图形,修复不了其中的弧
  • 原始弧可以通过转成WKT再转成面状要素的方式完成入库,入库后已由原始弧变成折线,会有部分图形变形,图形变形会导致面积精度损失

4.其它待验证事项

  1. 不同拓扑错误会对空间分析造成哪些影响?
  2. 通过WKT转换后入库的弧,其面积损失的比率有多大?

5.附件一:标准错误号及含义

文档中可能涉及到错误编码及其含义如下:

错误编码

含义

说明

ArcGIS与Spatial修复与分析

几何无效

"Invalid data in the SDO_ORDINATE_ARRAY in SDO_GEOMETRY object";

主要是大节点图斑。

// *Cause: There is invalid data in the SDO_ORDINATE_ARRAY field of the SDO_GEOMETRY object. The coordinates in this field do not make up avalid geometry. There may be NULL values for X or Y or both.

// *Action: Verify that the geometries have valid data.

ArcGIS:暂未实验ArcGIS是否可以正常统计;

Spatial:无法统计和分析。

Oracle spatial支持图斑最大节点数:524288。

Arcgis支持图斑最大节点数500万,主要受硬件限制。

检查方法:入库检查工具-要素最大节点数检查;

13035

弧段错误

"Invalid data (arcs in geodetic data) in the SDO_GEOMETRY object"

// *Cause: There is invalid data in the SDO_ELEM_INFO_ARRAY field of the SDO_GEOMETRY object. There are arcs in a geometry that has geodetic coordinates.

// *Action: Verify that the geometries have valid data.

ArcGIS:在外部对原始数据进行Repair后,可以进行正常统计,Repair前,无法统计,但Repair后,并不会改变弧段数据模型,仅仅是修复了由于容差原因造成的无效弧段;入库为SDO后,在ArcGIS浏览时图斑显示为正常弧段。

Spatial:即使arcgis修复无效弧段后,Spatial仍无法进行统计;且Spatial无法修复此类错误。利用GDAL获取Spatial的坐标存储时,会将弧段存储为直线。

检查方法:暂无;

13343

坐标少于4个

"a polygon geometry has fewer than four coordinates"

// *Cause: A geometry, specified as being a polygon, has fewer than four coordinates in its definition.

// *Action: A polygon must consist of at least four distinct coordinates. Correct the geometric definition, or set the appropriate SDO_GTYPE or SDO_ETYPE attribute for this geometry.

ArcGIS:类似弧段数据,修复后可以进行正常统计;

Spatial:和弧段数据一样,无法统计;且Spatial无法修复。

检查方法:入库检查工具-几何异常检查。但对另外特殊图形暂无检查方法。

13349

自相交

"polygon boundary crosses itself"

// *Cause: The boundary of a polygon intersects itself.

// *Action: Correct the geometric definition of the object.

ArcGIS:Repair前无法统计,Repair后可以进行统计;

Spatial:ArcGIS Repair前无法统计,ArcGIS Repair后可以进行统计;且Spatial可以修复此类错误。

检查方法:暂无(由于是容差原因造成,原始数据并不存在自相交错误);

13350

环粘连

"two or more rings of a complex polygon touch"

// *Cause: The inner or outer rings of a complex polygon touch.

// *Action: All rings of a complex polygon must be disjoint. Correct the geometric definition of the object.

ArcGIS:Repair前无法统计,Repair后可以进行统计;

Spatial:ArcGIS Repair前后都无法进行统计,且Spatial无法修复此类错误。

检查方法:暂无;

初始化失败

"failed to initialize spatial object"

// *Cause: This is an internal error.

// *Action: Contact Oracle Support Services.

ArcGIS:暂未没有遇到此类问题;

Spatial:Spatial可以修复此类错误;

检查方法:暂无;

13356

重复点

"adjacent points in a geometry are redundant"

// *Cause: There are repeated points in the sequence of coordinates.

// *Action: Remove the redundant point.

ArcGIS:与自相交类似,Repair前无法统计,Repair后可以进行统计;

Spatial:ArcGIS Repair前无法统计,ArcGIS Repair后可以进行统计;且Spatial可以修复此类错误。

检查方法:暂无(由容差问题造成,原始数据本身并不存在此类错误);

13366

内外环不合法

"invalid combination of interior exterior rings"

// *Cause: In an Oracle Spatial geometry, interior and exterior rings are not used consistently.

// *Action: Make sure that the interior rings corresponding to an exterior ring follow the exterior ring in the ordinate array.

ArcGIS:暂未实验;

Spatial:ArcGIS Repair前无法统计,ArcGIS Repair后可以进行统计;且Spatial无法修复此类错误。

检查方法:面自相交检查。