diff --git a/doc/08_interpolation.md b/doc/08_interpolation.md index 22fc1bc..c17269e 100644 --- a/doc/08_interpolation.md +++ b/doc/08_interpolation.md @@ -2,7 +2,7 @@ Function to interpolate a numeric attribute of a point in a scatter dataset of points, using one of three methos: -* [Nearest neighbor](https://en.wikipedia.org/wiki/Nearest-neighbor_interpolation) +* [Nearest neighbor(s)](https://en.wikipedia.org/wiki/Nearest-neighbor_interpolation) * [Barycentric](https://en.wikipedia.org/wiki/Barycentric_coordinate_system) * [IDW](https://en.wikipedia.org/wiki/Inverse_distance_weighting) @@ -15,7 +15,7 @@ Function to interpolate a numeric attribute of a point in a scatter dataset of p | query | text | query that returns at least `the_geom` and a numeric value as `attrib` | | point | geometry | The target point to calc the value | | method | integer | 0:nearest neighbor, 1: barycentric, 2: IDW| -| p1 | integer | IDW: limit the number of neighbors, 0->no limit| +| p1 | integer | limit the number of neighbors, IDW: 0->no limit, NN: 0-> closest one| | p2 | integer | IDW: order of distance decay, 0-> order 1| ### CDB_SpatialInterpolation (geom geometry[], values numeric[], point geometry, method integer DEFAULT 1, p1 integer DEFAULT 0, ps integer DEFAULT 0) @@ -28,7 +28,7 @@ Function to interpolate a numeric attribute of a point in a scatter dataset of p | values | numeric[] | Array of points' values for the param under study| | point | geometry | The target point to calc the value | | method | integer | 0:nearest neighbor, 1: barycentric, 2: IDW| -| p1 | integer | IDW: limit the number of neighbors, 0->no limit| +| p1 | integer | limit the number of neighbors, IDW: 0->no limit, NN: 0-> closest one| | p2 | integer | IDW: order of distance decay, 0-> order 1| ### Returns @@ -37,6 +37,9 @@ Function to interpolate a numeric attribute of a point in a scatter dataset of p |-------------|------|-------------| | value | numeric | Interpolated value at the given point, `-888.888` if the given point is out of the boundaries of the source points set | +Default values: +* -888.888: when using Barycentric, the target point is out of the realm of the input points +* -777.777: asking for a method not available #### Example Usage diff --git a/doc/19_contour.md b/doc/19_contour.md index 2e5b440..fdee52e 100644 --- a/doc/19_contour.md +++ b/doc/19_contour.md @@ -18,7 +18,7 @@ Function to generate a contour map from an scatter dataset of points, using one | method | integer | 0:nearest neighbor, 1: barycentric, 2: IDW| | classmethod | integer | 0:equals, 1: heads&tails, 2:jenks, 3:quantiles | | steps | integer | Number of steps in the classification| -| max_time | integer | Max time in milliseconds for processing time +| max_time | integer | if <= 0: max processing time in seconds (smart resolution) , if >0: resolution in meters ### Returns Returns a table object diff --git a/src/pg/sql/08_interpolation.sql b/src/pg/sql/08_interpolation.sql index 0937f09..cb0a20a 100644 --- a/src/pg/sql/08_interpolation.sql +++ b/src/pg/sql/08_interpolation.sql @@ -1,6 +1,8 @@ --- 0: nearest neighbor +-- 0: nearest neighbor(s) -- 1: barymetric -- 2: IDW +-- 3: krigin ---> TO DO + CREATE OR REPLACE FUNCTION CDB_SpatialInterpolation( IN query text, @@ -50,12 +52,19 @@ DECLARE vc numeric; output numeric; BEGIN - output := -999.999; - -- nearest + -- output := -999.999; + + -- nearest neighbors + -- p1: limit the number of neighbors, 0-> closest one IF method = 0 THEN - WITH a as (SELECT unnest(geomin) as g, unnest(colin) as v) - SELECT a.v INTO output FROM a ORDER BY point<->a.g LIMIT 1; + IF p1 = 0 THEN + p1 := 1; + END IF; + + WITH a as (SELECT unnest(geomin) as g, unnest(colin) as v), + b as (SELECT a.v as v FROM a ORDER BY point<->a.g LIMIT p1::integer) + SELECT avg(b.v) INTO output FROM b; RETURN output; -- barymetric @@ -121,6 +130,11 @@ BEGIN SELECT sum(b.f)/sum(b.k) INTO output FROM b; RETURN output; + -- krigin + ELSIF method = 3 THEN + + -- TO DO + END IF; RETURN -777.777; diff --git a/src/pg/sql/19_contour.sql b/src/pg/sql/19_contour.sql index 759b151..78f0cfd 100644 --- a/src/pg/sql/19_contour.sql +++ b/src/pg/sql/19_contour.sql @@ -17,16 +17,15 @@ RETURNS TABLE( DECLARE cell_count integer; tin geometry[]; + resolution integer; BEGIN - -- calc the cell size in web mercator units - -- WITH center as ( - -- SELECT ST_centroid(ST_Collect(geomin)) as c - -- ) - -- SELECT - -- round(resolution / cos(ST_y(c) * pi()/180)) - -- INTO cell - -- FROM center; - -- raise notice 'Resol: %', cell; + + -- nasty trick to override issue #121 + IF max_time = 0 THEN + max_time = -90; + END IF; + resolution := max_time; + max_time := -1 * resolution; -- calc the optimal number of cells for the current dataset SELECT @@ -70,9 +69,13 @@ BEGIN ), resolution as( SELECT - round(|/ ( - ST_area(geom) / cell_count - )) as cell + CASE WHEN resolution <= 0 THEN + round(|/ ( + ST_area(geom) / abs(cell_count) + )) + ELSE + resolution + END AS cell FROM envelope3857 ), grid as( diff --git a/src/pg/test/expected/08_interpolation_test.out b/src/pg/test/expected/08_interpolation_test.out index 1e4502a..e2c9287 100644 --- a/src/pg/test/expected/08_interpolation_test.out +++ b/src/pg/test/expected/08_interpolation_test.out @@ -1,7 +1,7 @@ SET client_min_messages TO WARNING; \set ECHO none - nn | nni | idw ------+--------------------------+----------------- - 200 | 238.41059602632179224595 | 341.46260750526 + nn | nni | idw +----------------------+--------------------------+----------------- + 200.0000000000000000 | 238.41059602632179224595 | 341.46260750526 (1 row) diff --git a/src/pg/test/sql/19_contour_test.sql b/src/pg/test/sql/19_contour_test.sql index 70e5cf9..9225612 100644 --- a/src/pg/test/sql/19_contour_test.sql +++ b/src/pg/test/sql/19_contour_test.sql @@ -12,6 +12,6 @@ SELECT foo.* FROM a, - cdb_crankshaft.CDB_contour(a.g, a.vals, 0.0, 1, 3, 5, 60) foo + cdb_crankshaft.CDB_contour(a.g, a.vals, 0.0, 1, 3, 5, -60) foo ) SELECT bin, avg_value from b order by bin; diff --git a/src/py/crankshaft/crankshaft/clustering/moran.py b/src/py/crankshaft/crankshaft/clustering/moran.py index 3282f5f..7a97233 100644 --- a/src/py/crankshaft/crankshaft/clustering/moran.py +++ b/src/py/crankshaft/crankshaft/clustering/moran.py @@ -30,18 +30,13 @@ def moran(subquery, attr_name, query = pu.construct_neighbor_query(w_type, qvals) - plpy.notice('** Query: %s' % query) - try: result = plpy.execute(query) # if there are no neighbors, exit if len(result) == 0: return pu.empty_zipped_array(2) - plpy.notice('** Query returned with %d rows' % len(result)) - except plpy.SPIError: - plpy.error('Error: areas of interest query failed, check input parameters') - plpy.notice('** Query failed: "%s"' % query) - plpy.notice('** Error: %s' % plpy.SPIError) + except plpy.SPIError, e: + plpy.error('Analysis failed: %s' % e) return pu.empty_zipped_array(2) ## collect attributes @@ -79,9 +74,8 @@ def moran_local(subquery, attr, # if there are no neighbors, exit if len(result) == 0: return pu.empty_zipped_array(5) - except plpy.SPIError: - plpy.error('Error: areas of interest query failed, check input parameters') - plpy.notice('** Query failed: "%s"' % query) + except plpy.SPIError, e: + plpy.error('Analysis failed: %s' % e) return pu.empty_zipped_array(5) attr_vals = pu.get_attributes(result) @@ -111,18 +105,13 @@ def moran_rate(subquery, numerator, denominator, query = pu.construct_neighbor_query(w_type, qvals) - plpy.notice('** Query: %s' % query) - try: result = plpy.execute(query) # if there are no neighbors, exit if len(result) == 0: return pu.empty_zipped_array(2) - plpy.notice('** Query returned with %d rows' % len(result)) - except plpy.SPIError: - plpy.error('Error: areas of interest query failed, check input parameters') - plpy.notice('** Query failed: "%s"' % query) - plpy.notice('** Error: %s' % plpy.SPIError) + except plpy.SPIError, e: + plpy.error('Analysis failed: %s' % e) return pu.empty_zipped_array(2) ## collect attributes @@ -160,10 +149,8 @@ def moran_local_rate(subquery, numerator, denominator, # if there are no neighbors, exit if len(result) == 0: return pu.empty_zipped_array(5) - except plpy.SPIError: - plpy.error('Error: areas of interest query failed, check input parameters') - plpy.notice('** Query failed: "%s"' % query) - plpy.notice('** Error: %s' % plpy.SPIError) + except plpy.SPIError, e: + plpy.error('Analysis failed: %s' % e) return pu.empty_zipped_array(5) ## collect attributes @@ -186,7 +173,6 @@ def moran_local_bv(subquery, attr1, attr2, """ Moran's I (local) Bivariate (untested) """ - plpy.notice('** Constructing query') qvals = OrderedDict([("id_col", id_col), ("attr1", attr1), @@ -205,7 +191,6 @@ def moran_local_bv(subquery, attr1, attr2, except plpy.SPIError: plpy.error("Error: areas of interest query failed, " \ "check input parameters") - plpy.notice('** Query failed: "%s"' % query) return pu.empty_zipped_array(4) ## collect attributes @@ -219,13 +204,9 @@ def moran_local_bv(subquery, attr1, attr2, lisa = ps.esda.moran.Moran_Local_BV(attr1_vals, attr2_vals, weight, permutations=permutations) - plpy.notice("len of Is: %d" % len(lisa.Is)) - # find clustering of significance lisa_sig = quad_position(lisa.q) - plpy.notice('** Finished calculations') - return zip(lisa.Is, lisa_sig, lisa.p_sim, weight.id_order) # Low level functions ---------------------------------------- diff --git a/src/py/crankshaft/crankshaft/space_time_dynamics/markov.py b/src/py/crankshaft/crankshaft/space_time_dynamics/markov.py index bbf524d..ae788d7 100644 --- a/src/py/crankshaft/crankshaft/space_time_dynamics/markov.py +++ b/src/py/crankshaft/crankshaft/space_time_dynamics/markov.py @@ -56,9 +56,9 @@ def spatial_markov_trend(subquery, time_cols, num_classes=7, ) if len(query_result) == 0: return zip([None], [None], [None], [None], [None]) - except plpy.SPIError, err: + except plpy.SPIError, e: plpy.debug('Query failed with exception %s: %s' % (err, pu.construct_neighbor_query(w_type, qvals))) - plpy.error('Query failed, check the input parameters') + plpy.error('Analysis failed: %s' % e) return zip([None], [None], [None], [None], [None]) ## build weight