add PIA, first commit
This commit is contained in:
parent
e84dc30b77
commit
cb3a49594d
@ -1,35 +0,0 @@
|
|||||||
## Spacial interpolation
|
|
||||||
|
|
||||||
Function to construct the [Voronoi Diagram](https://en.wikipedia.org/wiki/Voronoi_diagram) from a dataset of scatter points, clipped to the significant area
|
|
||||||
|
|
||||||
PostGIS wil include this in future versions ([doc for dev branch](http://postgis.net/docs/manual-dev/ST_Voronoi.html)) and will perform faster for sure, but in the meantime...
|
|
||||||
|
|
||||||
|
|
||||||
### CDB_Voronoi (geom geometry[], buffer numeric DEFAULT 0.5, tolerance numeric DEFAULT 1e-9)
|
|
||||||
|
|
||||||
#### Arguments
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
|------|------|-------------|
|
|
||||||
| geom | geometry[] | Array of points's geometries |
|
|
||||||
| buffer | numeric | enlargment ratio for the envelope area used for the restraints|
|
|
||||||
| tolerance | geometry | The target point to calc the value |
|
|
||||||
|
|
||||||
### Returns
|
|
||||||
|
|
||||||
| Column Name | Type | Description |
|
|
||||||
|-------------|------|-------------|
|
|
||||||
| geom | geometry collection | Collection of polygons of the Voronoi cells|
|
|
||||||
|
|
||||||
|
|
||||||
#### Example Usage
|
|
||||||
|
|
||||||
```sql
|
|
||||||
WITH a AS (
|
|
||||||
SELECT
|
|
||||||
ARRAY[ST_GeomFromText('POINT(2.1744 41.403)'),ST_GeomFromText('POINT(2.1228 41.380)'),ST_GeomFromText('POINT(2.1511 41.374)'),ST_GeomFromText('POINT(2.1528 41.413)'),ST_GeomFromText('POINT(2.165 41.391)'),ST_GeomFromText('POINT(2.1498 41.371)'),ST_GeomFromText('POINT(2.1533 41.368)'),ST_GeomFromText('POINT(2.131386 41.41399)')] AS geomin
|
|
||||||
)
|
|
||||||
SELECT
|
|
||||||
CDB_voronoi(geomin, 0.2, 1e-9) as result
|
|
||||||
FROM a;
|
|
||||||
```
|
|
30
doc/13_PIA.md
Normal file
30
doc/13_PIA.md
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
## Pole of inaccessibility (PIA)
|
||||||
|
|
||||||
|
Function to find the [PIA](https://en.wikipedia.org/wiki/Pole_of_inaccessibility) from a given polygon and tolerance, following the quadtree approach by [Vladimir Agafonkin](https://github.com/mourner) described [here](https://github.com/mapbox/polylabel)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### CDB_PIA (polygon geometry, tolerance numeric DEFAULT 1.0)
|
||||||
|
|
||||||
|
#### Arguments
|
||||||
|
|
||||||
|
| Name | Type | Description |
|
||||||
|
|------|------|-------------|
|
||||||
|
| polygon | geometry | Target polygon |
|
||||||
|
| tolerance | numeric | Threshold to decide to take a cell into account |
|
||||||
|
|
||||||
|
### Returns
|
||||||
|
|
||||||
|
| Column Name | Type | Description |
|
||||||
|
|-------------|------|-------------|
|
||||||
|
| point | geometry| Pole of inaccessibility |
|
||||||
|
|
||||||
|
|
||||||
|
#### Example Usage
|
||||||
|
|
||||||
|
```sql
|
||||||
|
with a as(
|
||||||
|
select st_geomfromtext('POLYGON((-432540.453078056 4949775.20452642,-432329.947920966 4951361.232584,-431245.028163694 4952223.31516671,-429131.071033529 4951768.00415574,-424622.07505895 4952843.13503987,-423688.327170174 4953499.20752423,-424086.294349759 4954968.38274191,-423068.388925945 4954378.63345336,-423387.653225542 4953355.67417084,-420594.869840519 4953781.00230592,-416026.095299382 4951484.06849063,-412483.018546414 4951024.5410983,-410490.399661215 4954502.24032205,-408186.197521284 4956398.91417441,-407627.262358013 4959300.94633864,-406948.770061627 4959874.85407739,-404949.583326472 4959047.74518163,-402570.908447199 4953743.46829807,-400971.358683991 4952193.11680804,-403533.488084088 4949649.89857885,-406335.177028373 4950193.19571096,-407790.456731515 4952391.46015616,-412060.672398345 4950381.2389307,-410716.93482498 4949156.7509561,-408464.162289794 4943912.8940387,-409350.599394983 4942819.84896006,-408087.791091424 4942451.6711778,-407274.045613725 4940572.4807777,-404446.196589102 4939976.71501489,-402422.964843936 4940450.3670813,-401010.654464241 4939054.8061663,-397647.247369412 4940679.80737878,-395658.413346901 4940528.84765185,-395536.852462953 4938829.79565997,-394268.923462818 4938003.7277717,-393388.720249116 4934757.80596815,-392393.301362444 4934326.71675815,-392573.527618037 4932323.40974412,-393464.640141837 4931903.10653605,-393085.597275686 4931094.7353605,-398426.261165985 4929156.87541607,-398261.174361137 4926238.00816416,-394045.059966834 4925765.18668498,-392982.960705174 4926391.81893628,-393090.272694301 4927176.84692181,-391648.240010564 4924626.06386961,-391889.914625075 4923086.14787613,-394345.177314013 4923235.086036,-395550.878718795 4917812.79243978,-399009.463978251 4912927.7157945,-398948.794855767 4911941.91010796,-398092.636652078 4911806.57392519,-401991.601817112 4911722.9204501,-406225.972607907 4914505.47286319,-411104.994569885 4912569.26941163,-412925.513522316 4913030.3608866,-414630.148884835 4914436.69169949,-414207.691417276 4919205.78028405,-418306.141109809 4917994.9580478,-424184.700779621 4918938.12432889,-426816.961458921 4923664.37379373,-420956.324227126 4923381.98014807,-420186.661267781 4924286.48693378,-420943.411166194 4926812.76394433,-419779.45457046 4928527.43466337,-419768.767899344 4930681.94459216,-421911.668097113 4930432.40620397,-423482.386112205 4933451.28047252,-427272.814773717 4934151.56473242,-427144.908678797 4939731.77191996,-428982.125554848 4940522.84445172,-428986.133056516 4942437.17281266,-431237.792396792 4947309.68284815,-432476.889648814 4947791.74800037,-432540.453078056 4949775.20452642))', 3857) as g
|
||||||
|
)
|
||||||
|
SELECT st_astext(CDB_PIA(g)) from a;
|
||||||
|
```
|
@ -1,205 +0,0 @@
|
|||||||
CREATE OR REPLACE FUNCTION CDB_voronoi(
|
|
||||||
IN geomin geometry[],
|
|
||||||
IN buffer numeric DEFAULT 0.5,
|
|
||||||
IN tolerance numeric DEFAULT 1e-9
|
|
||||||
)
|
|
||||||
RETURNS geometry AS $$
|
|
||||||
DECLARE
|
|
||||||
geomout geometry;
|
|
||||||
BEGIN
|
|
||||||
WITH
|
|
||||||
convexhull_1 as (
|
|
||||||
SELECT
|
|
||||||
ST_ConvexHull(ST_Collect(geomin)) as g,
|
|
||||||
buffer * |/ st_area(ST_ConvexHull(ST_Collect(geomin))) as r
|
|
||||||
),
|
|
||||||
clipper as(
|
|
||||||
SELECT
|
|
||||||
st_buffer(ST_MinimumBoundingCircle(a.g), buffer*a.r) as g
|
|
||||||
FROM convexhull_1 a
|
|
||||||
),
|
|
||||||
env0 as (
|
|
||||||
SELECT
|
|
||||||
(st_dumppoints(st_expand(a.g, buffer*a.r))).geom as e
|
|
||||||
FROM convexhull_1 a
|
|
||||||
),
|
|
||||||
env as (
|
|
||||||
SELECT
|
|
||||||
array_agg(env0.e) as e
|
|
||||||
FROM env0
|
|
||||||
),
|
|
||||||
sample AS (
|
|
||||||
SELECT
|
|
||||||
ST_Collect(geomin || env.e) as geom
|
|
||||||
FROM env
|
|
||||||
),
|
|
||||||
convexhull as (
|
|
||||||
SELECT
|
|
||||||
ST_ConvexHull(ST_Collect(geomin)) as cg
|
|
||||||
),
|
|
||||||
tin as (
|
|
||||||
SELECT
|
|
||||||
ST_Dump(ST_DelaunayTriangles(geom, tolerance, 0)) as gd
|
|
||||||
FROM
|
|
||||||
sample
|
|
||||||
),
|
|
||||||
tin_polygons as (
|
|
||||||
SELECT
|
|
||||||
(gd).Path as id,
|
|
||||||
(gd).Geom as pg,
|
|
||||||
ST_Centroid(ST_MinimumBoundingCircle((gd).Geom, 180)) as ct
|
|
||||||
FROM tin
|
|
||||||
),
|
|
||||||
tin_lines as (
|
|
||||||
SELECT
|
|
||||||
id,
|
|
||||||
ST_ExteriorRing(pg) as lg
|
|
||||||
FROM tin_polygons
|
|
||||||
),
|
|
||||||
tin_nodes as (
|
|
||||||
SELECT
|
|
||||||
id,
|
|
||||||
ST_PointN(lg,1) p1,
|
|
||||||
ST_PointN(lg,2) p2,
|
|
||||||
ST_PointN(lg,3) p3
|
|
||||||
FROM tin_lines
|
|
||||||
),
|
|
||||||
tin_edges AS (
|
|
||||||
SELECT
|
|
||||||
p.id,
|
|
||||||
UNNEST(ARRAY[
|
|
||||||
ST_MakeLine(n.p1,n.p2) ,
|
|
||||||
ST_MakeLine(n.p2,n.p3) ,
|
|
||||||
ST_MakeLine(n.p3,n.p1)]) as Edge,
|
|
||||||
ST_Force_2D(_Find_Circle(n.p1,n.p2,n.p3)) as ct ,
|
|
||||||
CASE WHEN st_distance(p.ct, ST_ExteriorRing(p.pg)) < tolerance THEN
|
|
||||||
TRUE
|
|
||||||
ELSE FALSE END AS ctx,
|
|
||||||
p.pg,
|
|
||||||
ST_within(p.ct, convexhull.cg) as ctin
|
|
||||||
FROM
|
|
||||||
tin_polygons p,
|
|
||||||
tin_nodes n,
|
|
||||||
convexhull
|
|
||||||
WHERE p.id = n.id
|
|
||||||
),
|
|
||||||
voro_nodes as (
|
|
||||||
SELECT
|
|
||||||
CASE WHEN x.ctx = TRUE THEN
|
|
||||||
ST_Centroid(x.edge)
|
|
||||||
ELSE
|
|
||||||
x.ct
|
|
||||||
END as xct,
|
|
||||||
CASE WHEN y.id is null THEN
|
|
||||||
CASE WHEN x.ctin = TRUE THEN
|
|
||||||
ST_SetSRID(ST_MakePoint(
|
|
||||||
ST_X(x.ct) + ((ST_X(ST_Centroid(x.edge)) - ST_X(x.ct)) * (1+buffer)),
|
|
||||||
ST_Y(x.ct) + ((ST_Y(ST_Centroid(x.edge)) - ST_Y(x.ct)) * (1+buffer))
|
|
||||||
), ST_SRID(x.ct))
|
|
||||||
END
|
|
||||||
ELSE
|
|
||||||
y.ct
|
|
||||||
END as yct
|
|
||||||
FROM
|
|
||||||
tin_edges x
|
|
||||||
LEFT OUTER JOIN
|
|
||||||
tin_edges y
|
|
||||||
ON x.id <> y.id AND ST_Equals(x.edge, y.edge)
|
|
||||||
),
|
|
||||||
voro_edges as(
|
|
||||||
SELECT
|
|
||||||
ST_LineMerge(ST_Collect(ST_MakeLine(xct, yct))) as v
|
|
||||||
FROM
|
|
||||||
voro_nodes
|
|
||||||
),
|
|
||||||
voro_cells as(
|
|
||||||
SELECT
|
|
||||||
ST_Polygonize(
|
|
||||||
ST_Node(
|
|
||||||
ST_LineMerge(
|
|
||||||
ST_Union(v, ST_ExteriorRing(
|
|
||||||
ST_Convexhull(v)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
) as g
|
|
||||||
FROM
|
|
||||||
voro_edges
|
|
||||||
),
|
|
||||||
voro_set as(
|
|
||||||
SELECT
|
|
||||||
(st_dump(v.g)).geom as g
|
|
||||||
FROM voro_cells v
|
|
||||||
)
|
|
||||||
SELECT
|
|
||||||
st_collect(ST_intersection(c.g, v.g))
|
|
||||||
-- ST_intersection(c.g, v.g)
|
|
||||||
INTO geomout
|
|
||||||
FROM
|
|
||||||
voro_set v,
|
|
||||||
clipper c;
|
|
||||||
RETURN geomout;
|
|
||||||
END;
|
|
||||||
$$ language plpgsql IMMUTABLE;
|
|
||||||
|
|
||||||
/** ----------------------------------------------------------------------------------------
|
|
||||||
* @function : FindCircle
|
|
||||||
* @precis : Function that determines if three points form a circle. If so a table containing
|
|
||||||
* centre and radius is returned. If not, a null table is returned.
|
|
||||||
* @version : 1.0
|
|
||||||
* @param : p_pt1 : First point in curve
|
|
||||||
* @param : p_pt2 : Second point in curve
|
|
||||||
* @param : p_pt3 : Third point in curve
|
|
||||||
* @return : geometry : In which X,Y ordinates are the centre X, Y and the Z being the radius of found circle
|
|
||||||
* or NULL if three points do not form a circle.
|
|
||||||
* @history : Simon Greener - Feb 2012 - Original coding.
|
|
||||||
* @copyright : Simon Greener @ 2012
|
|
||||||
* Licensed under a Creative Commons Attribution-Share Alike 2.5 Australia License. (http://creativecommons.org/licenses/by-sa/2.5/au/)
|
|
||||||
**/
|
|
||||||
CREATE OR REPLACE FUNCTION _Find_Circle(p_pt1 geometry, p_pt2 geometry, p_pt3 geometry)
|
|
||||||
RETURNS geometry AS
|
|
||||||
$BODY$
|
|
||||||
DECLARE
|
|
||||||
v_Centre geometry;
|
|
||||||
v_radius NUMERIC;
|
|
||||||
v_CX NUMERIC;
|
|
||||||
v_CY NUMERIC;
|
|
||||||
v_dA NUMERIC;
|
|
||||||
v_dB NUMERIC;
|
|
||||||
v_dC NUMERIC;
|
|
||||||
v_dD NUMERIC;
|
|
||||||
v_dE NUMERIC;
|
|
||||||
v_dF NUMERIC;
|
|
||||||
v_dG NUMERIC;
|
|
||||||
BEGIN
|
|
||||||
IF ( p_pt1 IS NULL OR p_pt2 IS NULL OR p_pt3 IS NULL ) THEN
|
|
||||||
RAISE EXCEPTION 'All supplied points must be not null.';
|
|
||||||
RETURN NULL;
|
|
||||||
END IF;
|
|
||||||
IF ( ST_GeometryType(p_pt1) <> 'ST_Point' OR
|
|
||||||
ST_GeometryType(p_pt1) <> 'ST_Point' OR
|
|
||||||
ST_GeometryType(p_pt1) <> 'ST_Point' ) THEN
|
|
||||||
RAISE EXCEPTION 'All supplied geometries must be points.';
|
|
||||||
RETURN NULL;
|
|
||||||
END IF;
|
|
||||||
v_dA := ST_X(p_pt2) - ST_X(p_pt1);
|
|
||||||
v_dB := ST_Y(p_pt2) - ST_Y(p_pt1);
|
|
||||||
v_dC := ST_X(p_pt3) - ST_X(p_pt1);
|
|
||||||
v_dD := ST_Y(p_pt3) - ST_Y(p_pt1);
|
|
||||||
v_dE := v_dA * (ST_X(p_pt1) + ST_X(p_pt2)) + v_dB * (ST_Y(p_pt1) + ST_Y(p_pt2));
|
|
||||||
v_dF := v_dC * (ST_X(p_pt1) + ST_X(p_pt3)) + v_dD * (ST_Y(p_pt1) + ST_Y(p_pt3));
|
|
||||||
v_dG := 2.0 * (v_dA * (ST_Y(p_pt3) - ST_Y(p_pt2)) - v_dB * (ST_X(p_pt3) - ST_X(p_pt2)));
|
|
||||||
-- If v_dG is zero then the three points are collinear and no finite-radius
|
|
||||||
-- circle through them exists.
|
|
||||||
IF ( v_dG = 0 ) THEN
|
|
||||||
RETURN NULL;
|
|
||||||
ELSE
|
|
||||||
v_CX := (v_dD * v_dE - v_dB * v_dF) / v_dG;
|
|
||||||
v_CY := (v_dA * v_dF - v_dC * v_dE) / v_dG;
|
|
||||||
v_Radius := SQRT(POWER(ST_X(p_pt1) - v_CX,2) + POWER(ST_Y(p_pt1) - v_CY,2) );
|
|
||||||
END IF;
|
|
||||||
RETURN ST_SetSRID(ST_MakePoint(v_CX, v_CY, v_radius),ST_Srid(p_pt1));
|
|
||||||
END;
|
|
||||||
$BODY$
|
|
||||||
LANGUAGE plpgsql VOLATILE STRICT;
|
|
125
src/pg/sql/13_PIA.sql
Normal file
125
src/pg/sql/13_PIA.sql
Normal file
@ -0,0 +1,125 @@
|
|||||||
|
-- Based on:
|
||||||
|
-- https://github.com/mapbox/polylabel/blob/master/index.js
|
||||||
|
-- https://sites.google.com/site/polesofinaccessibility/
|
||||||
|
-- Requires: https://github.com/CartoDB/cartodb-postgresql
|
||||||
|
|
||||||
|
CREATE OR REPLACE FUNCTION CDB_PIA(
|
||||||
|
IN polygon geometry,
|
||||||
|
IN tolerance numeric DEFAULT 1.0
|
||||||
|
)
|
||||||
|
RETURNS geometry AS $$
|
||||||
|
DECLARE
|
||||||
|
env geometry[];
|
||||||
|
cells geometry[];
|
||||||
|
best_c geometry;
|
||||||
|
best_d numeric;
|
||||||
|
test_d numeric;
|
||||||
|
test_mx numeric;
|
||||||
|
test_h numeric;
|
||||||
|
test_tol numeric;
|
||||||
|
test_cells geometry[];
|
||||||
|
width numeric;
|
||||||
|
height numeric;
|
||||||
|
h numeric;
|
||||||
|
i integer;
|
||||||
|
n integer;
|
||||||
|
sqr numeric;
|
||||||
|
p geometry;
|
||||||
|
BEGIN
|
||||||
|
sqr := |/2;
|
||||||
|
|
||||||
|
-- grid #0 cell size
|
||||||
|
height := ST_YMax(polygon) - ST_YMin(polygon);
|
||||||
|
width := ST_XMax(polygon) - ST_XMin(polygon);
|
||||||
|
SELECT 0.5*LEAST(height, width) INTO h;
|
||||||
|
|
||||||
|
-- grid #0
|
||||||
|
with c1 as(
|
||||||
|
SELECT CDB_RectangleGrid(polygon, h, h) as cell
|
||||||
|
)
|
||||||
|
-- ,c2 as(
|
||||||
|
-- SELECT cell FROM c1 WHERE ST_Intersects(cell, polygon)
|
||||||
|
-- )
|
||||||
|
SELECT array_agg(cell) INTO cells FROM c1;
|
||||||
|
|
||||||
|
-- 1st guess: centroid
|
||||||
|
SELECT _Signed_Dist(polygon, ST_Centroid(Polygon)) INTO best_d;
|
||||||
|
|
||||||
|
-- looping the loop
|
||||||
|
n := array_length(cells,1);
|
||||||
|
i := 1;
|
||||||
|
LOOP
|
||||||
|
|
||||||
|
EXIT WHEN i > n;
|
||||||
|
|
||||||
|
-- cell side size
|
||||||
|
SELECT ST_XMax(cells[i]) - ST_XMin(cells[i]) INTO test_h;
|
||||||
|
|
||||||
|
-- check distance
|
||||||
|
SELECT _Signed_Dist(polygon, ST_Centroid(cells[i])) INTO test_d;
|
||||||
|
IF test_d > best_d THEN
|
||||||
|
best_d := test_d;
|
||||||
|
best_c := cells[i];
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
-- longest distance within the cell
|
||||||
|
SELECT test_d + (test_h * sqr) INTO test_mx;
|
||||||
|
|
||||||
|
-- if the cell has no chance to contains the desired point, continue
|
||||||
|
SELECT test_mx - best_d INTO test_tol;
|
||||||
|
IF test_tol <= tolerance THEN
|
||||||
|
i := i+1;
|
||||||
|
CONTINUE;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
-- resample the cell
|
||||||
|
with c1 as(
|
||||||
|
SELECT CDB_RectangleGrid(cells[i], test_h/2, test_h/2) as cell
|
||||||
|
)
|
||||||
|
-- , c2 as(
|
||||||
|
-- SELECT cell FROM c1 WHERE ST_Intersects(cell, polygon)
|
||||||
|
-- )
|
||||||
|
SELECT array_agg(cell) INTO test_cells FROM c1;
|
||||||
|
|
||||||
|
-- concat the new cells to the former array
|
||||||
|
cells := cells || test_cells;
|
||||||
|
|
||||||
|
-- prepare next iteration
|
||||||
|
n := array_length(cells,1);
|
||||||
|
i := i+1;
|
||||||
|
|
||||||
|
END LOOP;
|
||||||
|
|
||||||
|
RETURN ST_Centroid(best_c);
|
||||||
|
|
||||||
|
END;
|
||||||
|
$$ language plpgsql IMMUTABLE;
|
||||||
|
|
||||||
|
|
||||||
|
-- signed distance point to polygon with holes
|
||||||
|
-- negative is the point is out the polygon
|
||||||
|
CREATE OR REPLACE FUNCTION _Signed_Dist(
|
||||||
|
IN polygon geometry,
|
||||||
|
IN point geometry
|
||||||
|
)
|
||||||
|
RETURNS numeric AS $$
|
||||||
|
DECLARE
|
||||||
|
i integer;
|
||||||
|
within integer;
|
||||||
|
holes integer;
|
||||||
|
dist numeric;
|
||||||
|
BEGIN
|
||||||
|
dist := 1e999;
|
||||||
|
SELECT LEAST(dist, ST_distance(point, ST_ExteriorRing(polygon))::numeric) INTO dist;
|
||||||
|
SELECT CASE WHEN ST_Within(point,polygon) THEN 1 ELSE -1 END INTO within;
|
||||||
|
SELECT ST_NumInteriorRings(polygon) INTO holes;
|
||||||
|
IF holes > 0 THEN
|
||||||
|
FOR i IN 1..holes
|
||||||
|
LOOP
|
||||||
|
SELECT LEAST(dist, ST_distance(point, ST_InteriorRingN(polygon, i))::numeric) INTO dist;
|
||||||
|
END LOOP;
|
||||||
|
END IF;
|
||||||
|
dist := dist * within::numeric;
|
||||||
|
RETURN dist;
|
||||||
|
END;
|
||||||
|
$$ language plpgsql IMMUTABLE;
|
File diff suppressed because one or more lines are too long
5
src/pg/test/expected/13_pia_test.out
Normal file
5
src/pg/test/expected/13_pia_test.out
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
st_astext
|
||||||
|
-------------------------------------------
|
||||||
|
POINT(-409081.241940808 4930027.50443989)
|
||||||
|
(1 row)
|
||||||
|
|
@ -1,7 +0,0 @@
|
|||||||
WITH a AS (
|
|
||||||
SELECT
|
|
||||||
ARRAY[ST_GeomFromText('POINT(2.1744 41.403)'),ST_GeomFromText('POINT(2.1228 41.380)'),ST_GeomFromText('POINT(2.1511 41.374)'),ST_GeomFromText('POINT(2.1528 41.413)'),ST_GeomFromText('POINT(2.165 41.391)'),ST_GeomFromText('POINT(2.1498 41.371)'),ST_GeomFromText('POINT(2.1533 41.368)'),ST_GeomFromText('POINT(2.131386 41.41399)')] AS geomin
|
|
||||||
)
|
|
||||||
SELECT
|
|
||||||
CDB_voronoi(geomin, 0.2, 1e-9) as result
|
|
||||||
FROM a;
|
|
4
src/pg/test/sql/13_pia_test.sql
Normal file
4
src/pg/test/sql/13_pia_test.sql
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
with a as(
|
||||||
|
select st_geomfromtext('POLYGON((-432540.453078056 4949775.20452642,-432329.947920966 4951361.232584,-431245.028163694 4952223.31516671,-429131.071033529 4951768.00415574,-424622.07505895 4952843.13503987,-423688.327170174 4953499.20752423,-424086.294349759 4954968.38274191,-423068.388925945 4954378.63345336,-423387.653225542 4953355.67417084,-420594.869840519 4953781.00230592,-416026.095299382 4951484.06849063,-412483.018546414 4951024.5410983,-410490.399661215 4954502.24032205,-408186.197521284 4956398.91417441,-407627.262358013 4959300.94633864,-406948.770061627 4959874.85407739,-404949.583326472 4959047.74518163,-402570.908447199 4953743.46829807,-400971.358683991 4952193.11680804,-403533.488084088 4949649.89857885,-406335.177028373 4950193.19571096,-407790.456731515 4952391.46015616,-412060.672398345 4950381.2389307,-410716.93482498 4949156.7509561,-408464.162289794 4943912.8940387,-409350.599394983 4942819.84896006,-408087.791091424 4942451.6711778,-407274.045613725 4940572.4807777,-404446.196589102 4939976.71501489,-402422.964843936 4940450.3670813,-401010.654464241 4939054.8061663,-397647.247369412 4940679.80737878,-395658.413346901 4940528.84765185,-395536.852462953 4938829.79565997,-394268.923462818 4938003.7277717,-393388.720249116 4934757.80596815,-392393.301362444 4934326.71675815,-392573.527618037 4932323.40974412,-393464.640141837 4931903.10653605,-393085.597275686 4931094.7353605,-398426.261165985 4929156.87541607,-398261.174361137 4926238.00816416,-394045.059966834 4925765.18668498,-392982.960705174 4926391.81893628,-393090.272694301 4927176.84692181,-391648.240010564 4924626.06386961,-391889.914625075 4923086.14787613,-394345.177314013 4923235.086036,-395550.878718795 4917812.79243978,-399009.463978251 4912927.7157945,-398948.794855767 4911941.91010796,-398092.636652078 4911806.57392519,-401991.601817112 4911722.9204501,-406225.972607907 4914505.47286319,-411104.994569885 4912569.26941163,-412925.513522316 4913030.3608866,-414630.148884835 4914436.69169949,-414207.691417276 4919205.78028405,-418306.141109809 4917994.9580478,-424184.700779621 4918938.12432889,-426816.961458921 4923664.37379373,-420956.324227126 4923381.98014807,-420186.661267781 4924286.48693378,-420943.411166194 4926812.76394433,-419779.45457046 4928527.43466337,-419768.767899344 4930681.94459216,-421911.668097113 4930432.40620397,-423482.386112205 4933451.28047252,-427272.814773717 4934151.56473242,-427144.908678797 4939731.77191996,-428982.125554848 4940522.84445172,-428986.133056516 4942437.17281266,-431237.792396792 4947309.68284815,-432476.889648814 4947791.74800037,-432540.453078056 4949775.20452642))', 3857) as g
|
||||||
|
)
|
||||||
|
SELECT st_astext(CDB_PIA(g)) from a;
|
Loading…
Reference in New Issue
Block a user