我在两个特征类中有两个几何,一个名为“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"
根据手册(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'隐式