2010-07-27 3 views

ответ

5

Ссылка, цитируемая @Mike, не имеет кода, но хороших подсказок от Dr.JTS: "dot-density" maps ... "По сути, это связано с созданием набора из N случайно расположенных точек, которые лежат внутри данный полигон ". Функция делает это: вход является многоугольником, выводят случайные точки.

Эти ссылки имеют ту же функцию SQL/PostGIS RandomPoint(Geometry): sorokine 2011 и osgeo.org/postgis/wiki. Вторая ссылка (wiki) более полная, объясняя и демонстрируя примеры, а также функцию RandomPointsInPolygon(geometry,integer), которая является ответом на проблему.

Расширение solion для ввода «плотности точек на единицу площади», или среднее расстояние между точками:

CREATE OR REPLACE FUNCTION RandomPointsInPolygon(
    geom geometry,    -- the polygon 
    avg_dist float DEFAULT 20.0, -- average of 20 units between points 
    min_pts integer DEFAULT 1, -- min. of points 
    max_pts integer DEFAULT 1000 -- max. of points 
) RETURNS SETOF geometry AS 
$$ 
    SELECT CASE WHEN npts=1 THEN ST_Centroid($1) 
       ELSE RandomPointsInPolygon($1,npts) 
      END 
    FROM (
    SELECT CASE WHEN d<$3 THEN $3 WHEN d>$4 THEN $4 ELSE d END AS npts 
    FROM (SELECT (st_area($1)/(pi()*($2/2.0)^2))::integer AS d) AS t 
    ) AS t2; 
$$ LANGUAGE SQL; 
Смежные вопросы