[postgis-users] point_inside_circle(geometry,float,float,float) : units -> meters ?

Pedro Salazar pedro-b-salazar at ptinovacao.pt
Tue Apr 15 07:28:42 PDT 2003

```David,

Indeed, your suggestion is a very clever ideia your, and I would like to
try it since it's a very flexible. However, there are a few points I
would like to clarify with you.

1) I didn't find any reference to the "expand" function in postgis
0.7.4. Is a new function on postgis CVS? What it does is just a creation
of box over my geometry? (in my case, is a point, so is very simple to
do it)

2) What is the SRID for measuring the distance between geometries in
meters? I'm using the SRID 4326 (WGS84). So, to what system should I
transform my geometries to get the distance in meters?

thanks,
Pedro Salazar.

> Here's a fairly general method:
>
> 1. Find a cartesian projection thats accurate for where your data is
> (ie. UTM zone whatever)
> 2. make sure this projection is properly entered in your spatial_ref_sys
> table. Most likely its already there if you uploaded the standard epsg
> projections.
> 3. Optional (for indexing) : find a maximum conversion factor between
> your data's units and meters.  We;'ll be using this information to make
> a bounding box that's LARGER than the circle you want to enscribe
>
> SELECT * FROM table WHERE
>         the_geom && expand( <GEOMETRY>, <BOX SIZE> )
>         AND distance(transform(the_geom,<SRID>),
> transform(<GEOMETRY>,<SRID>) <  <DIST>
>
> This is a bit more general than what you're asking for, but:
>    < GEOMETRY > = point thats the centre of your circle
>    <BOX SIZE>      =  this is the step #3 conversion factor (degrees)
>     <SRID>   =  step #2's SRID in the spatial_ref_sys table
>     <DIST>  = distance (meters)
>
> This is a bit complicated, but:
>
>     the_geom && expand( <GEOMETRY>, <BOX SIZE> )
> This uses the index to quickly find points that are nearby.  Box size
> will depend on step #3.
> NB: make sure this box size is ALWAYS bigger than the distance you're
> looking for - dont
> worry if its too big.  Its in the units of your source data (ie. degrees)
>
>    distance(transform(the_geom,<SRID>), transform(<GEOMETRY>,<SRID>) <
>  <DIST>
> This calculates the distance between the centre of your circle
> ("<GEOMETRY>") and the
> data in the table.
>    transform( <geom>, <srid>)  - re-projects <geom> to the projection
> defined by <srid>
>
> The expand() expression isnt really needed, but it will significantly
> speed this process up since you'll only be doing the expensive functions
> on a small portion of the data.
>

--
PS
pedro-b-salazar at ptinovacao.pt
PGP:0E129E31D803BC61

```