]> granicus.if.org Git - postgis/commitdiff
ST_AsMVTGeom return NULL on EMPTY geometry (References #3857)
authorPaul Ramsey <pramsey@cleverelephant.ca>
Thu, 21 Sep 2017 18:34:27 +0000 (18:34 +0000)
committerPaul Ramsey <pramsey@cleverelephant.ca>
Thu, 21 Sep 2017 18:34:27 +0000 (18:34 +0000)
git-svn-id: http://svn.osgeo.org/postgis/trunk@15786 b70326c6-7e19-0410-871a-916f4a2858ee

postgis/lwgeom_out_mvt.c
postgis/mvt.c
postgis/mvt.h
regress/mvt.sql
regress/mvt_expected

index bc609c9a6ae6f0c2076b7a1686d0a4689b0ef628..7e886eadb4c7e1f3b31407cbae0b4ac105d24076 100644 (file)
@@ -51,7 +51,7 @@ Datum ST_AsMVTGeom(PG_FUNCTION_ARGS)
        int extent, buffer;
        bool clip_geom;
        if (PG_ARGISNULL(0))
-               elog(ERROR, "ST_AsMVTGeom: geom cannot be null");
+               PG_RETURN_NULL();
        geom_in = PG_GETARG_GSERIALIZED_P(0);
        lwgeom_in = lwgeom_from_gserialized(geom_in);
        if (PG_ARGISNULL(1))
index 528d6b4aea162b9aede35d3a786da622682fb551..613d69a644cbb07383c05c0c8cdf6f70dc3e1fcb 100644 (file)
@@ -652,7 +652,7 @@ static int max_type(LWCOLLECTION *lwcoll)
  * Makes best effort to keep validity. Might collapse geometry into lower
  * dimension.
  */
-LWGEOM *mvt_geom(LWGEOM *lwgeom, GBOX *gbox, uint32_t extent, uint32_t buffer,
+LWGEOM *mvt_geom(const LWGEOM *lwgeom, const GBOX *gbox, uint32_t extent, uint32_t buffer,
        bool clip_geom)
 {
        AFFINE affine;
@@ -666,9 +666,14 @@ LWGEOM *mvt_geom(LWGEOM *lwgeom, GBOX *gbox, uint32_t extent, uint32_t buffer,
        double fy = -(extent / height);
        double buffer_map_xunits = resx * buffer;
        double buffer_map_yunits = resy * buffer;
-       const GBOX *ggbox = lwgeom_get_bbox(lwgeom);
+       const GBOX *ggbox;
        POSTGIS_DEBUG(2, "mvt_geom called");
 
+       /* Short circuit out on EMPTY */
+       if (lwgeom_is_empty(lwgeom))
+               return NULL;
+
+       ggbox = lwgeom_get_bbox(lwgeom);
        if (width == 0 || height == 0)
                elog(ERROR, "mvt_geom: bounds width or height cannot be 0");
 
index 6649df20295954e1f0b8e067e498416485c175ac..5379db77883dae66b0e608843cd1b03eba076c93 100644 (file)
@@ -67,7 +67,7 @@ struct mvt_agg_context {
        uint32_t c;
 };
 
-LWGEOM *mvt_geom(LWGEOM *geom, GBOX *bounds, uint32_t extent, uint32_t buffer,
+LWGEOM *mvt_geom(const LWGEOM *geom, const GBOX *bounds, uint32_t extent, uint32_t buffer,
        bool clip_geom);
 void mvt_agg_init_context(struct mvt_agg_context *ctx);
 void mvt_agg_transfn(struct mvt_agg_context *ctx);
index 2e8afb599a2a2d5f94b3d94cb761b60096a65835..f7baa1318f37f577a879cbafa4dd9c97021f55cb 100644 (file)
@@ -39,6 +39,9 @@ select 'PG9', ST_AsText(ST_Normalize(ST_AsMVTGeom(
        ST_GeomFromText('POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))'),
        ST_MakeBox2D(ST_Point(0, 0), ST_Point(5, 5)),
        4096, 0, true)));
+SELECT 'PG10', ST_AsText(ST_AsMVTGeom(
+       'POINT EMPTY'::geometry,
+       'BOX(0 0,2 2)'::box2d));
 
 -- geometry encoding tests
 SELECT 'TG1', encode(ST_AsMVT(q, 'test', 4096, 'geom'), 'base64') FROM (SELECT 1 AS c1,
index 36909d4393fbe8d674449a06f585bf0258b73d1b..e94c0de3402fabdcdbe19348a46237a52baac055 100644 (file)
@@ -7,6 +7,7 @@ PG6|POLYGON((600 594,894 2704,2791 594,600 594))
 PG7|POLYGON((1251 1904,1252 1905,1253 1906,1253 1905,1252 1904,1251 1904))
 PG8|MULTIPOLYGON(((5 4096,10 4096,10 4091,5 4096)),((0 4096,0 4101,5 4096,0 4096)))
 PG9|POLYGON((0 0,0 4096,4096 4096,4096 0,0 0))
+PG10|
 TG1|GiEKBHRlc3QSDBICAAAYASIECTLePxoCYzEiAigBKIAgeAI=
 TG2|GiMKBHRlc3QSDhICAAAYASIGETTcPwECGgJjMSICKAEogCB4Ag==
 TG3|GiYKBHRlc3QSERICAAAYAiIJCQCAQArQD88PGgJjMSICKAEogCB4Ag==