1
0
mirror of https://github.com/MariaDB/server.git synced 2025-08-07 00:04:31 +03:00

MDEV-34141: Implements the function ST_Simplify

The GIS function ST_Simplify takes ad input a geometry and a double. It
applies the Ramer-Douglas-Peucker algorithm on the geometry and returns
the resulting geometry. The tests have been cherry-picked from the MySQL
implementation of this function to grant compatibility among the two
implementations.

Co-authored-by: David Zhao <david.zhao@oracle.com>
Co-authored-by: Pavan Naik <pavan.naik@oracle.com>
Co-authored-by: Norvald H. Ryeng <norvald.ryeng@oracle.com>
Co-authored-by: Erlend Dahl <erlend.dahl@oracle.com>
Co-authored-by: Jon Hauglid <jon.hauglid@oracle.com>
Co-authored-by: Hans H Melby <hans.h.melby@oracle.com>
Co-authored-by: Tor Didriksen <tor.didriksen@oracle.com>
This commit is contained in:
Stefano Petrilli
2024-06-07 16:20:10 +02:00
committed by Dave Gosselin
parent d232e4fd4f
commit ba66f8f37b
7 changed files with 1559 additions and 8 deletions

View File

@@ -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;