Merge pull request #90 from CartoDB/add-densify-tinmaps
Add densify / tinmaps functions [14] [15]
This commit is contained in:
67
src/pg/sql/14_densify.sql
Normal file
67
src/pg/sql/14_densify.sql
Normal file
@@ -0,0 +1,67 @@
|
||||
--
|
||||
-- Iterative densification of a set of points using Delaunay triangulation
|
||||
-- the new points have as assigned value the average value of the 3 vertex (centroid)
|
||||
--
|
||||
-- @param geomin - array of geometries (points)
|
||||
--
|
||||
-- @param colin - array of numeric values in that points
|
||||
--
|
||||
-- @param iterations - integer, number of iterations
|
||||
--
|
||||
--
|
||||
-- Returns: TABLE(geomout geometry, colout numeric)
|
||||
--
|
||||
--
|
||||
CREATE OR REPLACE FUNCTION CDB_Densify(
|
||||
IN geomin geometry[],
|
||||
IN colin numeric[],
|
||||
IN iterations integer
|
||||
)
|
||||
RETURNS TABLE(geomout geometry, colout numeric) AS $$
|
||||
DECLARE
|
||||
geotemp geometry[];
|
||||
coltemp numeric[];
|
||||
i integer;
|
||||
gs geometry[];
|
||||
g geometry;
|
||||
vertex geometry[];
|
||||
va numeric;
|
||||
vb numeric;
|
||||
vc numeric;
|
||||
center geometry;
|
||||
centerval numeric;
|
||||
tmp integer;
|
||||
BEGIN
|
||||
geotemp := geomin;
|
||||
coltemp := colin;
|
||||
FOR i IN 1..iterations
|
||||
LOOP
|
||||
-- generate TIN
|
||||
WITH a as (SELECT unnest(geotemp) AS e),
|
||||
b as (SELECT ST_DelaunayTriangles(ST_Collect(a.e),0.001, 0) AS t FROM a),
|
||||
c as (SELECT (ST_Dump(t)).geom AS v FROM b)
|
||||
SELECT array_agg(v) INTO gs FROM c;
|
||||
-- loop cells
|
||||
FOREACH g IN ARRAY gs
|
||||
LOOP
|
||||
-- append centroid
|
||||
SELECT ST_Centroid(g) INTO center;
|
||||
geotemp := array_append(geotemp, center);
|
||||
-- retrieve the value of each vertex
|
||||
WITH a AS (SELECT (ST_DumpPoints(g)).geom AS v)
|
||||
SELECT array_agg(v) INTO vertex FROM a;
|
||||
WITH a AS(SELECT unnest(geotemp) as geo, unnest(coltemp) as c)
|
||||
SELECT c INTO va FROM a WHERE ST_Equals(geo, vertex[1]);
|
||||
WITH a AS(SELECT unnest(geotemp) as geo, unnest(coltemp) as c)
|
||||
SELECT c INTO vb FROM a WHERE ST_Equals(geo, vertex[2]);
|
||||
WITH a AS(SELECT unnest(geotemp) as geo, unnest(coltemp) as c)
|
||||
SELECT c INTO vc FROM a WHERE ST_Equals(geo, vertex[3]);
|
||||
-- calc the value at the center
|
||||
centerval := (va + vb + vc) / 3;
|
||||
-- append the value
|
||||
coltemp := array_append(coltemp, centerval);
|
||||
END LOOP;
|
||||
END LOOP;
|
||||
RETURN QUERY SELECT unnest(geotemp ) as geomout, unnest(coltemp ) as colout;
|
||||
END;
|
||||
$$ language plpgsql IMMUTABLE;
|
||||
43
src/pg/sql/15_tinmap.sql
Normal file
43
src/pg/sql/15_tinmap.sql
Normal file
@@ -0,0 +1,43 @@
|
||||
CREATE OR REPLACE FUNCTION CDB_TINmap(
|
||||
IN geomin geometry[],
|
||||
IN colin numeric[],
|
||||
IN iterations integer
|
||||
)
|
||||
RETURNS TABLE(geomout geometry, colout numeric) AS $$
|
||||
DECLARE
|
||||
p geometry[];
|
||||
vals numeric[];
|
||||
gs geometry[];
|
||||
g geometry;
|
||||
vertex geometry[];
|
||||
centerval numeric;
|
||||
va numeric;
|
||||
vb numeric;
|
||||
vc numeric;
|
||||
coltemp numeric[];
|
||||
BEGIN
|
||||
SELECT array_agg(dens.geomout), array_agg(dens.colout) INTO p, vals FROM cdb_crankshaft.CDB_Densify(geomin, colin, iterations) dens;
|
||||
WITH a as (SELECT unnest(p) AS e),
|
||||
b as (SELECT ST_DelaunayTriangles(ST_Collect(a.e),0.001, 0) AS t FROM a),
|
||||
c as (SELECT (ST_Dump(t)).geom AS v FROM b)
|
||||
SELECT array_agg(v) INTO gs FROM c;
|
||||
FOREACH g IN ARRAY gs
|
||||
LOOP
|
||||
-- retrieve the vertex of each triangle
|
||||
WITH a AS (SELECT (ST_DumpPoints(g)).geom AS v)
|
||||
SELECT array_agg(v) INTO vertex FROM a;
|
||||
-- retrieve the value of each vertex
|
||||
WITH a AS(SELECT unnest(p) as geo, unnest(vals) as c)
|
||||
SELECT c INTO va FROM a WHERE ST_Equals(geo, vertex[1]);
|
||||
WITH a AS(SELECT unnest(p) as geo, unnest(vals) as c)
|
||||
SELECT c INTO vb FROM a WHERE ST_Equals(geo, vertex[2]);
|
||||
WITH a AS(SELECT unnest(p) as geo, unnest(vals) as c)
|
||||
SELECT c INTO vc FROM a WHERE ST_Equals(geo, vertex[3]);
|
||||
-- calc the value at the center
|
||||
centerval := (va + vb + vc) / 3;
|
||||
-- append the value
|
||||
coltemp := array_append(coltemp, centerval);
|
||||
END LOOP;
|
||||
RETURN QUERY SELECT unnest(gs) as geomout, unnest(coltemp ) as colout;
|
||||
END;
|
||||
$$ language plpgsql IMMUTABLE;
|
||||
Reference in New Issue
Block a user