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.