Would it not be simpler to use ST_Distance?

Unless I'm missing something, the tolerance is the minimum distance between two 
polygons, so: 

select a.id as poly_a, 
          b.id as poly_b
from mypolys a, mypolys b
where a.id != b.id
   and ST_Distance(a.geom, b.geom) <= <tolerance>;

to add some intelligence, if the tolerance is proportional to the max dim of 
a.geom, then a rule of thumb will be that tolerance is vaguely proportional to 
the sqrt(ST_area(a.geom))

so the sql becomes:
select a.id as poly_a, b.id as poly_b from mypolys a, mypolys b

  where a.id != b.id

     and ST_Distance(a.geom, b.geom) <= sqrt(ST_area(a.geom)) * <scale factor>;

A scale actor of 0.05 would roughly get you neighbouring polygons within about 
5% as you mention. This does not account for polygon shape irregularity, but 
may get you something close enough.

If you do need to take irregularity into account, a similar rough estimate can 
be derived by ST_NumPoints(ST_Simplify(a.geom,0.0)). Generally the more 
vertices that are required to define a polygon, the more complex a shape (or 
irregular) it is. The where clause tolerance can derive from this value as well 
if that would help. 

You could also

select a.id as poly_a, 

          b.id as poly_b
         
ST_Distance(a.geom,b.geom) as ab_dist
from mypolys a, mypolys b

where a.id != b.id

   and ST_Distance(a.geom, b.geom) <= <tolerance>;

so in the output you also have stored a measure of just how adjacent (far 
apart) each pair of polygons returned is.


These will not measure exactly what you are asking, but may give a result that 
is close enough.
 

This assumes you are OK with the stored multipolygons as the shapes you are 
working with, and don't need to compare the constituent polygons

HTH,

  Brent Wood



--- On Wed, 2/16/11, Stephen Woodbridge <[email protected]> wrote:

From: Stephen Woodbridge <[email protected]>
Subject: Re: [postgis-users] How to locate adjacent polygons?
To: [email protected]
Date: Wednesday, February 16, 2011, 6:12 PM

Colin,

Did you look at buffer?

Not tested but something like this might work where b.id are the 
adjacent id's to a.id with the distance of <tolerance>.

select a.id, b.id from mypolys a, mypolys b
  where a.id != b.id
    and buffer(a.geom, <tolerance>) && b.geom
    and intersects(buffer(a.geom, <tolerance>), b.geom)

-Steve

On 2/15/2011 5:38 PM, Colin wrote:
> Hi
>
> I'm quite new to postgis and spatial databases.
> competent with sql and db's
>
> My problem: How to locate adjacent polygons.
>
> I have around around 2k irregular polygons.
> They've have been calculated as alpha / concave hulls from point sets.
> They're saved into pg as multipolygons
>
> id | description | geom
>
> The polygons dont have any regularity with regard to location and
> interaction
> the majority are close to a neighbour, but not touching. Typically
> within +/- 1 - 5% of polygon max dim
> a small number slightly overlap 1 or more neighbours, usually to quite a
> small extent
> their irregular shape can include 'undercuts'
>
>
> I need to identify the adjacent neighbours for each polygon
>
> I looked at various methods that might allow me to do this but I cant
> get a 100% solution
>
> Can anyone suggest methods that might work
>
> thanks
>
>
> Colin
>

_______________________________________________
postgis-users mailing list
[email protected]
http://postgis.refractions.net/mailman/listinfo/postgis-users
_______________________________________________
postgis-users mailing list
[email protected]
http://postgis.refractions.net/mailman/listinfo/postgis-users

Reply via email to