2016-07-29 20 views
0

私はSDO_Geometriesを持つテーブルを持っており、すべてのジオメトリに開始点と終了点を照会して、これらの点をORAHANという別の表に挿入します。今私の主な目的は、orahanの各点について、点に2 cmのバッファを渡すときにorahanの別の点と交差するかどうかを調べる必要があります。 Relate関数とBufer関数を使用してpl SQLを書きますが、Map Infoのレコードをチェックすると、1 cm以内にポイントがありますが、ORAHANCROSSESという交差テーブルにはレコードがありません。 これらの機能を間違って使用していますか?Oracle Spatial - SDO_BUFFERは機能しません。

注:私は、Oracle Database 11gのEnterprise Editionのリリース11.2.0.1.0を使用しています - 64ビットの生産と PL/SQLリリース11.2.0.1.0 - とSDO_PACKAGE

ORAHANは約400万レコードを持っている(ポイントそして他の列。)

declare 
BEGIN 
for curs in (select * from ORAHAN t) loop 
    for curs2 in (select * 
        from ORAHAN t2 
        where SDO_RELATE(t2.geoloc,SDO_GEOM.SDO_BUFFER(curs.geoloc,0.02,0.5) , 
        'mask=ANYINTERACT') = 'TRUE' 
        and t2.mi_prinx <> curs.mi_prinx) loop      
    Insert INTO ORAHANCROSSES 
    values 
     (curs.Mip, curs.Startmi, curs2.Mip, curs2.Startmi); 
    commit; 
    end loop; 
end loop; 
END; 

、これは互いにaproximately 1センチメートルに近い3点を示しているMapInfoの地図画像です。

select * from user_sdo_geom_metadata where table_name = 'ORAHAN'; 

enter image description here

そしてDIMINFO:

0,00001000kmは1センチメートル enter image description here

Orahanメタデータに等しい:しかしorahancrossesにこれら3

ノートに一致するレコードがありません

enter image description here

答えて

1

データの座標系は?そして、最も重要なのは、許容値あなたのメタデータに何を設定しましたか?

いくつかの他のコメント:

1)は、バッファ・アプローチと関係を使用しないでください。ちょうど距離内のアプローチを使用してください。

2)あなたは、単純なCTAS使用したクエリの並べ替えのためのPL/SQLループを必要としない:2 cm以内にある点AとBの書かれた、カップルのよう

create table orahancrosses as 
select c1.mip mip_1, c1.startmi startmi_1, c2.mip mip_2, c2.startmi startmi_2 
from orahan c1, orahan c2 
where sdo_wihin_distance (c2.geoloc, c1.geoloc, 'distance=2 unit=cm') = 'TRUE' 
and c2.mi_prinx <> c1.mi_prinx; 

3) (A、B)、もう一度(B、A)として2回返されます。このように、SDO_JOIN技術を使用して、より良い実行する必要があります)

create table orahancrosses as 
select c1.mip mip_1, c1.startmi startmi_1, c2.mip mip_2, c2.startmi startmi_2 
from orahan c1, orahan c2 
where sdo_wihin_distance (c2.geoloc, c1.geoloc, 'distance=2 unit=cm') = 'TRUE' 
and c1.rowid < c2.rowid; 

3)あなたが言及するポイント数(400000+の処理:これを避ける(とのみ例1を返す)するには、このようなクエリを記述:

これはおそらく、データベースサーバーの容量に応じて処理に時間がかかります。 Oracle Enterprise Editionのライセンスで、ハードウェアに適切な容量(コア数)がある場合、並列処理によって経過時間が短縮されます。

4)Oracle 11gを使用しているとします。正確なバージョンは?バージョン11.2.0.4は11gR2の端末リリースです。古いものはサポートされなくなりました。これで実際に12cR1(12.1.0.2)にいるはずです。 12.1.0の大きなメリット。多くの空間関数と演算子を高速化するVector Performance Accelerator機能(Oracle Spatialの適切なライセンスを所有している場合のみ - 無料のOracle Locator機能では使用できません)。 2つの点を使用

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

あなたの例では。

select sdo_geom.sdo_distance(
    sdo_geometry (2001,null,sdo_point_type(521554.782174622,4230983.08336913,null),null,null), 
    sdo_geometry (2001,null,sdo_point_type(521554.782174622,4230983.07336716,null),null,null), 
    0.005 
) distance 
from dual; 


    DISTANCE 
---------- 
.01000197 

1 row selected. 

注意SRIDは指定しません。座標がメートルで表されていると仮定すると、それらの間の距離は実際には1cmを少し超えています。なぜあなた

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

理由元の構文は、SDO_BUFFER()呼び出しで指定した許容誤差のために気づいたように動作しません。 0.5(= 50cm)とし、半径0.02(2cm)のバッファーを作成します。効果は、生成されたバッファが効果的にポイント自体に溶け込むことです。許容値0.5で例えば

select sdo_geom.sdo_buffer(sdo_geometry (2001,null,sdo_point_type(521554.782174622,4230983.08336913,null),null,null),0.02,0.5) from dual; 

が生成されます

SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(521554.782, 4230983.08, NULL), NULL, NULL) 

寛容0.005で:

SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 2), SDO_ORDINATE_ARRAY(521554.782, 4230983.06, 521554.802, 4230983.08, 521554.782, 4230983.1, 521554.762, 4230983.08, 521554.782, 4230983.06)) 

select sdo_geom.sdo_buffer(sdo_geometry (2001,null,sdo_point_type(521554.782174622,4230983.08336913,null),null,null),0.02,0.005) from dual; 

あなたは適切なバッファを取得します

と非常に近い点は、今、そのバッファと一致:

select sdo_geom.relate(
    sdo_geom.sdo_buffer(sdo_geometry (2001,null,sdo_point_type(521554.782174622,4230983.08336913,null),null,null),0.02,0.005), 
    'determine', 
    sdo_geometry (2001,null,sdo_point_type(521554.782174622,4230983.07336716,null),null,null), 
    0.005 
) relation 
from dual; 

RELATION 
------------------------- 
CONTAINS 

1 row selected. 

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

あなたのデータが適切な明示的なSRIDを持っていないという事実は、測定や距離に基づく検索で明示的な単位を使用することができないことを意味します。データベースは、あなたのデータがどの座標系であるかを知らないので、2つの点がcmまたはm離れた数よりも小さいかどうかを判断する方法を知らない。座標はメートルであると仮定します。私は上記の例で与えるので

、私はいくつかのプロジェクトでのOracle 11gR2のを使用して、会社の仕事だ'DISTANCE=0.02'

+0

'DISTANCE=2 UNIT=CM'を交換してください。 Orahanには約400,000レコード(行)があります。私は自分の質問をできるだけ編集し、メタデータに許容値を追加します。 –

+0

会社が11gR2を使用し、適切なシステム管理者とDBAを持っている場合は、すでに11.2.0.4にある可能性があります。それでも、そのバージョンと処理する必要があるデータの量では、SDO_JOINのアプローチは間違いなく(私の返事に構文を追加した)方法です。 Vector Performance Accelerator機能では、12cでは異なるでしょう。 –

+0

私はSDO_JOINメソッドと言っていることを試しています、それは非常に高速です。それは2分で仕事をしています。ありがとうございました。しかし、まだ問題は残っている。いくつかのポイントの間に1cmの距離がありますが、交差点は見つかりません。私の列のdiminfoが間違っていると思います。 –

関連する問題