diff --git a/pg/sql/0.0.1/03_overlap_sum.sql b/pg/sql/0.0.1/03_overlap_sum.sql index f30f694..203be39 100644 --- a/pg/sql/0.0.1/03_overlap_sum.sql +++ b/pg/sql/0.0.1/03_overlap_sum.sql @@ -1,18 +1,36 @@ -- Function by Stuart Lynn for a simple interpolation of a value -- from a polygon table over an arbitrary polygon -- (weighted by the area proportion overlapped) +-- Aereal weighting is a very simple form of aereal interpolation. +-- +-- Parameters: +-- * geom a Polygon geometry which defines the area where a value will be +-- estimated as the area-weighted sum of a given table/column +-- * target_table_name table name of the table that provides the values +-- * target_column column name of the column that provides the values +-- * schema_name optional parameter to defina the schema the target table +-- belongs to, which is necessary if its not in the search_path. +-- Note that target_table_name should never include the schema in it. +-- Return value: +-- Aereal-weighted interpolation of the column values over the geometry CREATE OR REPLACE -FUNCTION cdb_overlap_sum(geom geometry, target_table_name text, target_column text) +FUNCTION cdb_overlap_sum(geom geometry, target_table_name text, target_column text, schema_name text DEFAULT NULL) RETURNS numeric AS $$ DECLARE result numeric; + qualified_name text; BEGIN + IF schema_name IS NULL THEN + qualified_name := Format('%I', target_table_name); + ELSE + qualified_name := Format('%I.%s', schema_name, target_table_name); + END IF; EXECUTE Format(' SELECT sum(%I*ST_Area(St_Intersection($1, a.the_geom))/ST_Area(a.the_geom)) - FROM %I AS a + FROM %s AS a WHERE $1 && a.the_geom - ', target_column, target_table_name) + ', target_column, qualified_name) USING geom INTO result; RETURN result;