Ссылка, на которую ссылается @Mike, не имеет кода, но дает хорошие подсказки от Dr.JTS: карты с "точечной плотностью" ... "По сути, это включает в себя создание набора из N случайно расположенных точек, которые лежат в пределах данного многоугольника».Функция делает это: на входе есть многоугольник, на выходе - случайные точки.
Эти ссылки имеют одинаковую функцию SQL / PostGIS RandomPoint(Geometry)
: sorokine 2011 и osgeo.орг / PostGIS / вики .Вторая ссылка (вики) является более полной, объясняющей и показывающей примеры, а также функцию 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;