From 1f3b74e54f172169940c0b2e38ca5523772b313a Mon Sep 17 00:00:00 2001 From: Stuart Lynn Date: Wed, 30 Nov 2016 22:34:46 +0000 Subject: [PATCH] dot density fixes for geom's with holes and equal area --- src/pg/sql/30_dot_density.sql | 15 +++++++++------ src/pg/test/expected/04_dot_density_test.out | 16 ---------------- src/pg/test/sql/04_dot_density_test.sql | 12 ------------ 3 files changed, 9 insertions(+), 34 deletions(-) diff --git a/src/pg/sql/30_dot_density.sql b/src/pg/sql/30_dot_density.sql index dae4ff1..8b7f81b 100644 --- a/src/pg/sql/30_dot_density.sql +++ b/src/pg/sql/30_dot_density.sql @@ -16,6 +16,7 @@ CREATE OR REPLACE FUNCTION CDB_DotDensity(g geometry, no_points integer, max_ite AS $$ DECLARE extent GEOMETRY; + eq_area_geom GEOMETRY; test_point Geometry; width NUMERIC; height NUMERIC; @@ -25,8 +26,8 @@ AS $$ sample_points GEOMETRY[]; points GEOMETRY[]; BEGIN - - extent := ST_Envelope(g); + eq_area_geom := ST_TRANSFORM(g,2163); + extent := ST_Envelope(eq_area_geom); max_iter := 0; width := ST_XMax(extent) - ST_XMIN(extent); height := ST_YMax(extent) - ST_YMIN(extent); @@ -38,16 +39,17 @@ AS $$ IF(no_left<=0 or max_iter=1000) THEN RETURN; END IF; + - with random_points as( - SELECT CDB_LATLNG(y0 + height*random(), x0 + width*random()) as p + with random_points as( + SELECT ST_SetSRID(ST_MAKEPOINT( x0 + width*random(),y0 + height*random()), 2163) as p FROM generate_series(1,no_left) ) SELECT array_agg(p) from random_points - WHERE ST_WITHIN(p, g) + WHERE ST_WITHIN(p, eq_area_geom) into sample_points; - RETURN QUERY select * from unnest(sample_points); + RETURN QUERY select ST_TRANSFORM(a,4236) from unnest(sample_points) as a; IF sample_points IS NOT null THEN no_left = no_left - array_length(sample_points,1); @@ -168,6 +170,7 @@ CREATE OR REPLACE FUNCTION CDB_DasymetricDotDensity(geom GEOMETRY, no_points NUM RETURNS setof GEOMETRY AS $$ BEGIN + RAISE NOTICE 'running Dasymetric'; RETURN QUERY SELECT cdb_crankshaft._CDB_WeightedDD(no_points, array_agg( ST_INTERSECTION(geom,g)), array_agg(ST_AREA(ST_INTERSECTION(geom,g))*w)::NUMERIC[]) FROM unnest(targetGeoms) as g , unnest(weights) as w diff --git a/src/pg/test/expected/04_dot_density_test.out b/src/pg/test/expected/04_dot_density_test.out index 6685595..e69de29 100644 --- a/src/pg/test/expected/04_dot_density_test.out +++ b/src/pg/test/expected/04_dot_density_test.out @@ -1,16 +0,0 @@ -WITH g AS ( - SELECT ST_Buffer(ST_SetSRID(ST_MakePoint(0,0),4326)::geometry, 1000)::geometry AS g -), -points AS( - SELECT ( - ST_Dump( - cdb_crankshaft.cdb_dot_density(g.g, 100) - ) - ).geom AS p FROM g -) -SELECT count(*), sum(CASE WHEN ST_Contains(g,p) THEN 1 ELSE 0 END) FROM points, g - count | sum --------+----- - 100 | 100 -(1 row) - diff --git a/src/pg/test/sql/04_dot_density_test.sql b/src/pg/test/sql/04_dot_density_test.sql index 4811617..e69de29 100644 --- a/src/pg/test/sql/04_dot_density_test.sql +++ b/src/pg/test/sql/04_dot_density_test.sql @@ -1,12 +0,0 @@ -WITH g AS ( - SELECT ST_Buffer(ST_SetSRID(ST_MakePoint(0,0),4326)::geometry, 1000)::geometry AS g -), -points AS( - SELECT ( - ST_Dump( - cdb_crankshaft.cdb_dot_density(g.g, 100) - ) - ).geom AS p FROM g -) - -SELECT count(*), sum(CASE WHEN ST_Contains(g,p) THEN 1 ELSE 0 END) FROM points, g