diff --git a/mysql-test/main/spatial_utility_function_simplify.result b/mysql-test/main/spatial_utility_function_simplify.result new file mode 100644 index 00000000000..710d22ac0d0 --- /dev/null +++ b/mysql-test/main/spatial_utility_function_simplify.result @@ -0,0 +1,613 @@ +# Creating the spatial Geometry object +USE test; +CREATE TABLE gis_geometrycollection (fid INTEGER NOT NULL PRIMARY KEY, g GEOMETRY); +SET @star_elem_vertical= 'POLYGON((5 0,15 25,25 0,15 5,5 0))'; +SET @star_elem_horizontal= 'POLYGON((25 0,0 15,30 15,22 10,25 0))'; +SET @star_center= 'POINT(15 10)'; +SET @star_top= 'POINT(15 25)'; +SET @star_bottom_left= 'POINT(5 0)'; +SET @star_bottom_right= 'POINT(25 0)'; +SET @star_bottom_points= 'MULTIPOINT(5 0,25 0)'; +SET @star_all_points= 'MULTIPOINT(5 0,25 0,15 10,15 25)'; +SET @star_line_horizontal= 'LINESTRING(10 15,20 15)'; +SET @star_line_vertical= 'LINESTRING(15 5,15 25)'; +SET @star_top_to_center= 'LINESTRING(15 25,15 10)'; +SET @star_lines_near_horizontal= 'MULTILINESTRING((25 0,0 15,15 30,0 5))'; +SET @star_lines_near_vertical= 'MULTILINESTRING((0 5,15 25,0 25))'; +SET @star= 'POLYGON((5 0,7 10,0 15,10 15,15 25,20 15,30 15,22 10,25 0,15 5,5 0))'; +SET @star_of_elems='MULTIPOLYGON(((5 0,15 25,25 0,15 5,5 0)),((25 0,0 15,30 15,22 10,25 0)))'; +SET @star_collection_elems='GEOMETRYCOLLECTION(MULTIPOLYGON(((5 0,15 25,25 0,15 5,5 0)),((25 0,0 15,30 15,22 10,25 0))),POLYGON((5 0,7 10,0 15,10 15,15 25,20 15,30 15,22 10,25 0,15 5,5 0)),LINESTRING(15 25,15 10),MULTIPOINT(5 0,25 0),POINT(15 25))'; +SET @star_collection_multilinestr='GEOMETRYCOLLECTION(MULTIPOLYGON(((5 0,15 25,25 0,15 5,5 0)),((25 0,0 15,30 15,22 10,25 0))),POLYGON((5 0,7 10,0 15,10 15,15 25,20 15,30 15,22 10,25 0,15 5,5 0)),MULTILINESTRING((25 0,0 15,15 30,0 5)),LINESTRING(15 25,15 10),MULTIPOINT(5 0,25 0),POINT(15 25))'; +INSERT INTO gis_geometrycollection VALUES +(100,ST_GEOMFROMTEXT(@star)), +(101,ST_GEOMFROMTEXT(@star_elem_vertical)), +(102,ST_GEOMFROMTEXT(@star_elem_horizontal)), +(103,ST_GEOMFROMTEXT(@star_of_elems)), +(104,ST_GEOMFROMTEXT(@star_top)), +(105,ST_GEOMFROMTEXT(@star_center)), +(106,ST_GEOMFROMTEXT(@star_bottom_left)), +(107,ST_GEOMFROMTEXT(@star_bottom_right)), +(108,ST_GEOMFROMTEXT(@star_bottom_points)), +(109,ST_GEOMFROMTEXT(@star_all_points)), +(110,ST_GEOMFROMTEXT(@star_line_horizontal)), +(111,ST_GEOMFROMTEXT(@star_line_vertical)), +(112,ST_GEOMFROMTEXT(@star_top_to_center)), +(113,ST_GEOMFROMTEXT(@star_lines_near_horizontal)), +(114,ST_GEOMFROMTEXT(@star_lines_near_vertical)), +(115,ST_GEOMFROMTEXT(@star_collection_elems)), +(116,ST_GEOMFROMTEXT(@star_collection_multilinestr)); +# Checking the integrity of the above create/insert statements +# 17 rows. +SELECT count(ST_ASTEXT(g) != 'NULL') FROM gis_geometrycollection; +count(ST_ASTEXT(g) != 'NULL') +17 +##################################################################################### +# ST_SIMPLIFY(point) +##################################################################################### +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(17 14)'), 1)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(17 14)'), 1)) +POINT(17 14) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(-8 2)'), 2)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(-8 2)'), 2)) +POINT(-8 2) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(9 0)'), 3)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(9 0)'), 3)) +POINT(9 0) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(10 -8)'), 4)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(10 -8)'), 4)) +POINT(10 -8) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(20 -2)'), 5)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(20 -2)'), 5)) +POINT(20 -2) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(7 13)'), 10)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(7 13)'), 10)) +POINT(7 13) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(-16 11)'), 1000)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(-16 11)'), 1000)) +POINT(-16 11) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(-5 -2)'), 2000000)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(-5 -2)'), 2000000)) +POINT(-5 -2) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(-10 6)'), 1234567890)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(-10 6)'), 1234567890)) +POINT(-10 6) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(-16 -8)'), 111111111111)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(-16 -8)'), 111111111111)) +POINT(-16 -8) +##################################################################################### +# ST_SIMPLIFY(multipoint) +##################################################################################### +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOINT(19 -4, -2 -6, -8 2)'), 1)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOINT(19 -4, -2 -6, -8 2)'), 1)) +MULTIPOINT(19 -4,-2 -6,-8 2) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOINT(-3 14, 19 8, 10 -8)'), 2)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOINT(-3 14, 19 8, 10 -8)'), 2)) +MULTIPOINT(-3 14,19 8,10 -8) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOINT(1 -8, -1 12, -11 16)'), 3)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOINT(1 -8, -1 12, -11 16)'), 3)) +MULTIPOINT(1 -8,-1 12,-11 16) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOINT(-16 11, -2 -7, -11 11)'), 4)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOINT(-16 11, -2 -7, -11 11)'), 4)) +MULTIPOINT(-16 11,-2 -7,-11 11) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOINT(19 12, 0 9, 5 10, 20 -16, 7 -17, 9 -18, 19 -7)'), 10)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOINT(19 12, 0 9, 5 10, 20 -16, 7 -17, 9 -18, 19 -7)'), 10)) +MULTIPOINT(19 12,0 9,5 10,20 -16,7 -17,9 -18,19 -7) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOINT(-1 11, -17 -11, -15 16, 6 -6, 11 -13, -4 -12, -13 -5)'), 1000)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOINT(-1 11, -17 -11, -15 16, 6 -6, 11 -13, -4 -12, -13 -5)'), 1000)) +MULTIPOINT(-1 11,-17 -11,-15 16,6 -6,11 -13,-4 -12,-13 -5) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOINT(17 -11, -19 -6, 5 17, -14 13, 20 13, 20 2, 0 -12)'), 200000)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOINT(17 -11, -19 -6, 5 17, -14 13, 20 13, 20 2, 0 -12)'), 200000)) +MULTIPOINT(17 -11,-19 -6,5 17,-14 13,20 13,20 2,0 -12) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOINT(-15 12, 17 -12, -7 14, 1 6, 19 -10, 11 -9, 0 -17)'), 9999999)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOINT(-15 12, 17 -12, -7 14, 1 6, 19 -10, 11 -9, 0 -17)'), 9999999)) +MULTIPOINT(-15 12,17 -12,-7 14,1 6,19 -10,11 -9,0 -17) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOINT(3 -13, 18 -2, -5 -13, -12 1, 20 0, -6 14, 5 -4)'), 1234567890)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOINT(3 -13, 18 -2, -5 -13, -12 1, 20 0, -6 14, 5 -4)'), 1234567890)) +MULTIPOINT(3 -13,18 -2,-5 -13,-12 1,20 0,-6 14,5 -4) +##################################################################################### +# ST_SIMPLIFY(linestring) +##################################################################################### +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,5 5,10 10)'), 1)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,5 5,10 10)'), 1)) +LINESTRING(0 0,10 10) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,5 0,5 5)'), 3.5)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,5 0,5 5)'), 3.5)) +LINESTRING(0 0,5 0,5 5) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,5 0,5 5)'), 3.6)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,5 0,5 5)'), 3.6)) +LINESTRING(0 0,5 5) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,4 4,6 -6,10 0)'), 5)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,4 4,6 -6,10 0)'), 5)) +LINESTRING(0 0,4 4,6 -6,10 0) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,5 0,5 5,0 5,0 0)'), 3.5)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,5 0,5 5,0 5,0 0)'), 3.5)) +LINESTRING(0 0,5 0,5 5,0 5,0 0) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,5 0,5 5,0 5,0 0)'), 3.6)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,5 0,5 5,0 5,0 0)'), 3.6)) +LINESTRING(0 0,5 5,0 0) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,5 5,0 10,-5 5,0 0)'), 4.9)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,5 5,0 10,-5 5,0 0)'), 4.9)) +LINESTRING(0 0,5 5,0 10,-5 5,0 0) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,5 5,0 10,-5 5,0 0)'), 5)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,5 5,0 10,-5 5,0 0)'), 5)) +LINESTRING(0 0,0 10,0 0) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,1 1,3 -3,5 5,7 -7,9 9,10 10)'), 1)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,1 1,3 -3,5 5,7 -7,9 9,10 10)'), 1)) +LINESTRING(0 0,1 1,3 -3,5 5,7 -7,10 10) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,0 1,1 1,1 2,2 2,2 3,3 3,3 4,4 4,4 5,5 5)'), 0.6)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,0 1,1 1,1 2,2 2,2 3,3 3,3 4,4 4,4 5,5 5)'), 0.6)) +LINESTRING(0 0,0 1,1 1,1 2,2 2,4 5,5 5) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,0 1,1 1,1 2,2 2,2 3,3 3,3 4,4 4,4 5,5 5)'), 0.8)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,0 1,1 1,1 2,2 2,2 3,3 3,3 4,4 4,4 5,5 5)'), 0.8)) +LINESTRING(0 0,5 5) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,1 1,2 0,3 -1,4 0,5 1,6 0,7 -1,8 0,9 1,10 0)'), 0.9)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,1 1,2 0,3 -1,4 0,5 1,6 0,7 -1,8 0,9 1,10 0)'), 0.9)) +LINESTRING(0 0,1 1,3 -1,5 1,7 -1,9 1,10 0) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,1 1,2 0,3 -1,4 0,5 1,6 0,7 -1,8 0,9 1,10 0)'), 1)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,1 1,2 0,3 -1,4 0,5 1,6 0,7 -1,8 0,9 1,10 0)'), 1)) +LINESTRING(0 0,10 0) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,1 1,2 0,3 1,4 0,5 1,6 0,5 -1,4 0,3 -1,2 0,1 -1,0 0)'), 0.6)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,1 1,2 0,3 1,4 0,5 1,6 0,5 -1,4 0,3 -1,2 0,1 -1,0 0)'), 0.6)) +LINESTRING(0 0,1 1,2 0,3 1,4 0,5 1,6 0,5 -1,4 0,3 -1,2 0,1 -1,0 0) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,1 1,2 0,3 1,4 0,5 1,6 0,5 -1,4 0,3 -1,2 0,1 -1,0 0)'), 0.8)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,1 1,2 0,3 1,4 0,5 1,6 0,5 -1,4 0,3 -1,2 0,1 -1,0 0)'), 0.8)) +LINESTRING(0 0,1 1,6 0,5 -1,0 0) +##################################################################################### +# ST_SIMPLIFY(multilinestring) +##################################################################################### +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,5 5,10 10))'), 1)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,5 5,10 10))'), 1)) +MULTILINESTRING((0 0,10 10)) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,5 5,10 10),(0 0,5 0,5 5))'), 3.5)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,5 5,10 10),(0 0,5 0,5 5))'), 3.5)) +MULTILINESTRING((0 0,10 10),(0 0,5 0,5 5)) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,5 5,10 10),(0 0,5 0,5 5))'), 3.6)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,5 5,10 10),(0 0,5 0,5 5))'), 3.6)) +MULTILINESTRING((0 0,10 10),(0 0,5 5)) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,5 0,5 5),(0 0,5 0,5 5,0 5,0 0))'), 3.5)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,5 0,5 5),(0 0,5 0,5 5,0 5,0 0))'), 3.5)) +MULTILINESTRING((0 0,5 0,5 5),(0 0,5 0,5 5,0 5,0 0)) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,5 0,5 5),(0 0,5 0,5 5,0 5,0 0))'), 3.6)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,5 0,5 5),(0 0,5 0,5 5,0 5,0 0))'), 3.6)) +MULTILINESTRING((0 0,5 5),(0 0,5 5,0 0)) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,5 5,0 10),(0 0,-5 5,0 10))'), 4.9)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,5 5,0 10),(0 0,-5 5,0 10))'), 4.9)) +MULTILINESTRING((0 0,5 5,0 10),(0 0,-5 5,0 10)) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,5 5,0 10),(0 0,-5 5,0 10))'), 5)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,5 5,0 10),(0 0,-5 5,0 10))'), 5)) +MULTILINESTRING((0 0,0 10),(0 0,0 10)) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,1 1,3 -3,5 5,7 -7,9 9,10 10,0 0))'), 1)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,1 1,3 -3,5 5,7 -7,9 9,10 10,0 0))'), 1)) +MULTILINESTRING((0 0,1 1,3 -3,5 5,7 -7,10 10,0 0)) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,0 1,1 1,1 2,2 2,2 3,3 3,3 4,4 4,4 5,5 5),' + '(0 0,1 0,1 1,2 1,2 2,3 2,3 3,4 3,4 4,5 4,4 4))'), 0.6)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,0 1,1 1,1 2,2 2,2 3,3 3,3 4,4 4,4 5,5 5),' + '(0 0,1 0,1 1,2 1,2 2,3 2,3 3,4 3,4 4,5 4,4 4))'), 0.6)) +MULTILINESTRING((0 0,0 1,1 1,1 2,2 2,4 5,5 5),(0 0,1 0,1 1,2 1,4 4,5 4,4 4)) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,0 1,1 1,1 2,2 2,2 3,3 3,3 4,4 4,4 5,5 5),' + '(0 0,1 0,1 1,2 1,2 2,3 2,3 3,4 3,4 4,5 4,4 4))'), 0.7)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,0 1,1 1,1 2,2 2,2 3,3 3,3 4,4 4,4 5,5 5),' + '(0 0,1 0,1 1,2 1,2 2,3 2,3 3,4 3,4 4,5 4,4 4))'), 0.7)) +MULTILINESTRING((0 0,0 1,5 5),(0 0,1 0,1 1,5 4,4 4)) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,1 1,2 0,3 1,4 0,5 1,6 0),(6 0,5 -1,4 0,3 -1,2 0,1 -1,0 0))'), 0.6)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,1 1,2 0,3 1,4 0,5 1,6 0),(6 0,5 -1,4 0,3 -1,2 0,1 -1,0 0))'), 0.6)) +MULTILINESTRING((0 0,1 1,2 0,3 1,4 0,5 1,6 0),(6 0,5 -1,4 0,3 -1,2 0,1 -1,0 0)) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,1 1,2 0,3 1,4 0,5 1,6 0),(6 0,5 -1,4 0,3 -1,2 0,1 -1,0 0))'), 0.8)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,1 1,2 0,3 1,4 0,5 1,6 0),(6 0,5 -1,4 0,3 -1,2 0,1 -1,0 0))'), 0.8)) +MULTILINESTRING((0 0,1 1,6 0),(6 0,5 -1,0 0)) +##################################################################################### +# ST_SIMPLIFY(polygon) +##################################################################################### +# Invalid geometry in input. +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,4 4,6 -6,10 0,0 0,0 0,0 0))'), 5)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,4 4,6 -6,10 0,0 0,0 0,0 0))'), 5)) +POLYGON((0 0,4 4,6 -6,10 0,0 0)) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,0 5,5 5,5 0,0 0))'), 3.5)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,0 5,5 5,5 0,0 0))'), 3.5)) +POLYGON((0 0,0 5,5 5,5 0,0 0)) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,0 5,5 5,5 0,0 0))'), 3.6)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,0 5,5 5,5 0,0 0))'), 3.6)) +NULL +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,10 10,-10 10,0 0))'), 14)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,10 10,-10 10,0 0))'), 14)) +POLYGON((0 0,10 10,-10 10,0 0)) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,10 10,-10 10,0 0))'), 15)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,10 10,-10 10,0 0))'), 15)) +NULL +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,5 5,0 10,-5 5,0 0))'), 4.9)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,5 5,0 10,-5 5,0 0))'), 4.9)) +POLYGON((0 0,5 5,0 10,-5 5,0 0)) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,5 5,0 10,-5 5,0 0))'), 5)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,5 5,0 10,-5 5,0 0))'), 5)) +NULL +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,1 1,3 -3,5 5,7 -7,9 9,10 10,0 0))'), 1)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,1 1,3 -3,5 5,7 -7,9 9,10 10,0 0))'), 1)) +POLYGON((0 0,1 1,3 -3,5 5,7 -7,10 10,0 0)) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((5 0,10 10,-10 10,-5 0,-10 -10,10 -10,5 0))'), 4.9)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((5 0,10 10,-10 10,-5 0,-10 -10,10 -10,5 0))'), 4.9)) +POLYGON((5 0,10 10,-10 10,-5 0,-10 -10,10 -10,5 0)) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((5 0,10 10,-10 10,-5 0,-10 -10,10 -10,5 0))'), 5)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((5 0,10 10,-10 10,-5 0,-10 -10,10 -10,5 0))'), 5)) +POLYGON((5 0,10 10,-10 10,-10 -10,10 -10,5 0)) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((5 0,10 10,-10 10,-5 0,-10 -10,10 -10,5 0))'), 12)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((5 0,10 10,-10 10,-5 0,-10 -10,10 -10,5 0))'), 12)) +POLYGON((5 0,-10 10,-10 -10,5 0)) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((5 0,10 10,-10 10,-5 0,-10 -10,10 -10,5 0))'), 17)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((5 0,10 10,-10 10,-5 0,-10 -10,10 -10,5 0))'), 17)) +NULL +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0),(4 4,4 6,6 6,6 4,4 4))'), 1.4)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0),(4 4,4 6,6 6,6 4,4 4))'), 1.4)) +POLYGON((0 0,0 10,10 10,10 0,0 0),(4 4,4 6,6 6,6 4,4 4)) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0),(4 4,4 6,6 6,6 4,4 4))'), 1.5)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0),(4 4,4 6,6 6,6 4,4 4))'), 1.5)) +POLYGON((0 0,0 10,10 10,10 0,0 0)) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0),(4 4,4 6,6 6,6 4,4 4))'), 7)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0),(4 4,4 6,6 6,6 4,4 4))'), 7)) +POLYGON((0 0,0 10,10 10,10 0,0 0)) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0),(4 4,4 6,6 6,6 4,4 4))'), 7.1)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0),(4 4,4 6,6 6,6 4,4 4))'), 7.1)) +NULL +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((10 2,5 2,5 10,-5 10,-5 2,-10 2,-10 -2,-5 -2,-5 -10,5 -10,5 -2,10 -2,10 2))'), 3)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((10 2,5 2,5 10,-5 10,-5 2,-10 2,-10 -2,-5 -2,-5 -10,5 -10,5 -2,10 -2,10 2))'), 3)) +POLYGON((10 2,5 2,5 10,-5 10,-5 2,-10 2,-10 -2,-5 -2,-5 -10,5 -10,5 -2,10 -2,10 2)) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((10 2,5 2,5 10,-5 10,-5 2,-10 2,-10 -2,-5 -2,-5 -10,5 -10,5 -2,10 -2,10 2))'), 4)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((10 2,5 2,5 10,-5 10,-5 2,-10 2,-10 -2,-5 -2,-5 -10,5 -10,5 -2,10 -2,10 2))'), 4)) +POLYGON((10 2,5 2,5 10,-5 10,-10 -2,-5 -2,-5 -10,5 -10,10 2)) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((10 2,5 2,5 10,-5 10,-5 2,-10 2,-10 -2,-5 -2,-5 -10,5 -10,5 -2,10 -2,10 2))'), 5)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((10 2,5 2,5 10,-5 10,-5 2,-10 2,-10 -2,-5 -2,-5 -10,5 -10,5 -2,10 -2,10 2))'), 5)) +POLYGON((10 2,-5 10,-10 -2,5 -10,10 2)) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((10 2,5 2,5 10,-5 10,-5 2,-10 2,-10 -2,-5 -2,-5 -10,5 -10,5 -2,10 -2,10 2))'), 11)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((10 2,5 2,5 10,-5 10,-5 2,-10 2,-10 -2,-5 -2,-5 -10,5 -10,5 -2,10 -2,10 2))'), 11)) +NULL +##################################################################################### +# ST_SIMPLIFY(multipolygon) +##################################################################################### +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 5,5 5,5 0,0 0)))'), 3.5)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 5,5 5,5 0,0 0)))'), 3.5)) +MULTIPOLYGON(((0 0,0 5,5 5,5 0,0 0))) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 5,5 5,5 0,0 0)))'), 3.6)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 5,5 5,5 0,0 0)))'), 3.6)) +NULL +# Invalid geometry in input. +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,1 1,3 -3,5 5,7 -7,9 9,10 10,0 0)))'), 1)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,1 1,3 -3,5 5,7 -7,9 9,10 10,0 0)))'), 1)) +MULTIPOLYGON(((0 0,1 1,3 -3,5 5,7 -7,10 10,0 0))) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0),(4 4,4 6,6 6,6 4,4 4)))'), 1.4)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0),(4 4,4 6,6 6,6 4,4 4)))'), 1.4)) +MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0),(4 4,4 6,6 6,6 4,4 4))) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0),(4 4,4 6,6 6,6 4,4 4)))'), 1.5)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0),(4 4,4 6,6 6,6 4,4 4)))'), 1.5)) +MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0))) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0),(4 4,4 6,6 6,6 4,4 4)))'), 7)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0),(4 4,4 6,6 6,6 4,4 4)))'), 7)) +MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0))) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0),(4 4,4 6,6 6,6 4,4 4)))'), 7.1)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0),(4 4,4 6,6 6,6 4,4 4)))'), 7.1)) +NULL +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0)),((4 4,4 6,6 6,6 4,4 4,4 4,4 4,4 4)))'), 1.4)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0)),((4 4,4 6,6 6,6 4,4 4,4 4,4 4,4 4)))'), 1.4)) +MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0)),((4 4,4 6,6 6,6 4,4 4))) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0)),((4 4,4 6,6 6,6 4,4 4,4 4,4 4,4 4)))'), 1.5)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0)),((4 4,4 6,6 6,6 4,4 4,4 4,4 4,4 4)))'), 1.5)) +MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0))) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0)),((4 4,4 6,6 6,6 4,4 4,4 4,4 4,4 4)))'), 7)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0)),((4 4,4 6,6 6,6 4,4 4,4 4,4 4,4 4)))'), 7)) +MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0))) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0)),((4 4,4 6,6 6,6 4,4 4,4 4,4 4,4 4)))'), 7.1)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0)),((4 4,4 6,6 6,6 4,4 4,4 4,4 4,4 4)))'), 7.1)) +NULL +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 5,5 5,5 0,0 0)),((0 0,0 -5,-5 -5,-5 0,0 0)))'), 3.5)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 5,5 5,5 0,0 0)),((0 0,0 -5,-5 -5,-5 0,0 0)))'), 3.5)) +MULTIPOLYGON(((0 0,0 5,5 5,5 0,0 0)),((0 0,0 -5,-5 -5,-5 0,0 0))) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 5,5 5,5 0,0 0)),((0 0,0 -5,-5 -5,-5 0,0 0)))'), 3.6)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 5,5 5,5 0,0 0)),((0 0,0 -5,-5 -5,-5 0,0 0)))'), 3.6)) +NULL +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,10 10,-10 10,0 0)),((0 0,-10 -10,10 -10,0 0)))'), 14)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,10 10,-10 10,0 0)),((0 0,-10 -10,10 -10,0 0)))'), 14)) +MULTIPOLYGON(((0 0,10 10,-10 10,0 0)),((0 0,-10 -10,10 -10,0 0))) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,10 10,-10 10,0 0)),((0 0,-10 -10,10 -10,0 0)))'), 15)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,10 10,-10 10,0 0)),((0 0,-10 -10,10 -10,0 0)))'), 15)) +NULL +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,5 5,0 10,-5 5,0 0)),((0 0,-5 -5,0 -10,5 -5,0 0)))'), 4.9)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,5 5,0 10,-5 5,0 0)),((0 0,-5 -5,0 -10,5 -5,0 0)))'), 4.9)) +MULTIPOLYGON(((0 0,5 5,0 10,-5 5,0 0)),((0 0,-5 -5,0 -10,5 -5,0 0))) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,5 5,0 10,-5 5,0 0)),((0 0,-5 -5,0 -10,5 -5,0 0)))'), 5)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,5 5,0 10,-5 5,0 0)),((0 0,-5 -5,0 -10,5 -5,0 0)))'), 5)) +NULL +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,4 6,0 10,-4 6,0 0)),((0 0,-6 4,-10 0,-6 -4,0 0)),' + '((0 0,-4 -6,0 -10,4 -6,0 0)),((0 0,6 -4,10 0,6 4,0 0)))'), 3)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,4 6,0 10,-4 6,0 0)),((0 0,-6 4,-10 0,-6 -4,0 0)),' + '((0 0,-4 -6,0 -10,4 -6,0 0)),((0 0,6 -4,10 0,6 4,0 0)))'), 3)) +MULTIPOLYGON(((0 0,4 6,0 10,-4 6,0 0)),((0 0,-6 4,-10 0,-6 -4,0 0)),((0 0,-4 -6,0 -10,4 -6,0 0)),((0 0,6 -4,10 0,6 4,0 0))) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,4 6,0 10,-4 6,0 0)),((0 0,-6 4,-10 0,-6 -4,0 0)),' + '((0 0,-4 -6,0 -10,4 -6,0 0)),((0 0,6 -4,10 0,6 4,0 0)))'), 4)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,4 6,0 10,-4 6,0 0)),((0 0,-6 4,-10 0,-6 -4,0 0)),' + '((0 0,-4 -6,0 -10,4 -6,0 0)),((0 0,6 -4,10 0,6 4,0 0)))'), 4)) +NULL +##################################################################################### +# ST_SIMPLIFY(geometrycollection) +##################################################################################### +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(POINT(0 0))'), 1)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(POINT(0 0))'), 1)) +GEOMETRYCOLLECTION(POINT(0 0)) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(MULTIPOINT(0 0,1 0,1 1,2 0,2 2))'), 1)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(MULTIPOINT(0 0,1 0,1 1,2 0,2 2))'), 1)) +GEOMETRYCOLLECTION(MULTIPOINT(0 0,1 0,1 1,2 0,2 2)) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(LINESTRING(0 0,5 0,5 5,0 5,0 0))'), 3.5)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(LINESTRING(0 0,5 0,5 5,0 5,0 0))'), 3.5)) +GEOMETRYCOLLECTION(LINESTRING(0 0,5 0,5 5,0 5,0 0)) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(LINESTRING(0 0,5 0,5 5,0 5,0 0))'), 3.6)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(LINESTRING(0 0,5 0,5 5,0 5,0 0))'), 3.6)) +GEOMETRYCOLLECTION(LINESTRING(0 0,5 5,0 0)) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(LINESTRING(0 0,4 4,6 -6,10 0))'), 5)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(LINESTRING(0 0,4 4,6 -6,10 0))'), 5)) +GEOMETRYCOLLECTION(LINESTRING(0 0,4 4,6 -6,10 0)) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(MULTILINESTRING((0 0,0 4,4 4),(0 0,5 0,5 5,0 5,0 0)))'), 3.5)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(MULTILINESTRING((0 0,0 4,4 4),(0 0,5 0,5 5,0 5,0 0)))'), 3.5)) +GEOMETRYCOLLECTION(MULTILINESTRING((0 0,4 4),(0 0,5 0,5 5,0 5,0 0))) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(MULTILINESTRING((0 0,0 5,5 5),(0 0,5 0,5 5,0 5,0 0)))'), 3.6)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(MULTILINESTRING((0 0,0 5,5 5),(0 0,5 0,5 5,0 5,0 0)))'), 3.6)) +GEOMETRYCOLLECTION(MULTILINESTRING((0 0,5 5),(0 0,5 5,0 0))) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(MULTILINESTRING((0 0,1 1,3 -3,5 5,7 -7,9 9,10 10,0 0)))'), 1)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(MULTILINESTRING((0 0,1 1,3 -3,5 5,7 -7,9 9,10 10,0 0)))'), 1)) +GEOMETRYCOLLECTION(MULTILINESTRING((0 0,1 1,3 -3,5 5,7 -7,10 10,0 0))) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0)))'), 7)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0)))'), 7)) +GEOMETRYCOLLECTION(POLYGON((0 0,0 10,10 10,10 0,0 0))) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0)))'), 8)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0)))'), 8)) +NULL +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0)),((0 0,0 -8,-8 -8,-8 0,0 0))))'), 7)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0)),((0 0,0 -8,-8 -8,-8 0,0 0))))'), 7)) +GEOMETRYCOLLECTION(MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0)))) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0)),((0 0,0 -8,-8 -8,-8 0,0 0))))'), 8)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0)),((0 0,0 -8,-8 -8,-8 0,0 0))))'), 8)) +NULL +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION()'), 1)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION()'), 1)) +NULL +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION())'), 1)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION())'), 1)) +NULL +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(), LINESTRING(0 0,5 0,5 5))'), 3.5)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(), LINESTRING(0 0,5 0,5 5))'), 3.5)) +NULL +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(), LINESTRING(0 0,5 0,5 5))'), 3.6)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(), LINESTRING(0 0,5 0,5 5))'), 3.6)) +NULL +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(), POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0)))'), 7)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(), POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0)))'), 7)) +NULL +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(), POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0)))'), 8)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(), POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0)))'), 8)) +NULL +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(' + 'POINT(0 0),' + 'LINESTRING(0 0,0 5,5 5,5 0,0 0),' + 'POLYGON((0 0,0 -5,-5 -5,-5 0,0 0)))'), 3.5)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(' + 'POINT(0 0),' + 'LINESTRING(0 0,0 5,5 5,5 0,0 0),' + +GEOMETRYCOLLECTION(POINT(0 0),LINESTRING(0 0,0 5,5 5,5 0,0 0),POLYGON((0 0,0 -5,-5 -5,-5 0,0 0))) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(' + 'POINT(0 0),' + 'LINESTRING(0 0,0 5,5 5,5 0,0 0),' + 'POLYGON((0 0,0 -5,-5 -5,-5 0,0 0)))'), 3.6)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(' + 'POINT(0 0),' + 'LINESTRING(0 0,0 5,5 5,5 0,0 0),' + +GEOMETRYCOLLECTION(POINT(0 0),LINESTRING(0 0,5 5,0 0)) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(' + 'LINESTRING(0 0,5 5,0 10,-5 5,0 0),' + 'POLYGON((0 0,-5 -5,0 -10,5 -5,0 0)))'), 4.9)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(' + 'LINESTRING(0 0,5 5,0 10,-5 5,0 0),' + 'POLYGON((0 0,-5 -5,0 -10,5 -5,0 0)))'), 4.9)) +GEOMETRYCOLLECTION(LINESTRING(0 0,5 5,0 10,-5 5,0 0),POLYGON((0 0,-5 -5,0 -10,5 -5,0 0))) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(' + 'LINESTRING(0 0,5 5,0 10,-5 5,0 0),' + 'POLYGON((0 0,-5 -5,0 -10,5 -5,0 0)))'), 5)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(' + 'LINESTRING(0 0,5 5,0 10,-5 5,0 0),' + 'POLYGON((0 0,-5 -5,0 -10,5 -5,0 0)))'), 5)) +GEOMETRYCOLLECTION(LINESTRING(0 0,0 10,0 0)) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(' + 'MULTILINESTRING((0 0,5 5,0 10,-5 5,0 0),(0 0,-5 -5,0 -10,5 -5,0 0)),' + 'MULTIPOLYGON(((0 0,5 -5,10 0,5 5,0 0)),((0 0,-5 5,-10 0,-5 -5,0 0))))'), 4.9)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(' + 'MULTILINESTRING((0 0,5 5,0 10,-5 5,0 0),(0 0,-5 -5,0 -10,5 -5,0 0)),' + 'MULTIPOLYGON(((0 0,5 +GEOMETRYCOLLECTION(MULTILINESTRING((0 0,5 5,0 10,-5 5,0 0),(0 0,-5 -5,0 -10,5 -5,0 0)),MULTIPOLYGON(((0 0,5 -5,10 0,5 5,0 0)),((0 0,-5 5,-10 0,-5 -5,0 0)))) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(' + 'MULTILINESTRING((0 0,5 5,0 10,-5 5,0 0),(0 0,-5 -5,0 -10,5 -5,0 0)),' + 'MULTIPOLYGON(((0 0,5 -5,10 0,5 5,0 0)),((0 0,-5 5,-10 0,-5 -5,0 0))))'), 5)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(' + 'MULTILINESTRING((0 0,5 5,0 10,-5 5,0 0),(0 0,-5 -5,0 -10,5 -5,0 0)),' + 'MULTIPOLYGON(((0 0,5 +GEOMETRYCOLLECTION(MULTILINESTRING((0 0,0 10,0 0),(0 0,0 -10,0 0))) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(' + 'POINT(10 10),' + 'MULTIPOINT(0 0,1 1,2 2,3 3,4 4,5 5),' + 'LINESTRING(0 0,5 0,0 -1,5 -1,0 -2,5 -2,0 -3,5 -3,0 -4,5 -4,0 0))'), 1)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(' + 'POINT(10 10),' + 'MULTIPOINT(0 0,1 1,2 2,3 3,4 4,5 5),' + +GEOMETRYCOLLECTION(POINT(10 10),MULTIPOINT(0 0,1 1,2 2,3 3,4 4,5 5),LINESTRING(0 0,5 0,0 -1,5 -1,0 -3,5 -3,0 -4,5 -4,0 0)) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(' + 'POINT(10 10),' + 'MULTIPOINT(0 0,1 1,2 2,3 3,4 4,5 5),' + 'LINESTRING(0 0,5 0,0 -1,5 -1,0 -2,5 -2,0 -3,5 -3,0 -4,5 -4,0 0))'), 2)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(' + 'POINT(10 10),' + 'MULTIPOINT(0 0,1 1,2 2,3 3,4 4,5 5),' + +GEOMETRYCOLLECTION(POINT(10 10),MULTIPOINT(0 0,1 1,2 2,3 3,4 4,5 5),LINESTRING(0 0,5 0,0 -1,5 -3,0 -4,5 -4,0 0)) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(' + 'POINT(10 10),' + 'MULTIPOINT(0 0,1 1,2 2,3 3,4 4,5 5),' + 'LINESTRING(0 0,5 0,0 -1,5 -1,0 -2,5 -2,0 -3,5 -3,0 -4,5 -4,0 0))'), 3)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(' + 'POINT(10 10),' + 'MULTIPOINT(0 0,1 1,2 2,3 3,4 4,5 5),' + +GEOMETRYCOLLECTION(POINT(10 10),MULTIPOINT(0 0,1 1,2 2,3 3,4 4,5 5),LINESTRING(0 0,5 0,0 -4,5 -4,0 0)) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(' + 'POINT(10 10),' + 'MULTIPOINT(0 0,1 1,2 2,3 3,4 4,5 5),' + 'LINESTRING(0 0,5 0,0 -1,5 -1,0 -2,5 -2,0 -3,5 -3,0 -4,5 -4,0 0))'), 4)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(' + 'POINT(10 10),' + 'MULTIPOINT(0 0,1 1,2 2,3 3,4 4,5 5),' + +GEOMETRYCOLLECTION(POINT(10 10),MULTIPOINT(0 0,1 1,2 2,3 3,4 4,5 5),LINESTRING(0 0,5 -4,0 0)) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(' + 'POINT(10 10),' + 'MULTIPOINT(0 0,1 1,2 2,3 3,4 4,5 5),' + 'LINESTRING(0 0,5 0,0 -1,5 -1,0 -2,5 -2,0 -3,5 -3,0 -4,5 -4,0 0))'), 7)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(' + 'POINT(10 10),' + 'MULTIPOINT(0 0,1 1,2 2,3 3,4 4,5 5),' + +GEOMETRYCOLLECTION(POINT(10 10),MULTIPOINT(0 0,1 1,2 2,3 3,4 4,5 5),LINESTRING(0 0,0 0)) +# Invalid geometry in input. +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(' + 'POINT(0 0),' + 'LINESTRING(0 0,2.5 2.5,0 5,-2.5 7.5,0 10),' + 'POLYGON((0 0,5 0,0 -1,5 -1,0 -2,5 -2,0 -3,5 -3,0 -4,5 -4,0 0)),' + 'MULTIPOINT(0 0,1 1,2 2,3 3,4 4,5 5),' + 'MULTILINESTRING((0 0,1 1,-1 1,0 0),(0 0,2 2,-2 2,0 0),(0 0,3 3,-3 3,0 0),(0 0,4 4,-4 4,0 0)),' + 'MULTIPOLYGON(((0 0,2.5 2.5,-2.5 2.5,0 0)),((0 0,-2.5 -2.5,2.5 -2.5,0 0))))'), 1)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(' + 'POINT(0 0),' + 'LINESTRING(0 0,2.5 2.5,0 5,-2.5 7.5,0 10),' + +GEOMETRYCOLLECTION(POINT(0 0),LINESTRING(0 0,2.5 2.5,-2.5 7.5,0 10),POLYGON((0 0,5 0,0 -1,5 -1,0 -3,5 -3,0 -4,5 -4,0 0)),MULTIPOINT(0 0,1 1,2 2,3 3,4 4,5 5),MULTILINESTRING((0 0,1 1,-1 1,0 0),(0 0,2 2,-2 2,0 0),(0 0,3 3,-3 3,0 0),(0 0,4 4,-4 4,0 0)),MULTIPOLYGON(((0 0,2.5 2.5,-2.5 2.5,0 0)),((0 0,-2.5 -2.5,2.5 -2.5,0 0)))) +# Invalid geometry in input. +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(' + 'POINT(0 0),' + 'LINESTRING(0 0,2.5 2.5,0 5,-2.5 7.5,0 10),' + 'POLYGON((0 0,5 0,0 -1,5 -1,0 -2,5 -2,0 -3,5 -3,0 -4,5 -4,0 0)),' + 'MULTIPOINT(0 0,1 1,2 2,3 3,4 4,5 5),' + 'MULTILINESTRING((0 0,1 1,-1 1,0 0),(0 0,2 2,-2 2,0 0),(0 0,3 3,-3 3,0 0),(0 0,4 4,-4 4,0 0)),' + 'MULTIPOLYGON(((0 0,2.5 2.5,-2.5 2.5,0 0)),((0 0,-2.5 -2.5,2.5 -2.5,0 0))))'), 2)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(' + 'POINT(0 0),' + 'LINESTRING(0 0,2.5 2.5,0 5,-2.5 7.5,0 10),' + +GEOMETRYCOLLECTION(POINT(0 0),LINESTRING(0 0,2.5 2.5,-2.5 7.5,0 10),POLYGON((0 0,5 0,0 -1,5 -3,0 -4,5 -4,0 0)),MULTIPOINT(0 0,1 1,2 2,3 3,4 4,5 5),MULTILINESTRING((0 0,0 0),(0 0,2 2,-2 2,0 0),(0 0,3 3,-3 3,0 0),(0 0,4 4,-4 4,0 0)),MULTIPOLYGON(((0 0,2.5 2.5,-2.5 2.5,0 0)),((0 0,-2.5 -2.5,2.5 -2.5,0 0)))) +# Invalid geometry in input. +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(' + 'POINT(0 0),' + 'LINESTRING(0 0,2.5 2.5,0 5,-2.5 7.5,0 10),' + 'POLYGON((0 0,5 0,0 -1,5 -1,0 -2,5 -2,0 -3,5 -3,0 -4,5 -4,0 0)),' + 'MULTIPOINT(0 0,1 1,2 2,3 3,4 4,5 5),' + 'MULTILINESTRING((0 0,1 1,-1 1,0 0),(0 0,2 2,-2 2,0 0),(0 0,3 3,-3 3,0 0),(0 0,4 4,-4 4,0 0)),' + 'MULTIPOLYGON(((0 0,2.5 2.5,-2.5 2.5,0 0)),((0 0,-2.5 -2.5,2.5 -2.5,0 0))))'), 3)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(' + 'POINT(0 0),' + 'LINESTRING(0 0,2.5 2.5,0 5,-2.5 7.5,0 10),' + +GEOMETRYCOLLECTION(POINT(0 0),LINESTRING(0 0,0 10),POLYGON((0 0,5 0,0 -4,5 -4,0 0)),MULTIPOINT(0 0,1 1,2 2,3 3,4 4,5 5),MULTILINESTRING((0 0,0 0),(0 0,0 0),(0 0,3 3,-3 3,0 0),(0 0,4 4,-4 4,0 0)),MULTIPOLYGON(((0 0,2.5 2.5,-2.5 2.5,0 0)),((0 0,-2.5 -2.5,2.5 -2.5,0 0)))) +# Invalid geometry in input. +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(' + 'POINT(0 0),' + 'LINESTRING(0 0,2.5 2.5,0 5,-2.5 7.5,0 10),' + 'POLYGON((0 0,5 0,0 -1,5 -1,0 -2,5 -2,0 -3,5 -3,0 -4,5 -4,0 0)),' + 'MULTIPOINT(0 0,1 1,2 2,3 3,4 4,5 5),' + 'MULTILINESTRING((0 0,1 1,-1 1,0 0),(0 0,2 2,-2 2,0 0),(0 0,3 3,-3 3,0 0),(0 0,4 4,-4 4,0 0)),' + 'MULTIPOLYGON(((0 0,2.5 2.5,-2.5 2.5,0 0)),((0 0,-2.5 -2.5,2.5 -2.5,0 0))))'), 4)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(' + 'POINT(0 0),' + 'LINESTRING(0 0,2.5 2.5,0 5,-2.5 7.5,0 10),' + +GEOMETRYCOLLECTION(POINT(0 0),LINESTRING(0 0,0 10),MULTIPOINT(0 0,1 1,2 2,3 3,4 4,5 5),MULTILINESTRING((0 0,0 0),(0 0,0 0),(0 0,3 3,-3 3,0 0),(0 0,4 4,-4 4,0 0))) +##################################################################################### +# ST_ASTEXT(ST_SIMPLIFY(geometry) with different SRID values +##################################################################################### +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT(@star_center,-1024), 1)); +ERROR HY000: st_simplify has not been implemented for geographic spatial reference systems. +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT(@star_all_points,-1), 1)); +ERROR HY000: st_simplify has not been implemented for geographic spatial reference systems. +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT(@star_top_to_center,0), 1)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT(@star_top_to_center,0), 1)) +LINESTRING(15 25,15 10) +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT(@star_lines_near_vertical,4326), 1)); +ERROR HY000: st_simplify has not been implemented for geographic spatial reference systems. +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT(@star_collection_elems,4294967295000), 1)); +ERROR HY000: st_simplify has not been implemented for geographic spatial reference systems. +##################################################################################### +# Invalid function calls +##################################################################################### +SELECT ST_ASTEXT(ST_SIMPLIFY()); +ERROR 42000: Incorrect parameter count in the call to native function 'ST_SIMPLIFY' +SELECT ST_ASTEXT(ST_SIMPLIFY(NULL)); +ERROR 42000: Incorrect parameter count in the call to native function 'ST_SIMPLIFY' +SELECT ST_ASTEXT(ST_SIMPLIFY(NULL,1)); +ST_ASTEXT(ST_SIMPLIFY(NULL,1)) +NULL +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT()'), 1)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT()'), 1)) +NULL +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING()'), 1)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING()'), 1)) +NULL +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON(())'), 1)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON(())'), 1)) +NULL +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOINT()'), 1)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOINT()'), 1)) +NULL +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING(())'), 1)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING(())'), 1)) +NULL +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON((()))'), 1)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON((()))'), 1)) +NULL +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(a 0)'), 1)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(a 0)'), 1)) +NULL +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(! 0)'), 1)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(! 0)'), 1)) +NULL +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT('!' 0)'), 1)); +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '!' 0)'), 1))' at line 1 +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(12,34 0)'), 1)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(12,34 0)'), 1)) +NULL +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(a 0,10 10)'), 1)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(a 0,10 10)'), 1)) +NULL +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,! 10)'), 1)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,! 10)'), 1)) +NULL +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING('!' 0,10 10)'), 1)); +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '!' 0,10 10)'), 1))' at line 1 +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(12,34 0,10 10)'), 1)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(12,34 0,10 10)'), 1)) +NULL +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((a 0,10 10,10 0,0 0))'), 1)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((a 0,10 10,10 0,0 0))'), 1)) +NULL +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,! 10,10 0,0 0))'), 1)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,! 10,10 0,0 0))'), 1)) +NULL +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON(('!' 0,10 10,10 0,0 0))'), 1)); +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '!' 0,10 10,10 0,0 0))'), 1))' at line 1 +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((12,34 0,10 10,10 0,0 0))'), 1)); +ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((12,34 0,10 10,10 0,0 0))'), 1)) +NULL +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0))'), 0)); +ERROR HY000: Incorrect arguments to st_simplify +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0))'), -1)); +ERROR HY000: Incorrect arguments to st_simplify +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0))'), -1024)); +ERROR HY000: Incorrect arguments to st_simplify +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0))'), 'a')); +ERROR HY000: Incorrect arguments to st_simplify +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0))'), a)); +ERROR 42S22: Unknown column 'a' in 'field list' +# Clean up +DROP TABLE gis_geometrycollection; diff --git a/mysql-test/main/spatial_utility_function_simplify.test b/mysql-test/main/spatial_utility_function_simplify.test new file mode 100644 index 00000000000..7f80601c84f --- /dev/null +++ b/mysql-test/main/spatial_utility_function_simplify.test @@ -0,0 +1,503 @@ +# Copyright (c) 2015, Oracle and/or its affiliates +# Copyright (c) 2024, MariaDB Corporation. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; version 2 of the License. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA + +############################################################################################ +# Creating the spatial objects # +############################################################################################ + +--echo # Creating the spatial Geometry object +USE test; + +CREATE TABLE gis_geometrycollection (fid INTEGER NOT NULL PRIMARY KEY, g GEOMETRY); + +############################################################################################ +# Inserting the values specific to the spatial objects # +############################################################################################ + +# Geometric elements constructing a star and some of its elememts as base +SET @star_elem_vertical= 'POLYGON((5 0,15 25,25 0,15 5,5 0))'; +SET @star_elem_horizontal= 'POLYGON((25 0,0 15,30 15,22 10,25 0))'; +SET @star_center= 'POINT(15 10)'; +SET @star_top= 'POINT(15 25)'; +SET @star_bottom_left= 'POINT(5 0)'; +SET @star_bottom_right= 'POINT(25 0)'; +SET @star_bottom_points= 'MULTIPOINT(5 0,25 0)'; +SET @star_all_points= 'MULTIPOINT(5 0,25 0,15 10,15 25)'; +SET @star_line_horizontal= 'LINESTRING(10 15,20 15)'; +SET @star_line_vertical= 'LINESTRING(15 5,15 25)'; +SET @star_top_to_center= 'LINESTRING(15 25,15 10)'; +SET @star_lines_near_horizontal= 'MULTILINESTRING((25 0,0 15,15 30,0 5))'; +SET @star_lines_near_vertical= 'MULTILINESTRING((0 5,15 25,0 25))'; +SET @star= 'POLYGON((5 0,7 10,0 15,10 15,15 25,20 15,30 15,22 10,25 0,15 5,5 0))'; +SET @star_of_elems='MULTIPOLYGON(((5 0,15 25,25 0,15 5,5 0)),((25 0,0 15,30 15,22 10,25 0)))'; +SET @star_collection_elems='GEOMETRYCOLLECTION(MULTIPOLYGON(((5 0,15 25,25 0,15 5,5 0)),((25 0,0 15,30 15,22 10,25 0))),POLYGON((5 0,7 10,0 15,10 15,15 25,20 15,30 15,22 10,25 0,15 5,5 0)),LINESTRING(15 25,15 10),MULTIPOINT(5 0,25 0),POINT(15 25))'; +SET @star_collection_multilinestr='GEOMETRYCOLLECTION(MULTIPOLYGON(((5 0,15 25,25 0,15 5,5 0)),((25 0,0 15,30 15,22 10,25 0))),POLYGON((5 0,7 10,0 15,10 15,15 25,20 15,30 15,22 10,25 0,15 5,5 0)),MULTILINESTRING((25 0,0 15,15 30,0 5)),LINESTRING(15 25,15 10),MULTIPOINT(5 0,25 0),POINT(15 25))'; + +--disable_warnings +INSERT INTO gis_geometrycollection VALUES + (100,ST_GEOMFROMTEXT(@star)), + (101,ST_GEOMFROMTEXT(@star_elem_vertical)), + (102,ST_GEOMFROMTEXT(@star_elem_horizontal)), + (103,ST_GEOMFROMTEXT(@star_of_elems)), + (104,ST_GEOMFROMTEXT(@star_top)), + (105,ST_GEOMFROMTEXT(@star_center)), + (106,ST_GEOMFROMTEXT(@star_bottom_left)), + (107,ST_GEOMFROMTEXT(@star_bottom_right)), + (108,ST_GEOMFROMTEXT(@star_bottom_points)), + (109,ST_GEOMFROMTEXT(@star_all_points)), + (110,ST_GEOMFROMTEXT(@star_line_horizontal)), + (111,ST_GEOMFROMTEXT(@star_line_vertical)), + (112,ST_GEOMFROMTEXT(@star_top_to_center)), + (113,ST_GEOMFROMTEXT(@star_lines_near_horizontal)), + (114,ST_GEOMFROMTEXT(@star_lines_near_vertical)), + (115,ST_GEOMFROMTEXT(@star_collection_elems)), + (116,ST_GEOMFROMTEXT(@star_collection_multilinestr)); +--enable_warnings + +--echo # Checking the integrity of the above create/insert statements + +--echo # 17 rows. +SELECT count(ST_ASTEXT(g) != 'NULL') FROM gis_geometrycollection; + +--echo ##################################################################################### +--echo # ST_SIMPLIFY(point) +--echo ##################################################################################### + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(17 14)'), 1)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(-8 2)'), 2)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(9 0)'), 3)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(10 -8)'), 4)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(20 -2)'), 5)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(7 13)'), 10)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(-16 11)'), 1000)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(-5 -2)'), 2000000)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(-10 6)'), 1234567890)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(-16 -8)'), 111111111111)); + +--echo ##################################################################################### +--echo # ST_SIMPLIFY(multipoint) +--echo ##################################################################################### + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOINT(19 -4, -2 -6, -8 2)'), 1)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOINT(-3 14, 19 8, 10 -8)'), 2)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOINT(1 -8, -1 12, -11 16)'), 3)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOINT(-16 11, -2 -7, -11 11)'), 4)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOINT(19 12, 0 9, 5 10, 20 -16, 7 -17, 9 -18, 19 -7)'), 10)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOINT(-1 11, -17 -11, -15 16, 6 -6, 11 -13, -4 -12, -13 -5)'), 1000)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOINT(17 -11, -19 -6, 5 17, -14 13, 20 13, 20 2, 0 -12)'), 200000)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOINT(-15 12, 17 -12, -7 14, 1 6, 19 -10, 11 -9, 0 -17)'), 9999999)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOINT(3 -13, 18 -2, -5 -13, -12 1, 20 0, -6 14, 5 -4)'), 1234567890)); + +--echo ##################################################################################### +--echo # ST_SIMPLIFY(linestring) +--echo ##################################################################################### + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,5 5,10 10)'), 1)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,5 0,5 5)'), 3.5)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,5 0,5 5)'), 3.6)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,4 4,6 -6,10 0)'), 5)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,5 0,5 5,0 5,0 0)'), 3.5)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,5 0,5 5,0 5,0 0)'), 3.6)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,5 5,0 10,-5 5,0 0)'), 4.9)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,5 5,0 10,-5 5,0 0)'), 5)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,1 1,3 -3,5 5,7 -7,9 9,10 10)'), 1)); + +# TODO Bug #33739281 Some gis functions give different results with gcc11 in optimized mode on ARM +# SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,0 1,1 1,1 2,2 2,2 3,3 3,3 4,4 4,4 5,5 5)'), 0.5)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,0 1,1 1,1 2,2 2,2 3,3 3,3 4,4 4,4 5,5 5)'), 0.6)); + +# TODO Bug #33739281 Some gis functions give different results with gcc11 in optimized mode on ARM +# SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,0 1,1 1,1 2,2 2,2 3,3 3,3 4,4 4,4 5,5 5)'), 0.7)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,0 1,1 1,1 2,2 2,2 3,3 3,3 4,4 4,4 5,5 5)'), 0.8)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,1 1,2 0,3 -1,4 0,5 1,6 0,7 -1,8 0,9 1,10 0)'), 0.9)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,1 1,2 0,3 -1,4 0,5 1,6 0,7 -1,8 0,9 1,10 0)'), 1)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,1 1,2 0,3 1,4 0,5 1,6 0,5 -1,4 0,3 -1,2 0,1 -1,0 0)'), 0.6)); + +# TODO Bug #33739281 Some gis functions give different results with gcc11 in optimized mode on ARM +# SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,1 1,2 0,3 1,4 0,5 1,6 0,5 -1,4 0,3 -1,2 0,1 -1,0 0)'), 0.7)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,1 1,2 0,3 1,4 0,5 1,6 0,5 -1,4 0,3 -1,2 0,1 -1,0 0)'), 0.8)); + +--echo ##################################################################################### +--echo # ST_SIMPLIFY(multilinestring) +--echo ##################################################################################### + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,5 5,10 10))'), 1)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,5 5,10 10),(0 0,5 0,5 5))'), 3.5)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,5 5,10 10),(0 0,5 0,5 5))'), 3.6)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,5 0,5 5),(0 0,5 0,5 5,0 5,0 0))'), 3.5)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,5 0,5 5),(0 0,5 0,5 5,0 5,0 0))'), 3.6)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,5 5,0 10),(0 0,-5 5,0 10))'), 4.9)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,5 5,0 10),(0 0,-5 5,0 10))'), 5)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,1 1,3 -3,5 5,7 -7,9 9,10 10,0 0))'), 1)); + +# TODO Bug #33739281 Some gis functions give different results with gcc11 in optimized mode on ARM +# SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,0 1,1 1,1 2,2 2,2 3,3 3,3 4,4 4,4 5,5 5),' +# '(0 0,1 0,1 1,2 1,2 2,3 2,3 3,4 3,4 4,5 4,4 4))'), 0.5)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,0 1,1 1,1 2,2 2,2 3,3 3,3 4,4 4,4 5,5 5),' + '(0 0,1 0,1 1,2 1,2 2,3 2,3 3,4 3,4 4,5 4,4 4))'), 0.6)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,0 1,1 1,1 2,2 2,2 3,3 3,3 4,4 4,4 5,5 5),' + '(0 0,1 0,1 1,2 1,2 2,3 2,3 3,4 3,4 4,5 4,4 4))'), 0.7)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,1 1,2 0,3 1,4 0,5 1,6 0),(6 0,5 -1,4 0,3 -1,2 0,1 -1,0 0))'), 0.6)); + +# TODO Bug #33739281 Some gis functions give different results with gcc11 in optimized mode on ARM +# SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,1 1,2 0,3 1,4 0,5 1,6 0),(6 0,5 -1,4 0,3 -1,2 0,1 -1,0 0))'), 0.7)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,1 1,2 0,3 1,4 0,5 1,6 0),(6 0,5 -1,4 0,3 -1,2 0,1 -1,0 0))'), 0.8)); + +--echo ##################################################################################### +--echo # ST_SIMPLIFY(polygon) +--echo ##################################################################################### + +--echo # Invalid geometry in input. +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,4 4,6 -6,10 0,0 0,0 0,0 0))'), 5)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,0 5,5 5,5 0,0 0))'), 3.5)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,0 5,5 5,5 0,0 0))'), 3.6)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,10 10,-10 10,0 0))'), 14)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,10 10,-10 10,0 0))'), 15)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,5 5,0 10,-5 5,0 0))'), 4.9)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,5 5,0 10,-5 5,0 0))'), 5)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,1 1,3 -3,5 5,7 -7,9 9,10 10,0 0))'), 1)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((5 0,10 10,-10 10,-5 0,-10 -10,10 -10,5 0))'), 4.9)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((5 0,10 10,-10 10,-5 0,-10 -10,10 -10,5 0))'), 5)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((5 0,10 10,-10 10,-5 0,-10 -10,10 -10,5 0))'), 12)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((5 0,10 10,-10 10,-5 0,-10 -10,10 -10,5 0))'), 17)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0),(4 4,4 6,6 6,6 4,4 4))'), 1.4)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0),(4 4,4 6,6 6,6 4,4 4))'), 1.5)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0),(4 4,4 6,6 6,6 4,4 4))'), 7)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0),(4 4,4 6,6 6,6 4,4 4))'), 7.1)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((10 2,5 2,5 10,-5 10,-5 2,-10 2,-10 -2,-5 -2,-5 -10,5 -10,5 -2,10 -2,10 2))'), 3)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((10 2,5 2,5 10,-5 10,-5 2,-10 2,-10 -2,-5 -2,-5 -10,5 -10,5 -2,10 -2,10 2))'), 4)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((10 2,5 2,5 10,-5 10,-5 2,-10 2,-10 -2,-5 -2,-5 -10,5 -10,5 -2,10 -2,10 2))'), 5)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((10 2,5 2,5 10,-5 10,-5 2,-10 2,-10 -2,-5 -2,-5 -10,5 -10,5 -2,10 -2,10 2))'), 11)); + +--echo ##################################################################################### +--echo # ST_SIMPLIFY(multipolygon) +--echo ##################################################################################### + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 5,5 5,5 0,0 0)))'), 3.5)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 5,5 5,5 0,0 0)))'), 3.6)); + +--echo # Invalid geometry in input. +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,1 1,3 -3,5 5,7 -7,9 9,10 10,0 0)))'), 1)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0),(4 4,4 6,6 6,6 4,4 4)))'), 1.4)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0),(4 4,4 6,6 6,6 4,4 4)))'), 1.5)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0),(4 4,4 6,6 6,6 4,4 4)))'), 7)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0),(4 4,4 6,6 6,6 4,4 4)))'), 7.1)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0)),((4 4,4 6,6 6,6 4,4 4,4 4,4 4,4 4)))'), 1.4)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0)),((4 4,4 6,6 6,6 4,4 4,4 4,4 4,4 4)))'), 1.5)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0)),((4 4,4 6,6 6,6 4,4 4,4 4,4 4,4 4)))'), 7)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0)),((4 4,4 6,6 6,6 4,4 4,4 4,4 4,4 4)))'), 7.1)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 5,5 5,5 0,0 0)),((0 0,0 -5,-5 -5,-5 0,0 0)))'), 3.5)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 5,5 5,5 0,0 0)),((0 0,0 -5,-5 -5,-5 0,0 0)))'), 3.6)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,10 10,-10 10,0 0)),((0 0,-10 -10,10 -10,0 0)))'), 14)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,10 10,-10 10,0 0)),((0 0,-10 -10,10 -10,0 0)))'), 15)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,5 5,0 10,-5 5,0 0)),((0 0,-5 -5,0 -10,5 -5,0 0)))'), 4.9)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,5 5,0 10,-5 5,0 0)),((0 0,-5 -5,0 -10,5 -5,0 0)))'), 5)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,4 6,0 10,-4 6,0 0)),((0 0,-6 4,-10 0,-6 -4,0 0)),' + '((0 0,-4 -6,0 -10,4 -6,0 0)),((0 0,6 -4,10 0,6 4,0 0)))'), 3)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,4 6,0 10,-4 6,0 0)),((0 0,-6 4,-10 0,-6 -4,0 0)),' + '((0 0,-4 -6,0 -10,4 -6,0 0)),((0 0,6 -4,10 0,6 4,0 0)))'), 4)); + +--echo ##################################################################################### +--echo # ST_SIMPLIFY(geometrycollection) +--echo ##################################################################################### + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(POINT(0 0))'), 1)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(MULTIPOINT(0 0,1 0,1 1,2 0,2 2))'), 1)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(LINESTRING(0 0,5 0,5 5,0 5,0 0))'), 3.5)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(LINESTRING(0 0,5 0,5 5,0 5,0 0))'), 3.6)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(LINESTRING(0 0,4 4,6 -6,10 0))'), 5)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(MULTILINESTRING((0 0,0 4,4 4),(0 0,5 0,5 5,0 5,0 0)))'), 3.5)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(MULTILINESTRING((0 0,0 5,5 5),(0 0,5 0,5 5,0 5,0 0)))'), 3.6)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(MULTILINESTRING((0 0,1 1,3 -3,5 5,7 -7,9 9,10 10,0 0)))'), 1)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0)))'), 7)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0)))'), 8)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0)),((0 0,0 -8,-8 -8,-8 0,0 0))))'), 7)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0)),((0 0,0 -8,-8 -8,-8 0,0 0))))'), 8)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION()'), 1)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION())'), 1)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(), LINESTRING(0 0,5 0,5 5))'), 3.5)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(), LINESTRING(0 0,5 0,5 5))'), 3.6)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(), POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0)))'), 7)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(), POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0)))'), 8)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(' + 'POINT(0 0),' + 'LINESTRING(0 0,0 5,5 5,5 0,0 0),' + 'POLYGON((0 0,0 -5,-5 -5,-5 0,0 0)))'), 3.5)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(' + 'POINT(0 0),' + 'LINESTRING(0 0,0 5,5 5,5 0,0 0),' + 'POLYGON((0 0,0 -5,-5 -5,-5 0,0 0)))'), 3.6)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(' + 'LINESTRING(0 0,5 5,0 10,-5 5,0 0),' + 'POLYGON((0 0,-5 -5,0 -10,5 -5,0 0)))'), 4.9)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(' + 'LINESTRING(0 0,5 5,0 10,-5 5,0 0),' + 'POLYGON((0 0,-5 -5,0 -10,5 -5,0 0)))'), 5)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(' + 'MULTILINESTRING((0 0,5 5,0 10,-5 5,0 0),(0 0,-5 -5,0 -10,5 -5,0 0)),' + 'MULTIPOLYGON(((0 0,5 -5,10 0,5 5,0 0)),((0 0,-5 5,-10 0,-5 -5,0 0))))'), 4.9)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(' + 'MULTILINESTRING((0 0,5 5,0 10,-5 5,0 0),(0 0,-5 -5,0 -10,5 -5,0 0)),' + 'MULTIPOLYGON(((0 0,5 -5,10 0,5 5,0 0)),((0 0,-5 5,-10 0,-5 -5,0 0))))'), 5)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(' + 'POINT(10 10),' + 'MULTIPOINT(0 0,1 1,2 2,3 3,4 4,5 5),' + 'LINESTRING(0 0,5 0,0 -1,5 -1,0 -2,5 -2,0 -3,5 -3,0 -4,5 -4,0 0))'), 1)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(' + 'POINT(10 10),' + 'MULTIPOINT(0 0,1 1,2 2,3 3,4 4,5 5),' + 'LINESTRING(0 0,5 0,0 -1,5 -1,0 -2,5 -2,0 -3,5 -3,0 -4,5 -4,0 0))'), 2)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(' + 'POINT(10 10),' + 'MULTIPOINT(0 0,1 1,2 2,3 3,4 4,5 5),' + 'LINESTRING(0 0,5 0,0 -1,5 -1,0 -2,5 -2,0 -3,5 -3,0 -4,5 -4,0 0))'), 3)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(' + 'POINT(10 10),' + 'MULTIPOINT(0 0,1 1,2 2,3 3,4 4,5 5),' + 'LINESTRING(0 0,5 0,0 -1,5 -1,0 -2,5 -2,0 -3,5 -3,0 -4,5 -4,0 0))'), 4)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(' + 'POINT(10 10),' + 'MULTIPOINT(0 0,1 1,2 2,3 3,4 4,5 5),' + 'LINESTRING(0 0,5 0,0 -1,5 -1,0 -2,5 -2,0 -3,5 -3,0 -4,5 -4,0 0))'), 7)); + +--echo # Invalid geometry in input. +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(' + 'POINT(0 0),' + 'LINESTRING(0 0,2.5 2.5,0 5,-2.5 7.5,0 10),' + 'POLYGON((0 0,5 0,0 -1,5 -1,0 -2,5 -2,0 -3,5 -3,0 -4,5 -4,0 0)),' + 'MULTIPOINT(0 0,1 1,2 2,3 3,4 4,5 5),' + 'MULTILINESTRING((0 0,1 1,-1 1,0 0),(0 0,2 2,-2 2,0 0),(0 0,3 3,-3 3,0 0),(0 0,4 4,-4 4,0 0)),' + 'MULTIPOLYGON(((0 0,2.5 2.5,-2.5 2.5,0 0)),((0 0,-2.5 -2.5,2.5 -2.5,0 0))))'), 1)); + +--echo # Invalid geometry in input. +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(' + 'POINT(0 0),' + 'LINESTRING(0 0,2.5 2.5,0 5,-2.5 7.5,0 10),' + 'POLYGON((0 0,5 0,0 -1,5 -1,0 -2,5 -2,0 -3,5 -3,0 -4,5 -4,0 0)),' + 'MULTIPOINT(0 0,1 1,2 2,3 3,4 4,5 5),' + 'MULTILINESTRING((0 0,1 1,-1 1,0 0),(0 0,2 2,-2 2,0 0),(0 0,3 3,-3 3,0 0),(0 0,4 4,-4 4,0 0)),' + 'MULTIPOLYGON(((0 0,2.5 2.5,-2.5 2.5,0 0)),((0 0,-2.5 -2.5,2.5 -2.5,0 0))))'), 2)); + +--echo # Invalid geometry in input. +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(' + 'POINT(0 0),' + 'LINESTRING(0 0,2.5 2.5,0 5,-2.5 7.5,0 10),' + 'POLYGON((0 0,5 0,0 -1,5 -1,0 -2,5 -2,0 -3,5 -3,0 -4,5 -4,0 0)),' + 'MULTIPOINT(0 0,1 1,2 2,3 3,4 4,5 5),' + 'MULTILINESTRING((0 0,1 1,-1 1,0 0),(0 0,2 2,-2 2,0 0),(0 0,3 3,-3 3,0 0),(0 0,4 4,-4 4,0 0)),' + 'MULTIPOLYGON(((0 0,2.5 2.5,-2.5 2.5,0 0)),((0 0,-2.5 -2.5,2.5 -2.5,0 0))))'), 3)); + +--echo # Invalid geometry in input. +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(' + 'POINT(0 0),' + 'LINESTRING(0 0,2.5 2.5,0 5,-2.5 7.5,0 10),' + 'POLYGON((0 0,5 0,0 -1,5 -1,0 -2,5 -2,0 -3,5 -3,0 -4,5 -4,0 0)),' + 'MULTIPOINT(0 0,1 1,2 2,3 3,4 4,5 5),' + 'MULTILINESTRING((0 0,1 1,-1 1,0 0),(0 0,2 2,-2 2,0 0),(0 0,3 3,-3 3,0 0),(0 0,4 4,-4 4,0 0)),' + 'MULTIPOLYGON(((0 0,2.5 2.5,-2.5 2.5,0 0)),((0 0,-2.5 -2.5,2.5 -2.5,0 0))))'), 4)); + +--echo ##################################################################################### +--echo # ST_ASTEXT(ST_SIMPLIFY(geometry) with different SRID values +--echo ##################################################################################### + +--error ER_NOT_IMPLEMENTED_FOR_GEOGRAPHIC_SRS +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT(@star_center,-1024), 1)); + +--error ER_NOT_IMPLEMENTED_FOR_GEOGRAPHIC_SRS +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT(@star_all_points,-1), 1)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT(@star_top_to_center,0), 1)); + +--error ER_NOT_IMPLEMENTED_FOR_GEOGRAPHIC_SRS +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT(@star_lines_near_vertical,4326), 1)); + +--error ER_NOT_IMPLEMENTED_FOR_GEOGRAPHIC_SRS +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT(@star_collection_elems,4294967295000), 1)); + +--echo ##################################################################################### +--echo # Invalid function calls +--echo ##################################################################################### + +--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT +SELECT ST_ASTEXT(ST_SIMPLIFY()); + +--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT +SELECT ST_ASTEXT(ST_SIMPLIFY(NULL)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(NULL,1)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT()'), 1)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING()'), 1)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON(())'), 1)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOINT()'), 1)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING(())'), 1)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON((()))'), 1)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(a 0)'), 1)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(! 0)'), 1)); + +--error ER_PARSE_ERROR +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT('!' 0)'), 1)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(12,34 0)'), 1)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(a 0,10 10)'), 1)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,! 10)'), 1)); + +--error ER_PARSE_ERROR +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING('!' 0,10 10)'), 1)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(12,34 0,10 10)'), 1)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((a 0,10 10,10 0,0 0))'), 1)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,! 10,10 0,0 0))'), 1)); + +--error ER_PARSE_ERROR +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON(('!' 0,10 10,10 0,0 0))'), 1)); + +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((12,34 0,10 10,10 0,0 0))'), 1)); + +--error ER_WRONG_ARGUMENTS +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0))'), 0)); + +--error ER_WRONG_ARGUMENTS +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0))'), -1)); + +--error ER_WRONG_ARGUMENTS +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0))'), -1024)); + +--error ER_WRONG_ARGUMENTS +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0))'), 'a')); + +--error ER_BAD_FIELD_ERROR +SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0))'), a)); + +--echo # Clean up +DROP TABLE gis_geometrycollection; diff --git a/sql/item_geofunc.cc b/sql/item_geofunc.cc index 14b801e0cc1..f10d0008c73 100644 --- a/sql/item_geofunc.cc +++ b/sql/item_geofunc.cc @@ -2149,6 +2149,69 @@ longlong Item_func_issimple::val_int() } +String *Item_func_simplify::val_str(String *str) +{ + DBUG_ENTER("Item_func_simplify::val_str"); + String *res= args[0]->val_str(&tmp_value); + double max_distance= (double) args[1]->val_real(); + Geometry_buffer buffer; + Geometry *geometry; + uint32 num_points; + + null_value= 1; + if ((null_value= (args[0]->null_value || args[1]->null_value)) || + !(geometry= Geometry::construct(&buffer, res->ptr(), res->length()))) + { + null_value= 1; + DBUG_RETURN(NULL); + } + + if (max_distance <= 0) + { + my_error(ER_WRONG_ARGUMENTS, MYF(0), func_name()); + null_value= 1; + DBUG_RETURN(NULL); + } + + uint32 srid= uint4korr(res->ptr()); + if (srid != 0) + { + my_error(ER_NOT_IMPLEMENTED_FOR_GEOGRAPHIC_SRS, MYF(0), func_name()); + null_value= 1; + DBUG_RETURN(NULL); + } + + if (geometry->get_class_info()->m_type_id == Geometry::wkb_point || + geometry->get_class_info()->m_type_id == Geometry::wkb_multipoint) + { + str = res; + DBUG_RETURN(str); + } + + if (geometry->get_class_info()->m_type_id == Geometry::wkb_linestring) + { + if (geometry->num_points(&num_points)) + { + null_value= 1; + DBUG_RETURN(NULL); + } + + if (num_points < 3) + { + str = res; + DBUG_RETURN(str); + } + } + + if (geometry->simplify(str, max_distance)) + { + null_value= 1; + DBUG_RETURN(NULL); + } + DBUG_RETURN(str); +} + + longlong Item_func_isclosed::val_int() { DBUG_ASSERT(fixed()); @@ -4253,6 +4316,22 @@ protected: }; +class Create_func_simplify : public Create_func_arg2 +{ +public: + Item *create_2_arg(THD *thd, Item *arg1, Item *arg2) override + { + return new (thd->mem_root) Item_func_simplify(thd, arg1, arg2); + } + + static Create_func_simplify s_singleton; + +protected: + Create_func_simplify() = default; + ~Create_func_simplify() override = default; +}; + + class Create_func_numgeometries : public Create_func_arg1 { public: @@ -4525,6 +4604,7 @@ Create_func_isempty Create_func_isempty::s_singleton; Create_func_isvalid Create_func_isvalid::s_singleton; Create_func_isring Create_func_isring::s_singleton; Create_func_issimple Create_func_issimple::s_singleton; +Create_func_simplify Create_func_simplify::s_singleton; Create_func_mbr_contains Create_func_mbr_contains::s_singleton; Create_func_mbr_coveredby Create_func_mbr_coveredby::s_singleton; Create_func_mbr_disjoint Create_func_mbr_disjoint::s_singleton; @@ -4595,6 +4675,7 @@ static Native_func_registry func_array_geom[] = { { STRING_WITH_LEN("ISVALID") }, GEOM_BUILDER(Create_func_isvalid)}, { { STRING_WITH_LEN("ISRING") }, GEOM_BUILDER(Create_func_isring)}, { { STRING_WITH_LEN("ISSIMPLE") }, GEOM_BUILDER(Create_func_issimple)}, + { { STRING_WITH_LEN("SIMPLIFY") }, GEOM_BUILDER(Create_func_simplify)}, { { STRING_WITH_LEN("LINEFROMTEXT") }, GEOM_BUILDER(Create_func_geometry_from_text)}, { { STRING_WITH_LEN("LINEFROMWKB") }, GEOM_BUILDER(Create_func_geometry_from_wkb)}, { { STRING_WITH_LEN("LINESTRINGFROMTEXT") }, GEOM_BUILDER(Create_func_geometry_from_text)}, @@ -4678,6 +4759,7 @@ static Native_func_registry func_array_geom[] = { { STRING_WITH_LEN("ST_ISVALID") }, GEOM_BUILDER(Create_func_isvalid)}, { { STRING_WITH_LEN("ST_ISRING") }, GEOM_BUILDER(Create_func_isring)}, { { STRING_WITH_LEN("ST_ISSIMPLE") }, GEOM_BUILDER(Create_func_issimple)}, + { { STRING_WITH_LEN("ST_SIMPLIFY") }, GEOM_BUILDER(Create_func_simplify)}, { { STRING_WITH_LEN("ST_LENGTH") }, GEOM_BUILDER(Create_func_glength)}, { { STRING_WITH_LEN("ST_LINEFROMTEXT") }, GEOM_BUILDER(Create_func_geometry_from_text)}, { { STRING_WITH_LEN("ST_LINEFROMWKB") }, GEOM_BUILDER(Create_func_geometry_from_wkb)}, diff --git a/sql/item_geofunc.h b/sql/item_geofunc.h index 3522ee2c087..e065a5c3fe4 100644 --- a/sql/item_geofunc.h +++ b/sql/item_geofunc.h @@ -975,6 +975,29 @@ public: { return get_item_copy(thd, this); } }; +class Item_func_simplify: public Item_geometry_func_args_geometry +{ + String tmp_value; + Gcalc_heap collector; + Gcalc_function func; + Gcalc_scan_iterator scan_it; +public: + Item_func_simplify(THD *thd, Item *a, Item *b) + :Item_geometry_func_args_geometry(thd, a, b) {} + LEX_CSTRING func_name_cstring() const override + { + static LEX_CSTRING name= {STRING_WITH_LEN("st_simplify") }; + return name; + } + String *val_str(String *) override; + const Type_handler *type_handler() const override + { + return &type_handler_geometry; + } + Item *get_copy(THD *thd) override + { return get_item_copy(thd, this); } +}; + class Item_func_isclosed: public Item_long_func_args_geometry { public: diff --git a/sql/share/errmsg-utf8.txt b/sql/share/errmsg-utf8.txt index e83ca657ab1..4c2d24f1492 100644 --- a/sql/share/errmsg-utf8.txt +++ b/sql/share/errmsg-utf8.txt @@ -12303,3 +12303,5 @@ ER_TOO_MANY_OPEN_CURSORS eng "Too many open cursors; max %u cursors allowed" ER_INCOMPATIBLE_EVENT_FLAG eng "Event flag '%s' in the condition expression is not compatible with the trigger event type '%s'" +ER_NOT_IMPLEMENTED_FOR_GEOGRAPHIC_SRS + eng "%s has not been implemented for geographic spatial reference systems." diff --git a/sql/spatial.cc b/sql/spatial.cc index 1d47230910f..08cc9e41ef0 100644 --- a/sql/spatial.cc +++ b/sql/spatial.cc @@ -20,6 +20,7 @@ #include "spatial.h" #include "gstream.h" // Gis_read_stream #include "sql_string.h" // String +#include /* This is from item_func.h. Didn't want to #include the whole file. */ double my_double_round(double value, longlong dec, bool dec_unsigned, @@ -155,6 +156,79 @@ int MBR::coveredby(const MBR *mbr) } +/********************** Ramer–Douglas–Peucker algorithm **********************/ + +static double perpendicular_distance(const st_point_2d& point, + const st_point_2d& line_start, + const st_point_2d& line_end) { + double difference_x= line_end.x - line_start.x; + double difference_y= line_end.y - line_start.y; + + double magnitude = sqrt((difference_x * difference_x) + + (difference_y * difference_y)); + + if (magnitude > 0.0) + { + difference_x /= magnitude; + difference_y /= magnitude; + } + + double point_vector_x= point.x - line_start.x; + double point_vector_y= point.y - line_start.y; + + double point_vector_dot_product= ((difference_x * point_vector_x) + + (difference_y * point_vector_y)); + + double adjusted_x= point_vector_x - (point_vector_dot_product * difference_x); + double adjusted_y= point_vector_y - (point_vector_dot_product * difference_y); + + return sqrt((adjusted_x * adjusted_x) + (adjusted_y * adjusted_y)); +} + + +static void recursive_RDP(const std::vector& points, + const double max_distance, + std::vector& out, + const uint32 start, const uint32 end) +{ + if (start >= end) return; + + double greatest_distance= 0.0; + uint32 index= start; + + for (uint32 i = start + 1; i < end; ++i) { + double dist = perpendicular_distance(points[i], points[start], points[end]); + if (dist > greatest_distance) { + index = i; + greatest_distance = dist; + } + } + + if (greatest_distance > max_distance) + { + recursive_RDP(points, max_distance, out, start, index); + recursive_RDP(points, max_distance, out, index, end); + } else if (start != 0) + out.push_back(points[start]); +} + + +/* + Implements the Ramer–Douglas–Peucker. Given the points that compose a line, + finds a similar curve with fewer points. The simplified curve consists of a + subset of the points that defined the original curve. + https://en.wikipedia.org/wiki/Ramer%E2%80%93Douglas%E2%80%93Peucker_algorithm +*/ +static void simplify_RDP(std::vector& points, + const double max_distance) { + std::vector result; + result.push_back(points.front()); + recursive_RDP(points, max_distance, result, 0,(uint32) points.size() - 1); + result.push_back(points.back()); + points = std::move(result); +} + + /***************************** Gis_class_info *******************************/ Geometry::Class_info *Geometry::ci_collection[Geometry::wkb_last+1]= @@ -1545,6 +1619,53 @@ int Gis_line_string::is_valid(int *valid) const } +int Gis_line_string::simplify(String *result, double max_distance) const { + Geometry_buffer buffer; + Geometry *geometry= NULL; + std::vector points; + double x, y; + + uint32 n_points= 0; + if(this->num_points(&n_points)) + return 1; + + for (uint32 i = 1; i <= n_points; i++) + { + String wkb= 0; + if (wkb.reserve(SRID_SIZE + WKB_HEADER_SIZE + POINT_DATA_SIZE)) + return 1; + + wkb.q_append(SRID_PLACEHOLDER); + this->point_n(i, &wkb); + if (!(geometry= Geometry::construct(&buffer, wkb.ptr(), wkb.length()))) + return 1; + if(((Gis_point *) geometry)->get_xy(&x, &y)) + return 1; + + points.push_back(st_point_2d{x, y}); + } + + simplify_RDP(points, max_distance); + + result->length(0); + result->reserve(SRID_SIZE + WKB_HEADER_SIZE + + (POINT_DATA_SIZE * points.size())); + + result->q_append(SRID_PLACEHOLDER); + result->q_append((char) wkb_ndr); + result->q_append((uint32) wkb_linestring); + result->q_append((uint32) points.size()); + + for (auto point : points) + { + result->q_append((double) point.x); + result->q_append((double) point.y); + } + + return 0; +} + + int Gis_line_string::num_points(uint32 *n_points) const { *n_points= uint4korr(m_data); @@ -2017,6 +2138,80 @@ int Gis_polygon::area(double *ar, const char **end_of_data) const return 0; } +int Gis_polygon::simplify(String *result, double max_distance) const +{ + uint32 num_interior_ring= 0, num_invalid_ring= 0, num_points; + Geometry_buffer buffer; + Geometry *geometry= NULL; + String exterior_ring= 0; + + exterior_ring.q_append(SRID_PLACEHOLDER); + if (this->num_interior_ring(&num_interior_ring) || + this->exterior_ring(&exterior_ring) || + !(geometry= Geometry::construct(&buffer, exterior_ring.ptr(), + exterior_ring.length()))) + return 1; + + if (geometry->simplify(&exterior_ring, max_distance)) + return 1; + + if (!(geometry= Geometry::construct(&buffer, exterior_ring.ptr(), + exterior_ring.length()))) + return 1; + + if (geometry->num_points(&num_points) || num_points <= 3) + return 1; + + result->length(0); + result->reserve(SRID_SIZE + WKB_HEADER_SIZE); + result->q_append(SRID_PLACEHOLDER); + result->q_append((char) wkb_ndr); + result->q_append((uint32) wkb_polygon); + result->q_append((uint32) 1 + num_interior_ring); + result->append(exterior_ring.ptr() + SRID_SIZE + WKB_HEADER_SIZE, + (exterior_ring.length() - SRID_SIZE - + WKB_HEADER_SIZE)); + + for (uint32 i = 1; i <= num_interior_ring; i++) + { + String interior_ring= 0; + interior_ring.q_append((uint) 0); + if (this->interior_ring_n(i, &interior_ring) || + !(geometry= Geometry::construct(&buffer, interior_ring.ptr(), + interior_ring.length()))) + { + num_invalid_ring++; + continue; + } + + if(geometry->simplify(&interior_ring, max_distance)) + return 1; + + if (!(geometry= Geometry::construct(&buffer, interior_ring.ptr(), + interior_ring.length()))) + { + num_invalid_ring++; + continue; + } + + if (geometry->num_points(&num_points)) + return 1; + + if (num_points <= 3) + { + num_invalid_ring++; + continue; + } + + result->append(interior_ring.ptr() + SRID_SIZE + WKB_HEADER_SIZE, + (interior_ring.length() - SRID_SIZE - WKB_HEADER_SIZE)); + } + + result->write_at_position(SRID_SIZE + WKB_HEADER_SIZE, + ((uint32) 1 + num_interior_ring - + num_invalid_ring)); + return 0; +} int Gis_polygon::exterior_ring(String *result) const { @@ -2034,7 +2229,7 @@ int Gis_polygon::exterior_ring(String *result) const result->q_append((char) wkb_ndr); result->q_append((uint32) wkb_linestring); result->q_append(n_points); - result->q_append(data, n_points * POINT_DATA_SIZE); + result->q_append(data, n_points * POINT_DATA_SIZE); return 0; } @@ -2635,18 +2830,19 @@ bool Gis_multi_line_string::init_from_wkt(Gis_read_stream *trs, String *wkb) if (wkb->reserve(4, 512)) return 1; wkb->length(wkb->length()+4); // Reserve space for points - + for (;;) { Gis_line_string ls; if (wkb->reserve(1 + 4, 512)) return 1; - wkb->q_append((char) wkb_ndr); wkb->q_append((uint32) wkb_linestring); + wkb->q_append((char) wkb_ndr); + wkb->q_append((uint32) wkb_linestring); if (trs->check_next_symbol('(') || - ls.init_from_wkt(trs, wkb) || - trs->check_next_symbol(')')) + ls.init_from_wkt(trs, wkb) || + trs->check_next_symbol(')')) return 1; n_line_strings++; if (trs->skip_char(',')) // Didn't find ',' @@ -2720,7 +2916,7 @@ uint Gis_multi_line_string::init_from_wkb(const char *wkb, uint len, if (!(ls_len= ls.init_from_wkb(wkb + WKB_HEADER_SIZE, len, (wkbByteOrder) wkb[0], res))) return 0; - ls_len+= WKB_HEADER_SIZE;; + ls_len+= WKB_HEADER_SIZE; wkb+= ls_len; len-= ls_len; } @@ -2993,6 +3189,37 @@ int Gis_multi_line_string::is_closed(int *closed) const } +int Gis_multi_line_string::simplify(String *result, double max_distance) const +{ + uint32 num_lines= 0; + Geometry_buffer buffer; + Geometry *geometry= NULL; + + if (this->num_geometries(&num_lines)) + return 1; + + result->length(0); + result->reserve(SRID_SIZE + WKB_HEADER_SIZE); + result->q_append(SRID_PLACEHOLDER); + result->q_append((char) wkb_ndr); + result->q_append((uint32) wkb_multilinestring); + result->q_append((uint32) num_lines); + + for (uint32 i = 1; i <= num_lines; i++) + { + String wkb= 0; + wkb.q_append((uint) 0); + this->geometry_n(i, &wkb); + if (!(geometry= Geometry::construct(&buffer, wkb.ptr(), wkb.length()))) + return 1; + geometry->simplify(&wkb, max_distance); + result->append(wkb.ptr() + SRID_SIZE, wkb.length() - SRID_SIZE); + } + + return 0; +} + + int Gis_multi_line_string::store_shapes(Gcalc_shape_transporter *trn) const { uint32 n_lines; @@ -3446,6 +3673,48 @@ int Gis_multi_polygon::area(double *ar, const char **end_of_data) const return 0; } +int Gis_multi_polygon::simplify(String *result, double max_distance) const +{ + uint32 num_polygon= 0, num_invalid_polygon= 0; + Geometry_buffer buffer; + Geometry *geometry= NULL; + + if (this->num_geometries(&num_polygon)) + return 1; + + result->length(0); + result->reserve(SRID_SIZE + WKB_HEADER_SIZE); + result->q_append(SRID_PLACEHOLDER); + result->q_append((char) wkb_ndr); + result->q_append((uint32) wkb_multipolygon); + result->q_append((uint32) num_polygon); + + for (uint32 i = 1; i <= num_polygon; i++) + { + String polygon= 0, simplified_polygon= 0; + polygon.q_append((uint) 0); + if (this->geometry_n(i, &polygon) || + !(geometry= Geometry::construct(&buffer, polygon.ptr(), + polygon.length()))) + return 1; + + if(geometry->simplify(&simplified_polygon, max_distance)) + { + num_invalid_polygon++; + continue; + } + + result->append(simplified_polygon.ptr() + SRID_SIZE, + simplified_polygon.length() - SRID_SIZE); + } + + if (num_polygon == num_invalid_polygon) + return 1; + + result->write_at_position(SRID_SIZE + WKB_HEADER_SIZE, + ((uint32) num_polygon - num_invalid_polygon)); + return 0; +} int Gis_multi_polygon::centroid(String *result) const { @@ -3924,6 +4193,58 @@ exit: } +int Gis_geometry_collection::simplify(String *result, + double max_distance) const +{ + uint32 num_geometries= 0, num_invalid_geometries= 0; + Geometry_buffer buffer; + Geometry *geometry= NULL; + + if (this->num_geometries(&num_geometries)) + return 1; + + result->length(0); + result->reserve(SRID_SIZE + BYTE_ORDER_SIZE + WKB_HEADER_SIZE); + result->q_append(SRID_PLACEHOLDER); + result->q_append((char) wkb_ndr); + result->q_append((uint32) wkb_geometrycollection); + result->q_append((uint32) num_geometries); + + for (uint32 i = 1; i <= num_geometries; i++) + { + String wkb= 0, simplified_wkb= 0; + + wkb.q_append((uint) 0); + if (this->geometry_n(i, &wkb) || + !(geometry= Geometry::construct(&buffer, wkb.ptr(), wkb.length()))) + return 1; + + if (geometry->get_class_info()->m_type_id == Geometry::wkb_point || + geometry->get_class_info()->m_type_id == Geometry::wkb_multipoint) + { + result->append(wkb.ptr() + SRID_SIZE, wkb.length() - SRID_SIZE); + continue; + } + + if(geometry->simplify(&simplified_wkb, max_distance)) + { + num_invalid_geometries++; + continue; + } + + result->append(simplified_wkb.ptr() + SRID_SIZE, + simplified_wkb.length() - SRID_SIZE); + } + + if (num_geometries == num_invalid_geometries) + return 1; + + result->write_at_position(SRID_SIZE + WKB_HEADER_SIZE, + (uint32) num_geometries - num_invalid_geometries); + return 0; +} + + int Gis_geometry_collection::geom_length(double *len, const char **end) const { uint32 n_objects; diff --git a/sql/spatial.h b/sql/spatial.h index 291a65ebb74..9e92d3e3be5 100644 --- a/sql/spatial.h +++ b/sql/spatial.h @@ -32,7 +32,7 @@ const uint32 SRID_PLACEHOLDER= 0; const uint SIZEOF_STORED_DOUBLE= 8; const uint BYTE_ORDER_SIZE= 1; const uint POINT_DATA_SIZE= (SIZEOF_STORED_DOUBLE * 2); -const uint WKB_HEADER_SIZE= 1+4; +const uint WKB_HEADER_SIZE= BYTE_ORDER_SIZE + 4; const uint32 GET_SIZE_ERROR= ((uint32) -1); struct st_point_2d @@ -293,6 +293,7 @@ public: virtual int area(double *ar, const char **end) const { return -1;} virtual int is_closed(int *closed) const { return -1; } virtual int is_valid(int *valid) const { return -1; } + virtual int simplify(String* result, double max_distance) const { return -1; } virtual int num_interior_ring(uint32 *n_int_rings) const { return -1; } virtual int num_points(uint32 *n_points) const { return -1; } virtual int num_geometries(uint32 *num) const { return -1; } @@ -396,7 +397,7 @@ protected: /***************************** Point *******************************/ - + class Gis_point: public Geometry { public: @@ -411,6 +412,7 @@ public: const char **end) const override; bool get_mbr(MBR *mbr, const char **end) const override; int is_valid(int *valid) const override; + int get_xy(double *x, double *y) const { const char *data= m_data; @@ -483,6 +485,7 @@ public: int geom_length(double *len, const char **end) const override; int area(double *ar, const char **end) const override; int is_closed(int *closed) const override; + int simplify(String* result, double max_distance) const override; int num_points(uint32 *n_points) const override; int is_valid(int *valid) const override; int start_point(String *point) const override; @@ -517,6 +520,7 @@ public: bool get_mbr(MBR *mbr, const char **end) const override; int is_valid(int *valid) const override; int area(double *ar, const char **end) const override; + int simplify(String* result, double max_distance) const override; int exterior_ring(String *result) const override; int num_interior_ring(uint32 *n_int_rings) const override; int interior_ring_n(uint32 num, String *result) const override; @@ -590,6 +594,7 @@ public: int geometry_n(uint32 num, String *result) const override; int geom_length(double *len, const char **end) const override; int is_closed(int *closed) const override; + int simplify(String* result, double max_distance) const override; bool dimension(uint32 *dim, const char **end) const override { *dim= 1; @@ -620,6 +625,7 @@ public: int num_geometries(uint32 *num) const override; int geometry_n(uint32 num, String *result) const override; int area(double *ar, const char **end) const override; + int simplify(String* result, double max_distance) const override; int centroid(String *result) const override; bool dimension(uint32 *dim, const char **end) const override { @@ -651,6 +657,7 @@ public: int is_valid(int *valid) const override; bool get_mbr(MBR *mbr, const char **end) const override; int area(double *ar, const char **end) const override; + int simplify(String* result, double max_distance) const override; int geom_length(double *len, const char **end) const override; int num_geometries(uint32 *num) const override; int geometry_n(uint32 num, String *result) const override;