[postgis-users] point_inside_circle(geometry,float,float,float) : units -> meters ?
David Blasby
dblasby at refractions.net
Mon Apr 14 12:03:12 PDT 2003
Pedro Salazar wrote:
>Greetings,
>
>I would like if is it possible to use the
>point_inside_circle(geometry,float,float,float) function to obtain all
>the geometries (points) inside a circle but with a radius defined in
>meters and not in the native units?
>
There are lots of ways of doing this. There are routines for doing
distance calculations on an ellipsoid, but I think its more general to
re-project your data.
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.
If you dont want to use transform() you can use the distance-on ellipse
equations:
distance_spheroid(point, point, spheroid). There's documentation on the
postgis site (postgis.org) - but these function may not give the correct
results (their accuracy has not been tested).
Hope this makes sense,
dave
>
>
More information about the postgis-users
mailing list