我测量了一个土地面积(地块)并使用 GPS 设备捕获了它的 4 个角落的 GPS 坐标。现在我有两个问题
- 如何保存这个是 Oracle 数据库。(似乎是第一点的答案。是吗?)
- 保存后,我想检查是否有任何图与数据库中的另一个现有图重叠(部分或全部)?
我测量了一个土地面积(地块)并使用 GPS 设备捕获了它的 4 个角落的 GPS 坐标。现在我有两个问题
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 ;
好吧,您可以在 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() 过程。
有一种更简单的方法可以做到这一点。
您的问题似乎使用了 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;包含;覆盖; 盖子; 不相交;平等的; 里面; 上; 重叠不相交;重叠的相交;触碰;
还要关心正确的关键字:
如果您在掩码中传递 DETERMINE 关键字,该函数将返回与几何图形最匹配的一个关系关键字。
如果您在掩码中传递 ANYINTERACT 关键字,则如果两个几何图形不相交,该函数将返回 TRUE。