sql >> データベース >  >> RDS >> Oracle

OracleSpatial-領域内にあるオブジェクトを選択します

    これは、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の後のヒンディー語 。

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

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



    1. 各行のMYSQLPHP更新データ

    2. MySQLのLIMIT句で変数を使用する

    3. MySQLで2つの自動インクリメント列を作成するにはどうすればよいですか?

    4. オブジェクトをパラメータとしてPLSQLパッケージ・プロシージャに渡すことは可能ですか?