[postgis-tickets] [SCM] PostGIS branch master updated. e18a0b84dfa0995f3f78d52227aceb3b3e494a52
rmrodriguez at carto.com
rmrodriguez at carto.com
Wed Dec 11 01:42:07 PST 2019
The commit message is referencing a wrong PR. The one closed was
https://github.com/postgis/postgis/pull/514
On Wed, Dec 11, 2019 at 10:38 AM <git at osgeo.org> wrote:
>
> This is an automated email from the git hooks/post-receive script. It was
> generated because a ref change was pushed to the repository containing
> the project "PostGIS".
>
> The branch, master has been updated
> via e18a0b84dfa0995f3f78d52227aceb3b3e494a52 (commit)
> from 722e45c2dd5c8cc367f0093bc750724687ca2273 (commit)
>
> Those revisions listed above that are new to this repository have
> not appeared on any other notification email; so we list those
> revisions in full, below.
>
> - Log -----------------------------------------------------------------
> commit e18a0b84dfa0995f3f78d52227aceb3b3e494a52
> Author: Yuri Astrakhan <YuriAstrakhan at gmail.com>
> Date: Wed Nov 13 21:41:49 2019 -0500
>
> Add ST_TileEnvelope margin argument
>
> Increase or decrease if negative tile envelope by a given margin
> percentage. The result is always clipped according to bounds argument.
>
> Closes #4601
> Closes https://github.com/CartoDB/cartodb/pull/15169
>
> Signed-off-by: Raúl Marín <git at rmr.ninja>
>
> diff --git a/NEWS b/NEWS
> index 72a22b0..dea80ab 100644
> --- a/NEWS
> +++ b/NEWS
> @@ -8,8 +8,10 @@ PostGIS 3.1.0
> * Breaking changes *
> - #4577, Drop support for PostgreSQL 9.5 (Raúl Marín)
> - #4579, Drop postgis_proc_set_search_path.pl (Raúl Marín)
> + - #4601, ST_TileEnvelope signature changed.
>
> * New features *
> + - #4601, Add ST_TileEnvelope margin argument (Yuri Astrakhan)
>
> * Enhancements *
> - #4539, Unify libm includes (Raúl Marín)
> diff --git a/doc/reference_constructor.xml b/doc/reference_constructor.xml
> index 87ef1ea..4b8e9a7 100644
> --- a/doc/reference_constructor.xml
> +++ b/doc/reference_constructor.xml
> @@ -771,6 +771,7 @@ SRID=4326;POLYGON((75 29 1, 77 29 2, 77 29 3, 75 29 1))
> <paramdef><type>integer</type> <parameter>tileX</parameter></paramdef>
> <paramdef><type>integer</type> <parameter>tileY</parameter></paramdef>
> <paramdef choice="opt"><type>geometry</type> <parameter>bounds=SRID=3857;LINESTRING(-20037508.342789 -20037508.342789,20037508.342789 20037508.342789)</parameter></paramdef>
> + <paramdef choice="opt"><type>float</type> <parameter>margin=0.0</parameter></paramdef>
> </funcprototype>
> </funcsynopsis>
> </refsynopsisdiv>
> @@ -780,7 +781,10 @@ SRID=4326;POLYGON((75 29 1, 77 29 2, 77 29 3, 75 29 1))
>
> <para>Creates a rectangular Polygon in <ulink url="https://en.wikipedia.org/wiki/Web_Mercator_projection">Web Mercator</ulink> (SRID:3857) using the <ulink url="https://en.wikipedia.org/wiki/Tiled_web_map">XYZ tile system</ulink>. By default, the bounds are the in EPSG:3857 using the standard range of the Web Mercator system (-20037508.342789, 20037508.342789). The optional bounds parameter can be used to generate envelopes for any tiling scheme: provide a geometry that has the SRID and extent of the initial "zoom level zero" square within which the tile system is to be inscribed.</para>
>
> + <para>The optional margin parameter can be used to grow a tile by the given percentage, e.g. margin=0.125 grows the tile by 12.5%, which is equivalent to buffer=512 when extent is 4096, as used in <xref linkend="ST_AsMVTGeom" />. This is useful to create a tile buffer -- to include data lying outside of the tile's visible area, but whose existence affects current tile's rendering. For example, a city name (a geopoint) could be near an edge of a tile, but the text would need to render on two tiles, even though the geopoint is located in the visible area of just one tile. Using an expanded tile in a search would include the city geopoint for both tiles. Use negative value to shrink the tile instead. Values less than -0.5 are prohibited because that would eliminate the tile completely. Do not use margin with ST_AsMVTGeom(). See example in <xref linkend="ST_AsMVT" />.</para>
> +
> <para>Availability: 3.0</para>
> + <para>Enhanced in 3.1: Added margin parameter.</para>
>
> </refsection>
>
> @@ -794,7 +798,7 @@ SRID=4326;POLYGON((75 29 1, 77 29 2, 77 29 3, 75 29 1))
>
> SELECT ST_AsText( ST_TileEnvelope(3, 1, 1, ST_MakeEnvelope(-180, -90, 180, 90, 4326) ) );
>
> - st_astext
> + st_astext
> ------------------------------------------------------
> POLYGON((-135 45,-135 67.5,-90 67.5,-90 45,-135 45))
> </programlisting>
> diff --git a/doc/reference_output.xml b/doc/reference_output.xml
> index 30a87c8..f64b992 100644
> --- a/doc/reference_output.xml
> +++ b/doc/reference_output.xml
> @@ -1189,9 +1189,9 @@ SELECT (ST_AsLatLonText('POINT (-302.2342342 -792.32498)'));
> <title>Examples</title>
> <programlisting><![CDATA[WITH mvtgeom AS
> (
> - SELECT ST_AsMVTGeom(geom, ST_TileEnvelope(12,513,412)) AS geom, name, description
> + SELECT ST_AsMVTGeom(geom, ST_TileEnvelope(12, 513, 412), extent => 4096, buffer => 64) AS geom, name, description
> FROM points_of_interest
> - WHERE ST_Intersects(geom, ST_TileEnvelope(12,513,412)
> + WHERE geom && ST_TileEnvelope(12, 513, 412, margin => (64.0 / 4096))
> )
> SELECT ST_AsMVT(mvtgeom.*)
> FROM mvtgeom;
> diff --git a/postgis/lwgeom_functions_basic.c b/postgis/lwgeom_functions_basic.c
> index adc6d3f..89a395b 100644
> --- a/postgis/lwgeom_functions_basic.c
> +++ b/postgis/lwgeom_functions_basic.c
> @@ -2051,6 +2051,7 @@ Datum ST_TileEnvelope(PG_FUNCTION_ARGS)
> double tileGeoSizeX, tileGeoSizeY;
> double boundsWidth, boundsHeight;
> double x1, y1, x2, y2;
> + double margin;
> /* This is broken, since 3857 doesn't mean "web mercator", it means
> the contents of the row in spatial_ref_sys with srid = 3857.
> For practical purposes this will work, but in good implementation
> @@ -2070,6 +2071,11 @@ Datum ST_TileEnvelope(PG_FUNCTION_ARGS)
> elog(ERROR, "%s: Empty bounds", __func__);
> srid = gserialized_get_srid(bounds);
>
> + margin = PG_GETARG_FLOAT8(4);
> + /* shrinking by more than 50% would eliminate the tile outright */
> + if (margin < -0.5)
> + elog(ERROR, "%s: Margin must not be less than -50%%, margin=%f", __func__, margin);
> +
> boundsWidth = bbox.xmax - bbox.xmin;
> boundsHeight = bbox.ymax - bbox.ymin;
> if (boundsWidth <= 0 || boundsHeight <= 0)
> @@ -2088,10 +2094,29 @@ Datum ST_TileEnvelope(PG_FUNCTION_ARGS)
>
> tileGeoSizeX = boundsWidth / worldTileSize;
> tileGeoSizeY = boundsHeight / worldTileSize;
> - x1 = bbox.xmin + tileGeoSizeX * (x);
> - x2 = bbox.xmin + tileGeoSizeX * (x+1);
> - y1 = bbox.ymax - tileGeoSizeY * (y+1);
> - y2 = bbox.ymax - tileGeoSizeY * (y);
> +
> + /*
> + * 1 margin (100%) is the same as a single tile width
> + * if the size of the tile with margins span more than the total number of tiles,
> + * reset x1/x2 to the bounds
> + */
> + if ((1 + margin * 2) > worldTileSize)
> + {
> + x1 = bbox.xmin;
> + x2 = bbox.xmax;
> + }
> + else
> + {
> + x1 = bbox.xmin + tileGeoSizeX * (x - margin);
> + x2 = bbox.xmin + tileGeoSizeX * (x + 1 + margin);
> + }
> +
> + y1 = bbox.ymax - tileGeoSizeY * (y + 1 + margin);
> + y2 = bbox.ymax - tileGeoSizeY * (y - margin);
> +
> + /* Clip y-axis to the given bounds */
> + if (y1 < bbox.ymin) y1 = bbox.ymin;
> + if (y2 > bbox.ymax) y2 = bbox.ymax;
>
> PG_RETURN_POINTER(
> geometry_serialize(
> diff --git a/postgis/postgis.sql.in b/postgis/postgis.sql.in
> index 9ad89be..4727552 100644
> --- a/postgis/postgis.sql.in
> +++ b/postgis/postgis.sql.in
> @@ -1686,7 +1686,8 @@ CREATE OR REPLACE FUNCTION ST_MakeEnvelope(float8, float8, float8, float8, integ
> _COST_LOW;
>
> -- Availability: 3.0.0
> -CREATE OR REPLACE FUNCTION ST_TileEnvelope(zoom integer, x integer, y integer, bounds geometry DEFAULT 'SRID=3857;LINESTRING(-20037508.342789 -20037508.342789, 20037508.342789 20037508.342789)'::geometry)
> +-- Changed: 3.1.0 - add margin=0.0 parameter
> +CREATE OR REPLACE FUNCTION ST_TileEnvelope(zoom integer, x integer, y integer, bounds geometry DEFAULT 'SRID=3857;LINESTRING(-20037508.342789 -20037508.342789, 20037508.342789 20037508.342789)'::geometry, margin float8 DEFAULT 0.0)
> RETURNS geometry
> AS 'MODULE_PATHNAME', 'ST_TileEnvelope'
> LANGUAGE 'c' IMMUTABLE STRICT PARALLEL SAFE
> @@ -2853,7 +2854,7 @@ BEGIN
> THEN
> --force install in same schema as postgis only if postgis extension is installed
> IF rec.name NOT IN('postgis', 'postgis_topology', 'postgis_tiger_geocoder') AND EXISTS (SELECT 1 FROM pg_catalog.pg_extension WHERE extname = 'postgis') THEN
> - sql = 'CREATE EXTENSION ' || rec.name || ' FROM unpackaged SCHEMA '
> + sql = 'CREATE EXTENSION ' || rec.name || ' FROM unpackaged SCHEMA '
> || quote_ident( (SELECT ns.nspname FROM pg_catalog.pg_extension AS e INNER JOIN pg_catalog.pg_namespace AS ns ON e.extnamespace = ns.oid WHERE extname = 'postgis')) || ';';
> ELSE
> sql = 'CREATE EXTENSION ' || rec.name || ' FROM unpackaged;';
> diff --git a/postgis/postgis_before_upgrade.sql b/postgis/postgis_before_upgrade.sql
> index c709b05..8780c90 100644
> --- a/postgis/postgis_before_upgrade.sql
> +++ b/postgis/postgis_before_upgrade.sql
> @@ -187,6 +187,12 @@ SELECT _postgis_drop_function_if_needed
> 'GeometryA geometry, GeometryB geometry'
> );
>
> +-- FUNCTION st_tileenvelope added a new default argument in 3.1
> +SELECT _postgis_drop_function_if_needed
> + (
> + 'st_tileenvelope',
> + 'zoom integer, x integer, y integer, bounds geometry DEFAULT ''0102000020110F00000200000052107C45F81B73C152107C45F81B73C152107C45F81B734152107C45F81B7341''::geometry'
> + );
>
> -- FUNCTION st_askml changed to add defaults in 3.0 / r17357
> -- These signatures were superseeded
> diff --git a/regress/core/regress.sql b/regress/core/regress.sql
> index 78ab69b..6f5eea3 100644
> --- a/regress/core/regress.sql
> +++ b/regress/core/regress.sql
> @@ -274,7 +274,17 @@ select '232', ST_AsEWKT(ST_TileEnvelope(4, 8, 8, ST_MakeEnvelope(-100, -100, 100
> select '233', ST_AsEWKT(ST_TileEnvelope(4, 15, 15, ST_MakeEnvelope(-100, -100, 100, 100, 0)));
> select '234', ST_AsEWKT(ST_TileEnvelope(4, 0, 0, ST_MakeEnvelope(-100, -100, 100, 100, 0)));
> select '235', ST_AsEWKT(ST_TileEnvelope(4, 8, 8, ST_MakeEnvelope(-200, -100, 200, 100, 0)));
> -
> +select '236', ST_AsEWKT(ST_TileEnvelope(0, 0, 0, margin => 0.1));
> +select '237', ST_AsEWKT(ST_TileEnvelope(1, 0, 0, margin => 0.1));
> +select '238', ST_AsEWKT(ST_TileEnvelope(2, 1, 3, margin => 0.5));
> +select '239', ST_AsEWKT(ST_TileEnvelope(0, 0, 0, margin => -0.5));
> +select '240', ST_AsEWKT(ST_TileEnvelope(0, 0, 0, margin => -0.51));
> +select '241', ST_AsEWKT(ST_TileEnvelope(0, 0, 0, margin => -0.4));
> +select '250', ST_AsEWKT(ST_TileEnvelope(10,300,387));
> +select '251', ST_AsEWKT(ST_TileEnvelope(10,300,387, margin => 0.1));
> +select '252', ST_AsEWKT(ST_TileEnvelope(10,300,387, margin => 0.5));
> +select '253', ST_AsEWKT(ST_TileEnvelope(10,300,387, margin => 2));
> +select '254', ST_AsEWKT(ST_TileEnvelope(10,300,387, margin => -0.3));
>
> -- Drop test table
> DROP table test;
> diff --git a/regress/core/regress_expected b/regress/core/regress_expected
> index d82fe5c..4b3d7bc 100644
> --- a/regress/core/regress_expected
> +++ b/regress/core/regress_expected
> @@ -203,3 +203,14 @@ ERROR: ST_TileEnvelope: Invalid tile y value, 1
> 233|POLYGON((87.5 -100,87.5 -87.5,100 -87.5,100 -100,87.5 -100))
> 234|POLYGON((-100 87.5,-100 100,-87.5 100,-87.5 87.5,-100 87.5))
> 235|POLYGON((0 -12.5,0 0,25 0,25 -12.5,0 -12.5))
> +236|SRID=3857;POLYGON((-20037510 -20037510,-20037510 20037510,20037510 20037510,20037510 -20037510,-20037510 -20037510))
> +237|SRID=3857;POLYGON((-22041261 -2003751,-22041261 20037510,2003751 20037510,2003751 -2003751,-22041261 -2003751))
> +238|SRID=3857;POLYGON((-15028132.5 -20037510,-15028132.5 -5009377.5,5009377.5 -5009377.5,5009377.5 -20037510,-15028132.5 -20037510))
> +239|SRID=3857;POLYGON((0 0,0 0,0 0,0 0,0 0))
> +ERROR: ST_TileEnvelope: Margin must not be less than -50%, margin=-0.510000
> +241|SRID=3857;POLYGON((-4007502 -4007502,-4007502 4007502,4007502 4007502,4007502 -4007502,-4007502 -4007502))
> +250|SRID=3857;POLYGON((-8296781.484375 4852834.453125,-8296781.484375 4891970.21484375,-8257645.72265625 4891970.21484375,-8257645.72265625 4852834.453125,-8296781.484375 4852834.453125))
> +251|SRID=3857;POLYGON((-8300695.06054688 4848920.87695312,-8300695.06054688 4895883.79101562,-8253732.14648438 4895883.79101562,-8253732.14648438 4848920.87695312,-8300695.06054688 4848920.87695312))
> +252|SRID=3857;POLYGON((-8316349.36523438 4833266.57226562,-8316349.36523438 4911538.09570312,-8238077.84179688 4911538.09570312,-8238077.84179688 4833266.57226562,-8316349.36523438 4833266.57226562))
> +253|SRID=3857;POLYGON((-8375053.0078125 4774562.9296875,-8375053.0078125 4970241.73828125,-8179374.19921875 4970241.73828125,-8179374.19921875 4774562.9296875,-8375053.0078125 4774562.9296875))
> +254|SRID=3857;POLYGON((-8285040.75585938 4864575.18164062,-8285040.75585938 4880229.48632812,-8269386.45117188 4880229.48632812,-8269386.45117188 4864575.18164062,-8285040.75585938 4864575.18164062))
>
> -----------------------------------------------------------------------
>
> Summary of changes:
> NEWS | 2 ++
> doc/reference_constructor.xml | 6 +++++-
> doc/reference_output.xml | 4 ++--
> postgis/lwgeom_functions_basic.c | 33 +++++++++++++++++++++++++++++----
> postgis/postgis.sql.in | 5 +++--
> postgis/postgis_before_upgrade.sql | 6 ++++++
> regress/core/regress.sql | 12 +++++++++++-
> regress/core/regress_expected | 11 +++++++++++
> 8 files changed, 69 insertions(+), 10 deletions(-)
>
>
> hooks/post-receive
> --
> PostGIS
> _______________________________________________
> postgis-tickets mailing list
> postgis-tickets at lists.osgeo.org
> https://lists.osgeo.org/mailman/listinfo/postgis-tickets
--
Raúl Marín Rodríguez
carto.com
More information about the postgis-tickets
mailing list