PostGIS  3.4.0dev-r@@SVN_REVISION@@
cu_out_kml.c
Go to the documentation of this file.
1 /**********************************************************************
2  *
3  * PostGIS - Spatial Types for PostgreSQL
4  * http://postgis.net
5  * Copyright 2010 Olivier Courtin <olivier.courtin@oslandia.com>
6  *
7  * This is free software; you can redistribute and/or modify it under
8  * the terms of the GNU General Public Licence. See the COPYING file.
9  *
10  **********************************************************************/
11 
12 #include <stdio.h>
13 #include <stdlib.h>
14 #include <string.h>
15 #include "CUnit/Basic.h"
16 
17 #include "liblwgeom_internal.h"
18 #include "cu_tester.h"
19 
20 static void do_kml_test(char * in, char * out, int precision)
21 {
24 
25  ASSERT_VARLENA_EQUAL(v, out);
26 
27  lwgeom_free(g);
28  lwfree(v);
29 }
30 
31 
32 static void do_kml_unsupported(char * in, char * out)
33 {
35  lwvarlena_t *v = lwgeom_to_kml2(g, 0, "");
36 
39 
40  lwfree(v);
41  lwgeom_free(g);
42 }
43 
44 
45 static void do_kml_test_prefix(char * in, char * out, int precision, const char *prefix)
46 {
48  lwvarlena_t *v = lwgeom_to_kml2(g, precision, prefix);
49 
50  ASSERT_VARLENA_EQUAL(v, out);
51 
52  lwgeom_free(g);
53  lwfree(v);
54 }
55 
56 
57 static void out_kml_test_precision(void)
58 {
59  /* 0 precision, i.e a round */
61  "POINT(1.1111111111111 1.1111111111111)",
62  "<Point><coordinates>1,1</coordinates></Point>",
63  0);
64 
65  /* 3 digits precision */
67  "POINT(1.1111111111111 1.1111111111111)",
68  "<Point><coordinates>1.111,1.111</coordinates></Point>",
69  3);
70 
71  /* 9 digits precision */
73  "POINT(1.2345678901234 1.2345678901234)",
74  "<Point><coordinates>1.23456789,1.23456789</coordinates></Point>",
75  8);
76 
77  /* huge data */
79  "POINT(1E300 -1E300)",
80  "<Point><coordinates>1e+300,-1e+300</coordinates></Point>",
81  0);
82 }
83 
84 
85 static void out_kml_test_dims(void)
86 {
87  /* 3D */
89  "POINT(0 1 2)",
90  "<Point><coordinates>0,1,2</coordinates></Point>",
91  0);
92 
93  /* 3DM */
95  "POINTM(0 1 2)",
96  "<Point><coordinates>0,1</coordinates></Point>",
97  0);
98 
99  /* 4D */
100  do_kml_test(
101  "POINT(0 1 2 3)",
102  "<Point><coordinates>0,1,2</coordinates></Point>",
103  0);
104 }
105 
106 
107 static void out_kml_test_geoms(void)
108 {
109  /* Linestring */
110  do_kml_test(
111  "LINESTRING(0 1,2 3,4 5)",
112  "<LineString><coordinates>0,1 2,3 4,5</coordinates></LineString>",
113  0);
114 
115  /* Polygon */
116  do_kml_test(
117  "POLYGON((0 1,2 3,4 5,0 1))",
118  "<Polygon><outerBoundaryIs><LinearRing><coordinates>0,1 2,3 4,5 0,1</coordinates></LinearRing></outerBoundaryIs></Polygon>",
119  0);
120 
121  /* Polygon - with internal ring */
122  do_kml_test(
123  "POLYGON((0 1,2 3,4 5,0 1),(6 7,8 9,10 11,6 7))",
124  "<Polygon><outerBoundaryIs><LinearRing><coordinates>0,1 2,3 4,5 0,1</coordinates></LinearRing></outerBoundaryIs><innerBoundaryIs><LinearRing><coordinates>6,7 8,9 10,11 6,7</coordinates></LinearRing></innerBoundaryIs></Polygon>",
125  0);
126 
127  /* MultiPoint */
128  do_kml_test(
129  "MULTIPOINT(0 1,2 3)",
130  "<MultiGeometry><Point><coordinates>0,1</coordinates></Point><Point><coordinates>2,3</coordinates></Point></MultiGeometry>",
131  0);
132 
133  /* MultiLine */
134  do_kml_test(
135  "MULTILINESTRING((0 1,2 3,4 5),(6 7,8 9,10 11))",
136  "<MultiGeometry><LineString><coordinates>0,1 2,3 4,5</coordinates></LineString><LineString><coordinates>6,7 8,9 10,11</coordinates></LineString></MultiGeometry>",
137  0);
138 
139  /* MultiPolygon */
140  do_kml_test(
141  "MULTIPOLYGON(((0 1,2 3,4 5,0 1)),((6 7,8 9,10 11,6 7)))",
142  "<MultiGeometry><Polygon><outerBoundaryIs><LinearRing><coordinates>0,1 2,3 4,5 0,1</coordinates></LinearRing></outerBoundaryIs></Polygon><Polygon><outerBoundaryIs><LinearRing><coordinates>6,7 8,9 10,11 6,7</coordinates></LinearRing></outerBoundaryIs></Polygon></MultiGeometry>",
143  0);
144 
145  /* GeometryCollection */
147  "GEOMETRYCOLLECTION(POINT(0 1))",
148  "lwgeom_to_kml2: 'GeometryCollection' geometry type not supported");
149 
150  /* CircularString */
152  "CIRCULARSTRING(-2 0,0 2,2 0,0 2,2 4)",
153  "lwgeom_to_kml2: 'CircularString' geometry type not supported");
154 
155  /* CompoundCurve */
157  "COMPOUNDCURVE(CIRCULARSTRING(0 0,1 1,1 0),(1 0,0 1))",
158  "lwgeom_to_kml2: 'CompoundCurve' geometry type not supported");
159 
160  /* CurvePolygon */
162  "CURVEPOLYGON(CIRCULARSTRING(-2 0,-1 -1,0 0,1 -1,2 0,0 2,-2 0),(-1 0,0 0.5,1 0,0 1,-1 0))",
163  "lwgeom_to_kml2: 'CurvePolygon' geometry type not supported");
164 
165  /* MultiCurve */
167  "MULTICURVE((5 5,3 5,3 3,0 3),CIRCULARSTRING(0 0,2 1,2 2))",
168  "lwgeom_to_kml2: 'MultiCurve' geometry type not supported");
169 
170  /* MultiSurface */
172  "MULTISURFACE(CURVEPOLYGON(CIRCULARSTRING(-2 0,-1 -1,0 0,1 -1,2 0,0 2,-2 0),(-1 0,0 0.5,1 0,0 1,-1 0)),((7 8,10 10,6 14,4 11,7 8)))",
173  "lwgeom_to_kml2: 'MultiSurface' geometry type not supported");
174 }
175 
176 static void out_kml_test_prefix(void)
177 {
178  /* Linestring */
180  "LINESTRING(0 1,2 3,4 5)",
181  "<kml:LineString><kml:coordinates>0,1 2,3 4,5</kml:coordinates></kml:LineString>",
182  0, "kml:");
183 
184  /* Polygon */
186  "POLYGON((0 1,2 3,4 5,0 1))",
187  "<kml:Polygon><kml:outerBoundaryIs><kml:LinearRing><kml:coordinates>0,1 2,3 4,5 0,1</kml:coordinates></kml:LinearRing></kml:outerBoundaryIs></kml:Polygon>",
188  0, "kml:");
189 
190  /* Polygon - with internal ring */
192  "POLYGON((0 1,2 3,4 5,0 1),(6 7,8 9,10 11,6 7))",
193  "<kml:Polygon><kml:outerBoundaryIs><kml:LinearRing><kml:coordinates>0,1 2,3 4,5 0,1</kml:coordinates></kml:LinearRing></kml:outerBoundaryIs><kml:innerBoundaryIs><kml:LinearRing><kml:coordinates>6,7 8,9 10,11 6,7</kml:coordinates></kml:LinearRing></kml:innerBoundaryIs></kml:Polygon>",
194  0, "kml:");
195 
196  /* MultiPoint */
198  "MULTIPOINT(0 1,2 3)",
199  "<kml:MultiGeometry><kml:Point><kml:coordinates>0,1</kml:coordinates></kml:Point><kml:Point><kml:coordinates>2,3</kml:coordinates></kml:Point></kml:MultiGeometry>",
200  0, "kml:");
201 
202  /* MultiLine */
204  "MULTILINESTRING((0 1,2 3,4 5),(6 7,8 9,10 11))",
205  "<kml:MultiGeometry><kml:LineString><kml:coordinates>0,1 2,3 4,5</kml:coordinates></kml:LineString><kml:LineString><kml:coordinates>6,7 8,9 10,11</kml:coordinates></kml:LineString></kml:MultiGeometry>",
206  0, "kml:");
207 
208  /* MultiPolygon */
210  "MULTIPOLYGON(((0 1,2 3,4 5,0 1)),((6 7,8 9,10 11,6 7)))",
211  "<kml:MultiGeometry><kml:Polygon><kml:outerBoundaryIs><kml:LinearRing><kml:coordinates>0,1 2,3 4,5 0,1</kml:coordinates></kml:LinearRing></kml:outerBoundaryIs></kml:Polygon><kml:Polygon><kml:outerBoundaryIs><kml:LinearRing><kml:coordinates>6,7 8,9 10,11 6,7</kml:coordinates></kml:LinearRing></kml:outerBoundaryIs></kml:Polygon></kml:MultiGeometry>",
212  0, "kml:");
213 
214 }
215 /*
216 ** Used by test harness to register the tests in this file.
217 */
218 void out_kml_suite_setup(void);
220 {
221  CU_pSuite suite = CU_add_suite("kml_output", NULL, NULL);
226 }
static uint8_t precision
Definition: cu_in_twkb.c:25
static void out_kml_test_dims(void)
Definition: cu_out_kml.c:85
static void out_kml_test_prefix(void)
Definition: cu_out_kml.c:176
static void do_kml_test(char *in, char *out, int precision)
Definition: cu_out_kml.c:20
static void out_kml_test_precision(void)
Definition: cu_out_kml.c:57
void out_kml_suite_setup(void)
Definition: cu_out_kml.c:219
static void do_kml_test_prefix(char *in, char *out, int precision, const char *prefix)
Definition: cu_out_kml.c:45
static void out_kml_test_geoms(void)
Definition: cu_out_kml.c:107
static void do_kml_unsupported(char *in, char *out)
Definition: cu_out_kml.c:32
void cu_error_msg_reset()
char cu_error_msg[MAX_CUNIT_ERROR_LENGTH+1]
#define ASSERT_VARLENA_EQUAL(v, s)
#define PG_ADD_TEST(suite, testfunc)
#define ASSERT_STRING_EQUAL(o, e)
lwvarlena_t * lwgeom_to_kml2(const LWGEOM *geom, int precision, const char *prefix)
Definition: lwout_kml.c:44
void lwgeom_free(LWGEOM *geom)
Definition: lwgeom.c:1155
#define LW_PARSER_CHECK_NONE
Definition: liblwgeom.h:2114
void lwfree(void *mem)
Definition: lwutil.c:242
LWGEOM * lwgeom_from_wkt(const char *wkt, const char check)
Definition: lwin_wkt.c:905