これは、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番目のパラメーター)のウィンドウ位置に配置する必要があります。これにより、空間インデックスが正しく使用されるようになります。