当前位置: 首页 > 知识库问答 >
问题:

sdo_relate给出错误的查询结果

穆俊杰
2023-03-14

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

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

“从 HY90299 t,hyboxsdo g 中选择sdo_relate(t.shape,g.shape ,'mask=ANYINTERACT') ” ,

我的预言机版本是11g

you can get the two geometry by 

1.i put the  two geometry into two shape file . you can get them from here
https://pan.baidu.com/s/1YQnwe8nstzgHOAwHgx9JGQ

2.or create the two geometry  by 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, 60.839999999999975 55.75, 60.839999999999975 26.569999999999993)))

追加

1.select * from user_sdo_geom_metadata where table_name='HY90299'

=============================

return "HY90299    SHAPE     {{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
   select sdo_geom.validate_geometry_with_context(c.shape,0.001) from hy90299 c

=============================

all return  "true"



3.select shape from hy90299

=============================

return "{2003,4326,null,{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.000000005) as spat_rel from HY90299 t

=============================

return "DISJOINT"



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,55.750,60.840,55.750,60.840, 26.570)),0.000000005) as spat_rel from HY90299 t

=============================

return "OVERLAPBDYINTERSECT"

共有1个答案

范甫
2023-03-14

根据手册(https://docs . Oracle . com/CD/b 28359 _ 01/app dev . 111/b 28400/SDO _ operat . htm # spatl 1039),空间运算符“必须始终在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 中,以过滤结果 - 例如,添加上面的代码段:

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

对于一些几何图形,你会很好。随着几何图形数量的增加,您必须使用空间索引并在WHERE子句中添加运算符,或者使用另一种方法(例如,通过属性、id等)来过滤行-空间函数不能很好地伸缩。

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

最后,但同样重要的是,您需要确保您的几何形状是有效的(同样,在适当的公差下)。

附件:
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 ;

结果是脱节的 - 也是:

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。
您的overladbdyintersect'不应该在那里——检查您的表的内容(因为您的两个查询中的差异是“窗口”几何,请仔细检查hyboxsdo表)。
2)你错了。公差是必不可少的。如果您使用sdo_geom.relate(t.shape,‘确定’,g.shape,2)-这是2米的公差-在上述查询中,您将获得TOUCH而不是DISJOINT(通过这一点,您还可以看出您的几何形状大致2m分开)。然而,使用这两种几何形状,您永远不会得到OVERLAP。
3)几何的有效性与您使用的公差直接相关。您的几何图形是有效的(8小数)——我只是说,如果您不认为它是理所当然的,它会为您节省很多头痛。永远不要假设——检查!
4)您如何将几何图形放入表中并不重要。您唯一需要考虑的(尤其是在生产环境中)是存储在数据库中的小数位数——如果您的数据在3小数的精度上很有意义,那么您最好将坐标四舍五入或截断为该值。更简单的坐标会导致更小的占用空间(数据库存储)和更快的性能。

 类似资料:
  • 问题内容: 根据Wolfram Mathematica: cos(50) = 0.6427876096865394 ; 但是这段Java代码: 给出 0.9649660284921133 。 有什么问题吗? 问题答案: 期望参数以弧度为单位。这将返回您需要的结果:

  • 我有一个简单的程序,应该打印今天的名字。它是工作的,但我做了get_query_result函数,然后它给了我一个分割错误。我看不出这里有什么错误,请帮帮我。

  • 这是我索引中的文档(也可以有几个): 从逻辑上讲,我试图建立这个条件: 我的问题(来自kibana): 我正在与上述范围内的字段的范围查询与上面的其他字段进行比较。但没有得到任何命中!我想检索具有在给定和日期。 在这个领域很缺乏经验,不知道为什么不起作用!请帮助如何修复此查询以做到这一点?

  • 问题内容: 我有一个数据库表看起来像这样 当我运行此查询时,应该不显示任何行,因为不存在具有value的行: SELECT * FROM tableName WHERE ID =‘101foo2’ 我得到的结果具有相同的ID,但没有单词 如果我的查询是如何显示具有ID的行 问题答案: 您正在混合类型。 是一个整数(或数字)。您正在将其与字符串进行比较。因此,MySQL需要确定用于比较的类型。使用什

  • 我有一个问题,就是对数据库的查询不能得到正确的结果。 在带有此查询的工作台中:

  • 如何查找查询中出现错误的字段: 通用域名格式。abc。快速的常见的db。例外UncategorizedSQLException:CallableStatementCallback;SQL[{call p_proc_(?,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,)}];[错误代码:257;SQLState:42000;消息:不允许从数据类型'VARCHAR'隐式