use highest ranked geom for obs_getmeasure, simplify scoring
This commit is contained in:
@@ -360,6 +360,7 @@ DECLARE
|
||||
geom_colname TEXT;
|
||||
geom_geomref_colname TEXT;
|
||||
geom_tablename TEXT;
|
||||
geom_id TEXT;
|
||||
result NUMERIC;
|
||||
sql TEXT;
|
||||
numer_name TEXT;
|
||||
@@ -370,23 +371,6 @@ BEGIN
|
||||
|
||||
geom := ST_SnapToGrid(geom, 0.000001);
|
||||
|
||||
EXECUTE
|
||||
$query$
|
||||
SELECT numer_aggregate, numer_colname, numer_geomref_colname, numer_tablename,
|
||||
denom_colname, denom_geomref_colname, denom_tablename,
|
||||
geom_colname, geom_geomref_colname, geom_tablename, numer_name
|
||||
FROM observatory.obs_meta
|
||||
WHERE (geom_id = $1 OR ($1 = ''))
|
||||
AND numer_id = $2
|
||||
AND (numer_timespan = $3 OR ($3 = ''))
|
||||
ORDER BY geom_weight DESC, numer_timespan DESC
|
||||
LIMIT 1
|
||||
$query$
|
||||
INTO numer_aggregate, numer_colname, numer_geomref_colname, numer_tablename,
|
||||
denom_colname, denom_geomref_colname, denom_tablename,
|
||||
geom_colname, geom_geomref_colname, geom_tablename, numer_name
|
||||
USING COALESCE(boundary_id, ''), measure_id, COALESCE(time_span, '');
|
||||
|
||||
IF ST_GeometryType(geom) = 'ST_Point' THEN
|
||||
geom_type := 'point';
|
||||
ELSIF ST_GeometryType(geom) IN ('ST_Polygon', 'ST_MultiPolygon') THEN
|
||||
@@ -397,6 +381,37 @@ BEGIN
|
||||
ST_GeometryType(geom);
|
||||
END IF;
|
||||
|
||||
|
||||
EXECUTE
|
||||
$query$
|
||||
WITH meta AS (SELECT numer_aggregate, numer_colname, numer_geomref_colname, numer_tablename,
|
||||
denom_colname, denom_geomref_colname, denom_tablename,
|
||||
geom_colname, geom_geomref_colname, geom_tablename,
|
||||
numer_name, geom_id
|
||||
FROM observatory.obs_meta
|
||||
WHERE (geom_id = $1 OR ($1 = ''))
|
||||
AND numer_id = $2
|
||||
AND (numer_timespan = $3 OR ($3 = ''))),
|
||||
scores AS (SELECT *
|
||||
FROM cdb_observatory._OBS_GetGeometryScores($4,
|
||||
(SELECT Array_Agg(geom_id) FROM meta), 500))
|
||||
SELECT meta.*
|
||||
FROM meta, scores
|
||||
WHERE meta.geom_id = scores.geom_id
|
||||
ORDER BY score DESC
|
||||
LIMIT 1
|
||||
$query$
|
||||
INTO numer_aggregate, numer_colname, numer_geomref_colname, numer_tablename,
|
||||
denom_colname, denom_geomref_colname, denom_tablename,
|
||||
geom_colname, geom_geomref_colname, geom_tablename, numer_name, geom_id
|
||||
USING COALESCE(boundary_id, ''), measure_id, COALESCE(time_span, ''),
|
||||
CASE WHEN ST_GeometryType(geom) = 'ST_Point' THEN
|
||||
st_buffer(geom::geography, 10)::geometry(geometry, 4326)
|
||||
ELSE geom
|
||||
END;
|
||||
|
||||
raise notice 'Using boundary %', geom_id;
|
||||
|
||||
IF normalize ILIKE 'area' AND numer_aggregate ILIKE 'sum' THEN
|
||||
map_type := 'areaNormalized';
|
||||
ELSIF normalize ILIKE 'denominator' THEN
|
||||
|
||||
@@ -416,7 +416,8 @@ $$ LANGUAGE plpgsql;
|
||||
|
||||
CREATE OR REPLACE FUNCTION cdb_observatory._OBS_GetGeometryScores(
|
||||
bounds Geometry(Geometry, 4326) DEFAULT NULL,
|
||||
filter_geom_ids TEXT[] DEFAULT NULL
|
||||
filter_geom_ids TEXT[] DEFAULT NULL,
|
||||
desired_num_geoms INTEGER DEFAULT 3000
|
||||
) RETURNS TABLE (
|
||||
score NUMERIC,
|
||||
numtiles BIGINT,
|
||||
@@ -432,9 +433,9 @@ BEGIN
|
||||
RETURN QUERY
|
||||
EXECUTE format($string$
|
||||
SELECT
|
||||
(1 / (abs(numgeoms - 3000)
|
||||
* (1 / Coalesce(NullIf(notnull_percent, 0), 1))
|
||||
* (1 / Coalesce(NullIf(percentfill, 0), 0.0001))
|
||||
(1 / (abs(numgeoms - $3)
|
||||
--* (1 / Coalesce(NullIf(notnull_percent, 0), 1))
|
||||
--* (1 / Coalesce(NullIf(percentfill, 0), 0.0001))
|
||||
))::Numeric
|
||||
AS score, *
|
||||
FROM (
|
||||
@@ -460,7 +461,7 @@ BEGIN
|
||||
END)::Numeric AS notnull_percent
|
||||
, (CASE WHEN cdb_observatory.FIRST(notnull_pixels) > 0
|
||||
THEN (ST_SummaryStatsAgg(clipped_tile, 2, True)).sum
|
||||
ELSE COALESCE(ST_Value(cdb_observatory.FIRST(tile), 2, ST_PointOnSurface($1)), 0)
|
||||
ELSE COALESCE(ST_Value(cdb_observatory.FIRST(tile), 2, ST_PointOnSurface($1)), 0) * (ST_Area($1) / ST_Area(ST_PixelAsPolygon(cdb_observatory.FIRST(tile), 0, 0)) * cdb_observatory.FIRST(pixels))
|
||||
END)::Numeric AS numgeoms
|
||||
, (CASE WHEN cdb_observatory.FIRST(notnull_pixels) > 0
|
||||
THEN (ST_SummaryStatsAgg(clipped_tile, 3, True)).mean
|
||||
@@ -481,7 +482,7 @@ BEGIN
|
||||
GROUP BY a.column_id, a.table_id
|
||||
ORDER BY a.column_id, a.table_id
|
||||
) foo
|
||||
$string$) USING bounds, filter_geom_ids;
|
||||
$string$) USING bounds, filter_geom_ids, desired_num_geoms;
|
||||
RETURN;
|
||||
END
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
Reference in New Issue
Block a user