1

これはおそらく知っている人にとっては簡単です(私は願っています!)

北/東の形式のノードポイントのリストを含むジオメトリ列を含むOracle空間データベースがあります(関連する場合)。

特定のポイントの特定の半径内にあるオブジェクトを選択する必要があります。

NorthingsとEastingsは1メートル離れているため、少し簡単です。

理想的には、ノードポイントがエリアの外側にある場合でも、エリアを横切るオブジェクトを含める必要があります。

これは簡単なクエリですか?たぶんSDO_WITHIN_DISTANCEを使用していますか?

テーブルは次のようになります。

MyTable
ID NUMBER
NAME VARCHAR2(20)
DESC VARCHAR2(50)
GEOM SDO_GEOMETRY

助けてくれてありがとう!

4

2 に答える 2

1

これは、2つの方法のいずれかで実行できます。まず、おっしゃるように、SDO_WITHIN_DISTANCEは有効なアプローチです。

select 
    *
from center_point a
inner join target_points b
    on a.id = 1
    and sdo_within_distance( b.shape, a.shape, 'distance = 10' ) = 'TRUE'
;

この場合、距離はの空間参照によって定義された線形単位です。Oracleは座標をデカルト座標として扱うため、この演算子を使用する前に、線形座標系があることを確認する必要があります(角度緯度/経度単位ではありません)。北向き/東向きで作業しているので、比較しているポイントが同じ空間参照系にある限り、大丈夫だと思います。

このアプローチでは、内部ループを使用してクエリを解決するため、比較するポイントが多い場合はあまり効率的ではありません。また、Oracle Spatialは、SDO関数のオペランドの順序に非常に注意を払っているため、スイートスポットを見つけるためにパラメータの順序をいじる必要がある場合があります。クエリが長期間実行される場合は、sdo演算子の最初と2番目のパラメーターを切り替えてみてください。/*+ ORDERED */また、後の後ろを使用して、「from」テーブルと「innerjoin」テーブルの順序で遊ぶこともできますSELECT

別のアプローチは、ジオメトリをバッファリングし、バッファと比較することです。

select 
    *
from center_point a
inner join target_points b
    on a.id = 1
    and sdo_relate( b.shape, sdo_buffer(a.shape, 0.05 ), 'mask=anyinteract' ) = 'TRUE'
;

SDO_RELATEの2番目のパラメーター(ウィンドウと呼ばれる)にあるものはすべて、ここにバッファーがあるように変換した場合、空間インデックスを持たないことに注意してください。

複数のポイントでこれを行うことを計画している場合は、すべてのソースポイントがバッファリングされるテーブルを作成することをお勧めします。次に、バッファリングされた領域に対して空間インデックスを作成し、それをターゲットポイントと比較します。

例えば:

create table point_bufs unrecoverable as
select sdo_buffer (a.shape, b.diminfo, 1.35)
from centerpoint a, user_sdo_geom_metadata b
where table_name='CENTERPOINT'
  and column_name='SHAPE';

select
    a.gif,
    b.gid 
from target_points a, 
     point_bufs b
where sdo_relate(a.shape, b.shape, 'mask=anyinteract querytype=join') = 'TRUE'
;

注:ポイントをポリゴンと交差させる場合は、常にポリゴンをsdo_relate(2番目のパラメーター)のウィンドウ位置に配置する必要があります。これにより、空間インデックスが正しく使用されるようになります。

于 2012-08-14T12:37:30.167 に答える
1

適切な方法、SDO_WITHIN_DISTANCEを使用することです。これは、使用する座標系に関係なく、つまり、投影されているか測地学的であるかに関係なく当てはまります。

select b.*
from my_table a, my_table b
where a.id = 1
and sdo_within_distance( b.shape, a.shape, 'distance=10 unit=meter' ) = 'TRUE';

空間述語への引数の順序は重要です。最初の引数は検索するポイントであり、2番目の引数は「クエリウィンドウ」、つまり検索するポイントです。距離の単位(ここでは10メートル)を常に指定する必要があることに注意してください。そうしないと、デフォルトで検索するテーブルの座標系の単位になります。測地データの場合、これは常にメートルになります。投影されたデータの場合、それは座標系の単位になります-通常はメートルでもありますが、常にではありません。単位を明示的に指定すると、すべてのあいまいさが解消されます。

バッファアプローチを使用することもできますが、ここでは違いはなく、実際には低速です。空間述語の2番目の引数が索引付けされているかどうかは関係ありません。その索引は使用されません。最初の引数のインデックスのみが必要であり、使用されます。

ジオメトリのコレクションに対して操作を実行するには(つまり、ポイントのセットに対して、それぞれのセット距離内のポイントを検索し、代わりにSDO_JOIN()関数を使用して、このように、内にあるすべてのポイントのカップルを検索することを検討してください。互いに10メートル:

SELECT a.id, b.id
  FROM my_table a,
       my_table b,
       TABLE(SDO_JOIN(
             'MY_TABLE', 'SHAPE',
             'MY_TABLE', 'SHAPE',
             'DISTANCE=10 UNIT=METER')
       ) j
WHERE j.rowid1 = a.rowid
  AND j.rowid2 = a.rowid
  AND a.rowid < a.rowid;
于 2014-05-13T18:38:34.447 に答える