Hi,

We use an application much like this for generating random sample points for 
2-phase random stratified trawl biomass surveys. Specify polygon name, number 
of points, minimum distance from the boundary, minimum distance between points 
in a file, then iterate through the file.

The code has a limit on the number of iterations per stratum to try before 
deciding that we can't actually fit that many points in it with the current 
parameters.

Strata can be polygons or multipolygons, with or without holes.

If anyone is really interested, a paper describing the approach for such survey 
design & analysis is at:

http://www.royalsociety.org.nz/Site/publish/Journals/nzjmfr/1984/8.aspx

This simply makes the assumption that the distribution of sample sites is 
random. 

The application we use is in C++, but I wrote a PostGIS version a few years ago 
as a bash script to demonstrate the functionality from within a db. 

One of the issues we ran into was running repeated iterations then looking at 
the distribution of the points across iterations to check that there was 
genuinely no pattern. Generally most random functions we tested were not truly 
random, there was a trend for coordinates to lie towards the top right or 
bottom left, as random values tended to be < or > 0.5. Not that noticeable with 
a single iteration but statistically present. We wrote our own random() 
function in the program to get around such artifacts.


Cheers,

  Brent Wood


--- On Fri, 5/7/10, Martin Davis <mbda...@refractions.net> wrote:

> From: Martin Davis <mbda...@refractions.net>
> Subject: Re: [postgis-users] Dot Density idea
> To: "PostGIS Users Discussion" <postgis-users@postgis.refractions.net>
> Date: Friday, May 7, 2010, 5:50 AM
> Did your algorithm work with
> irregular polgon extents?
> 
> Jan Hartmann wrote:
> > I did this long ago. Regular points won't work, you'll
> get all kinds of moire patterns. I just computed random x
> and y values from the origin of the grid cell within the x-
> and y grid-size. Can't remember having any problems with
> overlapping points.
> > 
> > Jan
> > 
> > On 05/06/10 19:35, Paul Ramsey wrote:
> >> Even-yet-random :) nice requirement. How about
> just starting with a
> >> regular grid and then perturbing the elements
> randomly with a radius
> >> of a cell size? You can use the area of the
> polygon and number of
> >> needed points to calculate the appropriate cell
> size and go from
> >> there.
> >> 
> >> P
> >> 
> >> On Thu, May 6, 2010 at 10:28 AM, Martin
> Davis<mbda...@refractions.net> 
> wrote:
> >>   
> >>> Good point about the need for even
> distribution of the points. That seems
> >>> like a whole lot harder to code than simply
> randomly placing points in a
> >>> polygon.  Does anyone have any pointers
> to algorithms for producing this
> >>> effect?
> >>> 
> >>> George Silva wrote:
> >>>     
> >>>> The really big problem with dot density is
> that dots can overlap
> >>>> themselves,
> >>>> masking the real number, so if anything
> will be developed in this area,
> >>>> the
> >>>> points should be
> >>>> 
> >>>> A) evenly distributed
> >>>> or
> >>>> B) randomly distributed, but with some
> sort of "colision" tests, so there
> >>>> is
> >>>> no or little overlap.
> >>>> 
> >>>> This is a interesting idea, especially if
> we could make a materialized
> >>>> view
> >>>> with those points, which could be added to
> GIS software for presentation.
> >>>> 
> >>>> George
> >>>> 
> >>>> On Thu, May 6, 2010 at 1:53 PM, Sufficool,
> Stanley<
> >>>> ssuffic...@rov.sbcounty.gov> 
> wrote:
> >>>> 
> >>>> 
> >>>>       
> >>>>> Looks nasty, but it might work:
> >>>>> 
> >>>>> select
> >>>>> st_line_interpolate_point(
> >>>>>       
> st_intersection(
> >>>>>         
>       the_geom,
> >>>>>         
>       st_makeline(
> >>>>>         
>              
> st_pointn(st_exteriorring(the_geom), (rand1.rand *
> >>>>>
> st_npoints(st_exteriorring(the_geom)))::int),
> >>>>>         
>              
> st_pointn(st_exteriorring(the_geom), (rand2.rand *
> >>>>>
> st_npoints(st_exteriorring(the_geom)))::int)
> >>>>>         
>       )
> >>>>>        )
> >>>>>       
> ,rand3.rand
> >>>>> )
> >>>>> from insert_your_table_name_here,
> >>>>> (select random() as rand,
> generate_series(1,1000) as point_number) as
> >>>>> rand1
> >>>>> JOIN (select random() as rand,
> generate_series(1,1000) as point_number)
> >>>>> as
> >>>>> rand2
> >>>>>        ON
> rand1.point_number = rand2.point_number
> >>>>> JOIN (select random() as rand,
> generate_series(1,1000) as point_number)
> >>>>> as
> >>>>> rand3
> >>>>>        ON
> rand2.point_number = rand3.point_number
> >>>>> WHERE st_geometrytype(
> >>>>>       
> st_intersection(
> >>>>>         
>       the_geom,
> >>>>>         
>       st_makeline(
> >>>>>         
>              
> st_pointn(st_exteriorring(the_geom), (rand1.rand *
> >>>>>
> st_npoints(st_exteriorring(the_geom)))::int),
> >>>>>         
>              
> st_pointn(st_exteriorring(the_geom), (rand2.rand *
> >>>>>
> st_npoints(st_exteriorring(the_geom)))::int)
> >>>>>         
>       )
> >>>>>        )
> >>>>> ) = 'ST_LineString'
> >>>>> AND oid = 5030 /* Enter your own OID
> here */
> >>>>> limit 100
> >>>>> 
> >>>>> 
> >>>>> 
> >>>>> 
> >>>>>     
>    
> >>>>>> -----Original Message-----
> >>>>>> From: postgis-users-boun...@postgis.refractions.net
> >>>>>> [mailto:postgis-users-boun...@postgis.refractions.net]
> On
> >>>>>> Behalf Of Martin Davis
> >>>>>> Sent: Thursday, May 06, 2010 8:56
> AM
> >>>>>> To: John Abraham; postgis-users@postgis.refractions.net;
> Martin Davis
> >>>>>> Subject: Re: [postgis-users] Dot
> Density idea
> >>>>>> 
> >>>>>> 
> >>>>>> I was thinking the same thing!
> >>>>>> 
> >>>>>> strk wrote:
> >>>>>> 
> >>>>>>       
>    
> >>>>>>>
> ST_RandomPoinsOnSurface(geometry, numpoints) would be an
> interesting
> >>>>>>> function indeed. Sounds like a
> good job for GEOS/JTS.
> >>>>>>> 
> >>>>>>> --strk;
> >>>>>>> 
> >>>>>>> On Mon, May 03, 2010 at
> 10:49:32PM -0600, John Abraham wrote:
> >>>>>>> 
> >>>>>>> 
> >>>>>>>       
>      
> >>>>>>>> One of the things I miss
> about using ESRI's GIS is the
> >>>>>>>> 
> >>>>>>>>       
>         
> >>>>>> ability to do
> >>>>>> 
> >>>>>>       
>    
> >>>>>>>> dot-density maps. 
> Within a polygon, the number of dots is
> >>>>>>>> 
> >>>>>>>>       
>         
> >>>>>> proportional to a value, and the
> dots are randomly placed.  I
> >>>>>> find it useful to be able to
> present several data values at
> >>>>>> once (e.g. blue dots for
> population, red dots for employment).
> >>>>>> 
> >>>>>>       
>    
> >>>>>>>> I also find that it is a
> more intuitive way of scaling for
> >>>>>>>> 
> >>>>>>>>       
>         
> >>>>>> zone size
> >>>>>> 
> >>>>>>       
>    
> >>>>>>>> than dividing the value by
> the area of the zone.  That is,
> >>>>>>>> 
> >>>>>>>>       
>         
> >>>>>> the count
> >>>>>> 
> >>>>>>       
>    
> >>>>>>>> of the dots represents the
> actual number, but the density
> >>>>>>>> 
> >>>>>>>>       
>         
> >>>>>> of the dots
> >>>>>> 
> >>>>>>       
>    
> >>>>>>>> represents the density of
> the number.  So I don't have to decide
> >>>>>>>> whether to divide the
> value by the area of the polygon to plot
> >>>>>>>> density: both the absolute
> number and the density are
> >>>>>>>> 
> >>>>>>>>       
>         
> >>>>>> easily visible.
> >>>>>> 
> >>>>>>       
>    
> >>>>>>>> Since my open-source GIS
> viewing systems (mostly QGIS and
> >>>>>>>> 
> >>>>>>>>       
>         
> >>>>>> Mapserver)
> >>>>>> 
> >>>>>>       
>    
> >>>>>>>> won't plot dot-density,
> I've done without.
> >>>>>>>> 
> >>>>>>>> But today I realized that
> I can build these on the server
> >>>>>>>> 
> >>>>>>>>       
>         
> >>>>>> instead.  I
> >>>>>> 
> >>>>>>       
>    
> >>>>>>>> can generate random points
> within the bounding-box of the polygon,
> >>>>>>>> throwing out those that
> aren't contained within the polygon,
> >>>>>>>> repeating until I have
> enough.  Then I can save these points as a
> >>>>>>>> separate layer, and
> display this layer using almost any desktop or
> >>>>>>>> web based viewer!
> >>>>>>>> 
> >>>>>>>> Has anyone done
> this?  Can I do it in SQL or do I need to write
> >>>>>>>> something in PL/pgsql?
> >>>>>>>> 
> >>>>>>>> -- John Abraham
> >>>>>>>> 
> >>>>>>>> PS I just bought the
> Postgis In Action book; enjoying it so far.
> >>>>>>>>
> _______________________________________________
> >>>>>>>> postgis-users mailing list
> postgis-users@postgis.refractions.net
> >>>>>>>> http://postgis.refractions.net/mailman/listinfo/postgis-users
> >>>>>>>> 
> >>>>>>>> 
> >>>>>>>>       
>         
> >>>>>>> 
> >>>>>>>       
>       
> >>>>>> -- Martin Davis
> >>>>>> Senior Technical Architect
> >>>>>> Refractions Research, Inc.
> >>>>>> (250) 383-3022
> >>>>>> 
> >>>>>>
> _______________________________________________
> >>>>>> postgis-users mailing list
> >>>>>> postgis-users@postgis.refractions.net
> >>>>>> http://postgis.refractions.net/mailman/listinfo/postgis-users
> >>>>>> 
> >>>>>> 
> >>>>>>         
>   
> >>>>>
> _______________________________________________
> >>>>> postgis-users mailing list
> >>>>> postgis-users@postgis.refractions.net
> >>>>> http://postgis.refractions.net/mailman/listinfo/postgis-users
> >>>>> 
> >>>>> 
> >>>>>          
> >>>> 
> >>>> 
> >>>>   ------------------------------------------------------------------------
> 
> >>>> 
> >>>>
> _______________________________________________
> >>>> postgis-users mailing list
> >>>> postgis-users@postgis.refractions.net
> >>>> http://postgis.refractions.net/mailman/listinfo/postgis-users
> >>>> 
> >>>>        
> >>> -- Martin Davis
> >>> Senior Technical Architect
> >>> Refractions Research, Inc.
> >>> (250) 383-3022
> >>> 
> >>>
> _______________________________________________
> >>> postgis-users mailing list
> >>> postgis-users@postgis.refractions.net
> >>> http://postgis.refractions.net/mailman/listinfo/postgis-users
> >>> 
> >>>      
> >> _______________________________________________
> >> postgis-users mailing list
> >> postgis-users@postgis.refractions.net
> >> http://postgis.refractions.net/mailman/listinfo/postgis-users
> >>    
> > _______________________________________________
> > postgis-users mailing list
> > postgis-users@postgis.refractions.net
> > http://postgis.refractions.net/mailman/listinfo/postgis-users
> > 
> 
> -- Martin Davis
> Senior Technical Architect
> Refractions Research, Inc.
> (250) 383-3022
> 
> _______________________________________________
> postgis-users mailing list
> postgis-users@postgis.refractions.net
> http://postgis.refractions.net/mailman/listinfo/postgis-users
> 
_______________________________________________
postgis-users mailing list
postgis-users@postgis.refractions.net
http://postgis.refractions.net/mailman/listinfo/postgis-users

Reply via email to