sql >> Databasteknik >  >> RDS >> Oracle

Oracle Spatial - välj objekt som faller inom området

Du kan göra detta på ett av två sätt. Först, som du nämnde, SDO_WITHIN_DISTANCE är ett giltigt tillvägagångssätt.

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

I det här fallet är avståndet i linjära enheter definierade av a:s rumsliga referens. Oracle behandlar koordinaterna som kartesiska så du måste se till att du har ett linjärt koordinatsystem innan du använder den här operatorn (i motsats till vinkelenheter för lat/längd). Eftersom du arbetar med nordlig/östlig riktning tror jag att du kommer att klara dig så länge som punkterna du jämför mot är i samma rumsliga referens.

Detta tillvägagångssätt använder en inner-loop för att lösa frågan, så det är inte särskilt effektivt om du har många poäng att jämföra med. Oracle Spatial är också MYCKET kräsen med ordningen på operander i SDO-funktionerna så du kan behöva leka med parameterordningen för att hitta sweetspot. Om din fråga körs under en lång period, försök att byta den första och andra parametern för din sdo-operator. Du kan också spela med ordningsföljden för "från" och "inner join"-borden med hjälp av /*+ ORDERED */ hind efter SELECT .

Ett annat tillvägagångssätt är att buffra geometrin och jämför med bufferten.

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

Tänk på att allt som finns i den andra parametern i SDO_RELATE (kallat fönstret) inte kommer att ha ett rumsligt index om du transformerar det som vi är här med bufferten.

Om du planerar att göra detta med flera punkter, rekommenderas det att bygga en tabell där alla källpunkter är buffrade. Skapa sedan ett rumsligt index mot de buffrade områdena och jämför det med dina målpunkter.

Till exempel:

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

OBS:När du skär punkter med polygoner vill du alltid att polygonen ska vara i fönsterpositionen av sdo_relate (som är den andra parametern). Detta säkerställer att ditt rumsliga index används korrekt.



  1. Fel 1148 MySQL Det använda kommandot är inte tillåtet med denna MySQL-version

  2. ORA-00913:för många värden när du använder fall när

  3. Effektivitet av kvartalsberäkning av personalstyrka

  4. Använd kolumnalias i samma val