Du kan gøre dette på en af to måder. Først, som du nævnte, SDO_WITHIN_DISTANCE er en gyldig tilgang.
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 dette tilfælde er afstanden i lineære enheder defineret af a's rumlige reference. Oracle behandler koordinaterne som kartesiske, så du skal sikre dig, at du har et lineært koordinatsystem, før du bruger denne operator (i modsætning til vinkel-bredde-/lang-enheder). Da du arbejder med nordlige/østlige, tror jeg, du vil være okay, så længe de punkter, du sammenligner med, er i samme rumlige reference.
Denne tilgang bruger en indre løkke til at løse forespørgslen, så den er ikke særlig effektiv, hvis du har mange point at sammenligne med. Desuden er Oracle Spatial MEGET kræsne med hensyn til rækkefølgen af operander i SDO-funktionerne, så du skal muligvis lege med parameterrækkefølgen for at finde sweetspot. Hvis din forespørgsel kører i en længere periode, så prøv at skifte den første og anden parameter for din sdo-operatør. Du kan også spille med rækkefølgen af bordene 'fra' og 'indre join' ved at bruge /*+ ORDERED */
hind efter SELECT
.
En anden fremgangsmåde er at buffere geometrien og sammenlign med bufferen.
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'
;
Husk, at hvad der er i den anden parameter i SDO_RELATE (kaldet vinduet), vil ikke have et rumligt indeks, hvis du transformerer det, som vi er her med bufferen.
Hvis du planlægger at gøre dette med flere punkter, anbefales det at bygge en tabel, hvor alle kildepunkterne er bufferet. Opret derefter et rumligt indeks mod de bufferede områder og sammenlign det med dine målpunkter.
For eksempel:
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'
;
BEMÆRK:Når du skærer punkter med polygoner, ønsker du altid, at polygonen skal være i vinduespositionen af sdo_relate (som er den anden parameter). Dette vil sikre, at dit rumlige indeks bruges korrekt.