Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Oracle Spatial — wybierz obiekty mieszczące się w obszarze

Możesz to zrobić na dwa sposoby. Po pierwsze, jak wspomniałeś, SDO_WITHIN_DISTANCE jest prawidłowym podejściem.

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

W tym przypadku odległość jest wyrażona w jednostkach liniowych określonych przez odniesienie przestrzenne a. Oracle traktuje współrzędne jako kartezjańskie, więc przed użyciem tego operatora musisz upewnić się, że masz liniowy układ współrzędnych (w przeciwieństwie do jednostek kątowych szerokości/długości). Ponieważ pracujesz ze współrzędnymi północnymi/wschodnimi, myślę, że wszystko będzie w porządku, o ile punkty, z którymi porównujesz, znajdują się w tym samym odniesieniu przestrzennym.

To podejście wykorzystuje wewnętrzną pętlę do rozwiązania zapytania, co nie jest zbyt wydajne, jeśli masz wiele punktów do porównania. Ponadto Oracle Spatial jest BARDZO wybredna jeśli chodzi o kolejność operandów w funkcjach SDO, więc być może będziesz musiał pobawić się kolejnością parametrów, aby znaleźć sweetspot. Jeśli zapytanie działa przez długi czas, spróbuj zamienić pierwszy i drugi parametr operatora sdo. Możesz także grać z kolejnością stołów 'from' i 'inner join' używając /*+ ORDERED */ tylne po SELECT .

Innym podejściem jest buforowanie geometrii i porównaj z buforem.

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

Pamiętaj, że to, co znajduje się w drugim parametrze SDO_RELATE (nazywanym oknem), nie będzie miało indeksu przestrzennego, jeśli przekształcisz to tak, jak jesteśmy tutaj z buforem.

Jeśli planujesz zrobić to z kilkoma punktami, zaleca się zbudowanie tabeli, w której wszystkie punkty źródłowe są buforowane. Następnie utwórz indeks przestrzenny względem obszarów buforowanych i porównaj go z punktami docelowymi.

Na przykład:

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

UWAGA:przecinając punkty z wielokątami, zawsze chcesz, aby wielokąt znajdował się w pozycji w oknie sdo_relate (który jest drugim parametrem). Zapewni to prawidłowe użycie indeksu przestrzennego.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ORA-00942:tabela lub widok nie istnieje dla tabeli i kolumn mieszanych wielkości liter

  2. Nasłuchuj zmian w bazie danych Oracle w .net

  3. Co to jest operator konkatenacji ciągów w Oracle?

  4. Znalezienie zapytania od Oracle, które blokuje sesję

  5. Oracle DB Server + APEX + ORDS + JasperReports od podstaw (Część 1)