Oracle:如何检查两个多边形是否重叠

时间:2014-05-09 12:24:02

标签: oracle oracle-spatial

我测量了一块陆地区域(地块)并使用GPS设备捕获了它的4个角落的GPS坐标。 现在我有两个问题

  1. 如何保存这个是Oracle数据库。 (it seems answer of first point. is it?
  2. 保存后我想检查是否有任何情节重叠 (部分或全部)到数据库中的另一个现有情节?或

3 个答案:

答案 0 :(得分:1)

我得到了Rene和Ben非常有帮助的评论。 并基于我已经解决了我的问题..

    ---------------------------  CREATING TABLE --------------------------

create table tbl_location(
id int constraint id_pk primary key,
unit_code char(2) not null,
plot_id number(15) not null,
season_cntrl number(2),
Ryot_code varchar2(9),
share_or_perc_val number(2) not null,
plot_no varchar2(18) not null,
total_area decimal(5,5),
a1 varchar2(15),
b1 varchar2(15),
a2 varchar2(15),
b2 varchar2(15),
a3 varchar2(15),
b3 varchar2(15),
a4 varchar2(15),
b4 varchar2(15),
location sdo_geometry
);

--------------------------- CREATING SEQUENCE FOR ID ---------------------------
create sequence location_sequence
start with 1
increment by 1
nocache
nocycle;
/


--- createing a trigger for auto-incrementation of ID ------------------------------
Create or replace trigger id_increment
before insert on tbl_location
for each row
begin
select location_sequence.nextval into :new.id from dual;
end; 

位置数据

update tbl_location set location =  SDO_GEOMETRY(2003,NULL,NULL,SDO_ELEM_INFO_ARRAY(1,1003,1),SDO_ORDINATE_ARRAY( '80.16181','27.8682866666666','80.1616516666666','27.8681266666666','80.161215','27.867975','80.1613933333333','27.8685933333333','80.16181','27.8682866666666' )) where id =2;
update tbl_location set location =  SDO_GEOMETRY(2003,NULL,NULL,SDO_ELEM_INFO_ARRAY(1,1003,1),SDO_ORDINATE_ARRAY( '80.1538483333333','27.88376','80.15354','27.8841166666666','80.1529499999999','27.8834933333333','80.1532','27.8832566666666','80.1538483333333','27.88376' )) where id =3;

获得彼此相交的图(多边形)

select a.id as id1, b.id as id2,a.unit_code, a.ryot_code,a.share_or_perc_val, 
sdo_geom.sdo_intersection(a.location, b.location, 0.005) location,
a.plot_no, a.total_area  
from tbl_location a
Inner Join tbl_location b on
a.id < b.id and sdo_geom.sdo_intersection(a.location, b.location,0.005) is not null  ;

答案 1 :(得分:0)

好吧,你可以在SDO_GEOM.SDO_INTERSECTION()函数的结果上调用SDO_GEOM.SDO_AREA()。

然而,这不会给你带来有意义的结果:你的几何形状(似乎是)在大地测量WGS84坐标(即十进制度数)中,但你加载它们时没有指定任何坐标系。因此,任何面积计算都会以平方度返回结果,这是一种毫无意义且无法使用的结果。

你应该像这样加载你的两个几何:

update tbl_location set location =  SDO_GEOMETRY(2003,4326,NULL,SDO_ELEM_INFO_ARRAY(1,1003,1),SDO_ORDINATE_ARRAY( 80.16181,27.8682866666666,80.1616516666666,27.8681266666666,80.161215,27.867975,80.1613933333333,27.8685933333333,80.16181,27.8682866666666 )) where id =2;
update tbl_location set location =  SDO_GEOMETRY(2003,4326,NULL,SDO_ELEM_INFO_ARRAY(1,1003,1),SDO_ORDINATE_ARRAY( 80.1538483333333,27.88376,80.15354,27.8841166666666,80.1529499999999,27.8834933333333,80.1532,27.8832566666666,80.1538483333333,27.88376 )) where id =3; 

最后你的方法才有效,因为你只玩两个几何。一旦你开始处理真实数据,查询将表现得非常糟糕:它需要计算每个形状和所有其他形状之间的交集。对于一组10,000个形状,这意味着100,000,000个计算(实际上是99,990,000,因为您避免将几何与自身交叉)。

正确的方法是通过利用空间索引来检测相交的形状。适当的方法是使用SDO_JOIN()过程。

答案 2 :(得分:0)

有一种更简单的方法可以做到这一点。

您的问题似乎使用了SDO_GEOM.RELATE函数。 此函数返回两个或多个多边形之间的关系。

在下面的示例中,与表中其他多边形的所有关系都显示为带有1的多边形

SELECT c.id,
SDO_GEOM.RELATE(c.polygon, 'determine', c_b.polygon, 0.005) relationship 
FROM my_polygon_table c, my_polygon_talbe c_b WHERE c_b.id = 1;

结果是可能的关系之一: ANYINTERACT;包含;覆盖;盖子;脱离;等于;内;上; OVERLAPBDYDISJOINT;重叠交集;触摸;

还要注意正确的关键字:

如果在遮罩中传递DETERMINE关键字,该函数将返回与几何最匹配的一个关系关键字。

如果在mask中传递ANYINTERACT关键字,则如果两个几何不相交,则该函数返回TRUE。