sql >> Databáze >  >> RDS >> Oracle

Oracle Spatial - vyberte objekty spadající do oblasti

Můžete to udělat jedním ze dvou způsobů. Za prvé, jak jste zmínil, SDO_WITHIN_DISTANCE je platný přístup.

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

V tomto případě je vzdálenost v lineárních jednotkách definovaných prostorovou referencí a. Oracle zachází se souřadnicemi jako s kartézskými, takže se před použitím tohoto operátoru budete muset ujistit, že máte lineární souřadnicový systém (na rozdíl od úhlových jednotek šířky/délky). Protože pracujete se severy/východy, myslím, že budete v pořádku, pokud body, se kterými porovnáváte, budou ve stejné prostorové referenci.

Tento přístup používá k vyřešení dotazu vnitřní smyčku, takže není příliš efektivní, pokud máte mnoho bodů, se kterými můžete porovnávat. Oracle Spatial je také VELMI vybíravý, pokud jde o pořadí operandů ve funkcích SDO, takže si možná budete muset pohrát s pořadím parametrů, abyste našli sweetspot. Pokud váš dotaz běží dlouhou dobu, zkuste přepnout první a druhý parametr vašeho operátoru sdo. Můžete také hrát s pořadím tabulek 'od' a 'vnitřní spojení' pomocí /*+ ORDERED */ zadní za SELECT .

Dalším přístupem je buffer geometrie a porovnejte s vyrovnávací pamětí.

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

Mějte na paměti, že cokoli, co je ve druhém parametru SDO_RELATE (nazývané okno), nebude mít prostorový index, pokud to transformujete, jako jsme zde s vyrovnávací pamětí.

Pokud to plánujete udělat s několika body, doporučuje se vytvořit tabulku, kde jsou všechny zdrojové body ukládány do vyrovnávací paměti. Poté vytvořte prostorový index proti oblastem ve vyrovnávací paměti a porovnejte jej s cílovými body.

Například:

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

POZNÁMKA:Při protínání bodů s polygony vždy chcete, aby byl polygon v poloze okna sdo_relate (což je druhý parametr). To zajistí správné použití vašeho prostorového indexu.



  1. MYSQL LEFT JOIN NESPRÁVNÝ VÝSLEDEK

  2. Vícenásobné databázové připojení v Rails

  3. řazení podle vysoké-nízké ceny s daty mysql

  4. Jak zjistit maximální počet pomocí mysql?