0

土地面積 (プロット) を測定し、GPS デバイスを使用してその 4 つのコーナーの GPS 座標を取得しました。今、私は2つの質問があります

  1. これを保存する方法はOracle Databaseです。(1点目の回答らしいですよね?
  2. 保存した後、プロットがデータベース内の別の既存のプロットと(部分的または完全に)重複しているかどうかを確認したいですか?
4

3 に答える 3

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  ;
于 2014-05-12T05:56:14.420 に答える
0

SDO_GEOM.SDO_INTERSECTION() 関数の結果に対して SDO_GEOM.SDO_AREA() を呼び出すだけです。

ただし、意味のある結果は得られません。ジオメトリは (そのように見えます) 測地 WGS84 座標 (つまり、10 進度) ですが、座標系を指定せずに読み込みます。その結果、どの面積計算でも結果が平方度で返され、無意味で使用できない結果になります。

次のように 2 つのジオメトリをロードする必要があります。

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; 

最後に、あなたのアプローチは、2 つのジオメトリだけで遊んでいるためにのみ機能します。実際のデータを処理し始めるとすぐに、クエリのパフォーマンスが非常に悪くなります。各形状と他のすべての形状との交差を計算する必要があります。10,000 個の形状のセットの場合、これは 100,000,000 回の計算を意味します (ジオメトリをそれ自体と交差させないため、実際には 99,990,000 回です)。

適切なアプローチは、空間インデックスを利用して交差する形状を検出することです。そのための適切なアプローチは、SDO_JOIN() プロシージャを使用することです。

于 2014-05-13T18:02:28.010 に答える