Oracle
 sql >> база данни >  >> RDS >> Oracle

Oracle Spatial - изберете обекти, попадащи в зоната

Можете да направите това по един от двата начина. Първо, както споменахте, 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'
;

В този случай разстоянието е в линейни единици, определени от пространствената референция на a. Oracle третира координатите като декартови, така че ще трябва да се уверите, че имате линейна координатна система, преди да използвате този оператор (за разлика от ъгловите единици за ширина/дължина). Тъй като работите със северни/източни източни, мисля, че ще се справите, стига точките, с които сравнявате, да са в една и съща пространствена референция.

Този подход използва вътрешен цикъл за решаване на заявката, така че не е много ефективен, ако имате много точки за сравнение. Освен това Oracle Spatial е МНОГО придирчив към реда на операндите в SDO функциите, така че може да се наложи да си поиграете с реда на параметрите, за да намерите най-подходящото място. Ако вашата заявка се изпълнява дълго време, опитайте да смените първия и втория параметър на вашия sdo оператор. Можете също така да играете с реда на таблиците „от“ и „вътрешно присъединяване“, като използвате /*+ ORDERED */ hind след 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 (наречен прозорец), няма да има пространствен индекс, ако го трансформирате, както ние сме тук с буфера.

Ако планирате да направите това с няколко точки, препоръчително е да създадете таблица, в която всички изходни точки са буферирани. След това създайте пространствен индекс спрямо буферираните области и го сравнете с вашите целеви точки.

Например:

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 (който е вторият параметър). Това ще гарантира, че вашият пространствен индекс се използва правилно.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Изпълнение на SUBSTR на CLOB

  2. Достъп до съединени елементи

  3. Извличане на изображение от Oracle DB

  4. AUTONOMOUS_TRANSACTION

  5. Грешка при сравнение на PL/SQL в тригера (PLS-00405)