【问题标题】:sdo_relate giving a wrong query resultsdo_relate 给出错误的查询结果
【发布时间】:2019-08-19 16:26:43
【问题描述】:

我在两个要素类中有两个几何,一个名为“HY90299”,另一个名为“hyboxsdo”,这两个几何不相交。

但是当我在 orce 中运行空间查询时,

"select sdo_relate(t.shape,g.shape ,'mask=ANYINTERACT') from HY90299 t,hyboxsdo g",

它返回“true”,结果不正确。我做错了吗?

我的oracle版本是11g

你可以通过 1.我将这两个几何图形放入两个形状文件中。你可以从这里得到它们 https://pan.baidu.com/s/1YQnwe8nstzgHOAwHgx9JGQ 2.或者通过wkt创建两个几何 ①MULTIPOLYGON(((-16.657423019000021 82.843477248999989,16.710901260000014 66.242341995000004,74.611375808999981 57.038061142000004,111.18630027799998 67.126588820999984,-16.657423019000021 82.843477248999989))) ②MULTIPOLYGON(((60.839999999999975 26.569999999999993,143.45000000000005 26.569999999999993,143.45000000000005 55.75,55.75 60.839999999999975,60.839999999999975 26.569999999999993)))

追加

1.select * from user_sdo_geom_metadata where table_name='HY90299' ============================== 返回“HY90299 形状 {{null,-180,180,0.001},{null,-90,90,0.001}} 4326” 2.select sdo_geom.validate_geometry_with_context(c.shape,0.000000005) from hy90299 c 从 hy90299 c 中选择 sdo_geom.validate_geometry_with_context(c.shape,0.001) ============================== 全部返回“真” 3.从hy90299中选择形状 ============================== 返回 “{2003,4326,空,{1,1003,1},{111.186300278,67.126588821,-16.657423019,82.843477249,16.71090126,66.242341995,74.611375809,57.038061142,111.186300278,67.126588821}}” 4.select sdo_geom.relate(t.shape,'determine',sdo_geometry(2003,4326,null, SDO_ELEM_INFO_ARRAY(1,1003,3),SDO_ORDINATE_ARRAY(60.840,26.570,143.450,55.750)),0.0000000029 的spat_rel from吨 ============================== 返回“不相交” 5.select sdo_geom.relate(t.shape,'determine',sdo_geometry(2003,4326,null, SDO_ELEM_INFO_ARRAY(1,1003,1),SDO_ORDINATE_ARRAY(60.840,26.570, 143.450,26.570, 143.450,40,55.750,50,60.8。 60.840, 26.570)),0.000000005) 作为 HY90299 t 的 spat_rel ============================== 返回“OVERLAPBDYINTERSECT”

【问题讨论】:

    标签: oracle geospatial intersect spatial-query oracle-spatial


    【解决方案1】:

    根据手册 (https://docs.oracle.com/cd/B28359_01/appdev.111/b28400/sdo_operat.htm#SPATL1039),空间运算符“必须始终在 WHERE 子句中使用”,而不是在查询的 SELECT 部分中。

    要使用它们(如前所述,在 WHERE 子句中),它们必须被空间索引。

    如果您想查看空间关系,可以使用空间函数之一 - 例如:

    select t.*,g.*, sdo_geom.relate(t.shape,'determine',g.shape,0.000000005) as spat_rel
    from HY90299 t, hyboxsdo g
    

    如果您愿意,您也可以将函数添加到 WHERE caluse,以过滤结果 - 例如在上面的sn-p中添加:

    where sdo_geom.relate(t.shape,'determine',g.shape,0.000000005) not in ('TOUCH','DISJOINT')
    

    对于少数几何图形,你会没事的。随着几何图形数量的增加,您必须使用空间索引并在 WHERE 子句中添加运算符,或者使用其他方式过滤行(例如,通过属性、id 等) - 空间函数不能很好地扩展。

    您还有责任选择适合您的数据和查询的 TOLERANCE 值(我选择了 0.000000005,因为您的形状似乎有 8 位有效小数)。

    最后,但并非最不重要的是,您需要确保您的几何图形有效(同样,在适当的公差范围内)。

    HTH

    追加:
    1)

    with HY90299 as (
      select sdo_util.from_wktgeometry( 
      'MULTIPOLYGON (((-16.657423019000021 82.843477248999989, 16.710901260000014 66.242341995000004, 74.611375808999981 57.038061142000004, 111.18630027799998 67.126588820999984, -16.657423019000021 82.843477248999989)))'
      ) shape from dual ), 
    HYBOXSDO as (
      select sdo_util.from_wktgeometry( 
      'MULTIPOLYGON (((60.839999999999975 26.569999999999993, 143.45000000000005 26.569999999999993, 143.45000000000005 55.75, 60.839999999999975 55.75, 60.839999999999975 26.569999999999993)))'
      ) shape  from dual )
    select sdo_geom.relate(t.shape,'determine',g.shape,0.000000005)
    from HY90299 t,hyboxsdo g ;
    

    结果是 DISJOINT - 也是:

    with HY90299 as (
    select sdo_geometry(2003,4326,null, SDO_ELEM_INFO_ARRAY(1,1003,1),SDO_ORDINATE_ARRAY(-16.657423019000021, 82.843477248999989, 16.710901260000014, 66.242341995000004, 74.611375808999981, 57.038061142000004, 111.18630027799998, 67.126588820999984, -16.657423019000021, 82.843477248999989))
     shape from dual )
    select sdo_geom.relate(t.shape,'determine',
    sdo_geometry(2003,4326,null, SDO_ELEM_INFO_ARRAY(1,1003,3),SDO_ORDINATE_ARRAY(60.840,26.570,143.450,55.750))
    ,0.000000005) as spat_rel from HY90299 t
    

    结果又是 DISJOINT。
    您的 'overlapbdyintersect' 不应该存在 - 检查表的内容(因为您的两个查询中的差异是 'window' 几何形状,请仔细检查 hyboxsdo 表)。
    2)你错了。宽容必不可少的。如果您在上述查询中使用sdo_geom.relate(t.shape,'determine',g.shape,2)(即 2 米的容差),您将得到 TOUCH 而不是 DISJOINT(由此,您还可以看出您的几何形状相距大约 2m)。但是,使用这两种几何形状,您永远不会得到 OVERLAP。
    3)几何的有效性与您使用的公差直接相关。您的几何形状有效的(8 位小数)- 我只是说如果您不认为它是理所当然的,它将为您省去很多麻烦。永远不要假设 - 检查!
    4) 如何 将几何图形放在表格中并不重要。您可能要考虑的唯一想法(尤其是在生产环境中)是存储在数据库中的小数位数 - 如果您的数据以 3 位小数的精度有意义,那么您会最好将坐标四舍五入或截断。更简单的坐标导致更小的占用空间(数据库存储)和更快的性能。

    【讨论】:

    • 感谢您的回答! 1.我试过查询 "select t.*,g.*, sdo_geom.relate(t.shape,'determine',g.shape,0.000000005) as spat_rel from HY90299 t, hyboxsdo g" ,它仍然返回overlapbyintersect 2。一个几何体的 minY 为 57.038,另一个几何体的 maxY 为 55.750 我不认为 TOLERANCE 是导致结果 3 的原因。这两个几何体是非常简单的几何体,只有四个点。它们应该是有效的
    • 4.创建要素类,通过arcgis导入要素,对空间查询有影响吗? 5.我以其他方式运行查询“ select t.*, sdo_geom.relate(t.shape,'determine',sdo_geometry(2003,4326,null, SDO_ELEM_INFO_ARRAY(1,1003,3),SDO_ORDINATE_ARRAY(60.840,26.570, 143.450,55.750)),0.000000005) as spat_rel from HY90299 t" ,它返回正确的结果-不相交。 hyboxsdo 中的几何图形具有左下角 (60.840,26.570) 和右上角 (143.450,55.750) 查询在某种程度上是相同的,通过给出不同的结果。我不明白为什么
    • 希望得到您的回复,并为我糟糕的英语感到抱歉
    • 请参阅我的回答中的 APEND。
    • 另见我的附录。
       
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-13
    相关资源
    最近更新 更多