Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Oracle Spatial - pilih objek yang berada di dalam area

Anda dapat melakukan ini salah satu dari dua cara. Pertama, seperti yang Anda sebutkan, SDO_WITHIN_DISTANCE adalah pendekatan yang valid.

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'
;

Dalam hal ini, jarak adalah dalam satuan linier yang ditentukan oleh referensi spasial a. Oracle memperlakukan koordinat sebagai Cartesian sehingga Anda perlu memastikan bahwa Anda memiliki sistem koordinat linier sebelum menggunakan operator ini (sebagai lawan dari unit lat/lon sudut). Karena Anda bekerja dengan arah utara/timur, saya pikir Anda akan baik-baik saja selama poin yang Anda bandingkan berada dalam referensi spasial yang sama.

Pendekatan ini menggunakan loop dalam untuk menyelesaikan kueri sehingga tidak terlalu efisien jika Anda memiliki banyak poin untuk dibandingkan. Juga, Oracle Spatial SANGAT pilih-pilih tentang urutan operan dalam fungsi SDO sehingga Anda mungkin perlu bermain-main dengan urutan parameter untuk menemukan sweetspot. Jika kueri Anda berjalan untuk waktu yang lama, coba alihkan parameter pertama dan kedua dari operator sdo Anda. Anda juga dapat bermain dengan urutan tabel 'from' dan 'inner join' menggunakan /*+ ORDERED */ belakang setelah SELECT .

Pendekatan lain adalah dengan menyangga geometri dan bandingkan dengan buffer.

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'
;

Ingatlah bahwa apa pun yang ada di parameter kedua SDO_RELATE (disebut jendela) tidak akan memiliki indeks spasial jika Anda mengubahnya seperti kita di sini dengan buffer.

Jika Anda berencana melakukan ini dengan beberapa titik, disarankan untuk membuat tabel di mana semua titik sumber di-buffer. Kemudian buat indeks spasial terhadap area buffer dan bandingkan dengan titik target Anda.

Misalnya:

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'
;

CATATAN:Saat memotong titik dengan poligon, Anda selalu ingin poligon berada di posisi jendela dari sdo_relate (yang merupakan parameter kedua). Ini akan memastikan indeks spasial Anda digunakan dengan benar.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana menangani pengecualian kursor ketika kueri pemilihan mengembalikan nol catatan

  2. Apakah mungkin untuk mengeluarkan pernyataan SELECT dari blok PL/SQL?

  3. PLS-00428:klausa INTO diharapkan dalam pernyataan SELECT ini

  4. Masalah koneksi oracle vb.net intermiten

  5. Menemukan Simbol Diagram Relasional Tidak Dikenal di Oracle SQL Developer