source: trunk/liblwgeom/cunit/cu_out_geojson.c @ 5311

Last change on this file since 5311 was 5311, checked in by colivier, 6 years ago

Fix #441. And introduce a change in behaviour: if geometryCollection and bbox, not sub geoms bbox are provided anymore

File size: 10.0 KB
Line 
1/**********************************************************************
2 * $Id$
3 *
4 * PostGIS - Spatial Types for PostgreSQL
5 * http://postgis.refractions.net
6 * Copyright 2010 Olivier Courtin <olivier.courtin@oslandia.com>
7 *
8 * This is free software; you can redistribute and/or modify it under
9 * the terms of the GNU General Public Licence. See the COPYING file.
10 *
11 **********************************************************************/
12
13#include "cu_out_geojson.h"
14
15/*
16** Called from test harness to register the tests in this file.
17*/
18CU_pSuite register_out_geojson_suite(void)
19{
20        CU_pSuite pSuite;
21        pSuite = CU_add_suite("GeoJson Out Suite", init_out_geojson_suite, clean_out_geojson_suite);
22        if (NULL == pSuite)
23        {
24                CU_cleanup_registry();
25                return NULL;
26        }
27
28        if (
29            (NULL == CU_add_test(pSuite, "test_precision()", out_geojson_test_precision)) ||
30            (NULL == CU_add_test(pSuite, "test_dims()", out_geojson_test_dims)) ||
31            (NULL == CU_add_test(pSuite, "test_srid()", out_geojson_test_srid)) ||
32            (NULL == CU_add_test(pSuite, "test_bbox()", out_geojson_test_bbox)) ||
33            (NULL == CU_add_test(pSuite, "test_geoms()", out_geojson_test_geoms))
34        )
35        {
36                CU_cleanup_registry();
37                return NULL;
38        }
39        return pSuite;
40}
41
42/*
43** The suite initialization function.
44** Create any re-used objects.
45*/
46int init_out_geojson_suite(void)
47{
48        return 0;
49}
50
51/*
52** The suite cleanup function.
53** Frees any global objects.
54*/
55int clean_out_geojson_suite(void)
56{
57        return 0;
58}
59
60static void do_geojson_test(char * in, char * out, char * srs, int precision, int has_bbox)
61{
62        LWGEOM *g;
63        char * h;
64
65        g = lwgeom_from_ewkt(in, PARSER_CHECK_NONE);
66        h = lwgeom_to_geojson(lwgeom_serialize(g), srs, precision, has_bbox);
67
68        if (strcmp(h, out))
69                fprintf(stderr, "\nIn:   %s\nOut:  %s\nTheo: %s\n", in, h, out);
70
71        CU_ASSERT_STRING_EQUAL(h, out);
72
73        lwgeom_free(g);
74        lwfree(h);
75}
76
77
78static void do_geojson_unsupported(char * in, char * out)
79{
80        LWGEOM *g;
81        char *h;
82
83        g = lwgeom_from_ewkt(in, PARSER_CHECK_NONE);
84        h = lwgeom_to_geojson(lwgeom_serialize(g), NULL, 0, 0);
85
86        if (strcmp(cu_error_msg, out))
87                fprintf(stderr, "\nIn:   %s\nOut:  %s\nTheo: %s\n",
88                        in, cu_error_msg, out);
89
90        CU_ASSERT_STRING_EQUAL(out, cu_error_msg);
91        cu_error_msg_reset();
92
93        lwfree(h);
94        lwgeom_free(g);
95}
96
97
98void out_geojson_test_precision(void)
99{
100        /* 0 precision, i.e a round */
101        do_geojson_test(
102            "POINT(1.1111111111111 1.1111111111111)",
103            "{\"type\":\"Point\",\"coordinates\":[1,1]}",
104            NULL, 0, 0);
105
106        /* 3 digits precision */
107        do_geojson_test(
108            "POINT(1.1111111111111 1.1111111111111)",
109            "{\"type\":\"Point\",\"coordinates\":[1.111,1.111]}",
110            NULL, 3, 0);
111
112        /* 9 digits precision */
113        do_geojson_test(
114            "POINT(1.2345678901234 1.2345678901234)",
115            "{\"type\":\"Point\",\"coordinates\":[1.23456789,1.23456789]}",
116            NULL, 9, 0);
117
118        /* huge data */
119        do_geojson_test(
120            "POINT(1E300 -1E300)",
121            "{\"type\":\"Point\",\"coordinates\":[1e+300,-1e+300]}",
122            NULL, 0, 0);
123}
124
125
126void out_geojson_test_dims(void)
127{
128        /* 3D */
129        do_geojson_test(
130            "POINT(0 1 2)",
131            "{\"type\":\"Point\",\"coordinates\":[0,1,2]}",
132            NULL, 0, 0);
133
134        /* 3DM */
135        do_geojson_test(
136            "POINTM(0 1 2)",
137            "{\"type\":\"Point\",\"coordinates\":[0,1]}",
138            NULL, 0, 0);
139
140        /* 4D */
141        do_geojson_test(
142            "POINT(0 1 2 3)",
143            "{\"type\":\"Point\",\"coordinates\":[0,1,2]}",
144            NULL, 0, 0);
145}
146
147
148void out_geojson_test_srid(void)
149{
150        /* Linestring */
151        do_geojson_test(
152            "LINESTRING(0 1,2 3,4 5)",
153            "{\"type\":\"LineString\",\"crs\":{\"type\":\"name\",\"properties\":{\"name\":\"EPSG:4326\"}},\"coordinates\":[[0,1],[2,3],[4,5]]}",
154            "EPSG:4326", 0, 0);
155
156        /* Polygon */
157        do_geojson_test(
158            "POLYGON((0 1,2 3,4 5,0 1))",
159            "{\"type\":\"Polygon\",\"crs\":{\"type\":\"name\",\"properties\":{\"name\":\"EPSG:4326\"}},\"coordinates\":[[[0,1],[2,3],[4,5],[0,1]]]}",
160            "EPSG:4326", 0, 0);
161
162        /* Polygon - with internal ring */
163        do_geojson_test(
164            "POLYGON((0 1,2 3,4 5,0 1),(6 7,8 9,10 11,6 7))",
165            "{\"type\":\"Polygon\",\"crs\":{\"type\":\"name\",\"properties\":{\"name\":\"EPSG:4326\"}},\"coordinates\":[[[0,1],[2,3],[4,5],[0,1]],[[6,7],[8,9],[10,11],[6,7]]]}",
166            "EPSG:4326", 0, 0);
167
168        /* Multiline */
169        do_geojson_test(
170            "MULTILINESTRING((0 1,2 3,4 5),(6 7,8 9,10 11))",
171            "{\"type\":\"MultiLineString\",\"crs\":{\"type\":\"name\",\"properties\":{\"name\":\"EPSG:4326\"}},\"coordinates\":[[[0,1],[2,3],[4,5]],[[6,7],[8,9],[10,11]]]}",
172            "EPSG:4326", 0, 0);
173
174        /* MultiPolygon */
175        do_geojson_test(
176            "MULTIPOLYGON(((0 1,2 3,4 5,0 1)),((6 7,8 9,10 11,6 7)))",
177            "{\"type\":\"MultiPolygon\",\"crs\":{\"type\":\"name\",\"properties\":{\"name\":\"EPSG:4326\"}},\"coordinates\":[[[[0,1],[2,3],[4,5],[0,1]]],[[[6,7],[8,9],[10,11],[6,7]]]]}",
178            "EPSG:4326", 0, 0);
179
180        /* GeometryCollection */
181        do_geojson_test(
182            "GEOMETRYCOLLECTION(POINT(0 1),LINESTRING(2 3,4 5))",
183            "{\"type\":\"GeometryCollection\",\"crs\":{\"type\":\"name\",\"properties\":{\"name\":\"EPSG:4326\"}},\"geometries\":[{\"type\":\"Point\",\"coordinates\":[0,1]},{\"type\":\"LineString\",\"coordinates\":[[2,3],[4,5]]}]}",
184            "EPSG:4326", 0, 0);
185
186        /* Empty GeometryCollection */
187        do_geojson_test(
188            "GEOMETRYCOLLECTION EMPTY",
189            "{\"type\":\"GeometryCollection\",\"crs\":{\"type\":\"name\",\"properties\":{\"name\":\"EPSG:4326\"}},\"geometries\":[]}",
190            "EPSG:4326", 0, 0);
191
192        /* Nested GeometryCollection */
193        do_geojson_test(
194            "GEOMETRYCOLLECTION(POINT(0 1),GEOMETRYCOLLECTION(LINESTRING(2 3,4 5)))",
195            "{\"type\":\"GeometryCollection\",\"crs\":{\"type\":\"name\",\"properties\":{\"name\":\"EPSG:4326\"}},\"geometries\":[{\"type\":\"Point\",\"coordinates\":[0,1]},]}",
196            "EPSG:4326", 0, 0);
197}
198
199void out_geojson_test_bbox(void)
200{
201        /* Linestring */
202        do_geojson_test(
203            "LINESTRING(0 1,2 3,4 5)",
204            "{\"type\":\"LineString\",\"bbox\":[0,1,4,5],\"coordinates\":[[0,1],[2,3],[4,5]]}",
205            NULL, 0, 1);
206
207        /* Polygon */
208        do_geojson_test(
209            "POLYGON((0 1,2 3,4 5,0 1))",
210            "{\"type\":\"Polygon\",\"bbox\":[0,1,4,5],\"coordinates\":[[[0,1],[2,3],[4,5],[0,1]]]}",
211            NULL, 0, 1);
212
213        /* Polygon - with internal ring */
214        do_geojson_test(
215            "POLYGON((0 1,2 3,4 5,0 1),(6 7,8 9,10 11,6 7))",
216            "{\"type\":\"Polygon\",\"bbox\":[0,1,4,5],\"coordinates\":[[[0,1],[2,3],[4,5],[0,1]],[[6,7],[8,9],[10,11],[6,7]]]}",
217            NULL, 0, 1);
218
219        /* Multiline */
220        do_geojson_test(
221            "MULTILINESTRING((0 1,2 3,4 5),(6 7,8 9,10 11))",
222            "{\"type\":\"MultiLineString\",\"bbox\":[0,1,10,11],\"coordinates\":[[[0,1],[2,3],[4,5]],[[6,7],[8,9],[10,11]]]}",
223            NULL, 0, 1);
224
225        /* MultiPolygon */
226        do_geojson_test(
227            "MULTIPOLYGON(((0 1,2 3,4 5,0 1)),((6 7,8 9,10 11,6 7)))",
228            "{\"type\":\"MultiPolygon\",\"bbox\":[0,1,10,11],\"coordinates\":[[[[0,1],[2,3],[4,5],[0,1]]],[[[6,7],[8,9],[10,11],[6,7]]]]}",
229            NULL, 0, 1);
230
231        /* GeometryCollection */
232        do_geojson_test(
233            "GEOMETRYCOLLECTION(LINESTRING(0 1,-1 3),LINESTRING(2 3,4 5))",
234            "{\"type\":\"GeometryCollection\",\"bbox\":[-1,1,4,5],\"geometries\":[{\"type\":\"LineString\",\"coordinates\":[[0,1],[-1,3]]},{\"type\":\"LineString\",\"coordinates\":[[2,3],[4,5]]}]}",
235            NULL, 0, 1);
236
237        /* Empty GeometryCollection */
238        do_geojson_test(
239            "GEOMETRYCOLLECTION EMPTY",
240            "{\"type\":\"GeometryCollection\",\"geometries\":[]}",
241            NULL, 0, 1);
242
243#if 0
244        /* Nested GeometryCollection */
245        do_geojson_test(
246            "GEOMETRYCOLLECTION(POINT(0 1),GEOMETRYCOLLECTION(LINESTRING(2 3,4 5)))",
247            "",
248            NULL, 0, 1);
249#endif
250}
251
252void out_geojson_test_geoms(void)
253{
254        /* Linestring */
255        do_geojson_test(
256            "LINESTRING(0 1,2 3,4 5)",
257            "{\"type\":\"LineString\",\"coordinates\":[[0,1],[2,3],[4,5]]}",
258            NULL, 0, 0);
259
260        /* Polygon */
261        do_geojson_test(
262            "POLYGON((0 1,2 3,4 5,0 1))",
263            "{\"type\":\"Polygon\",\"coordinates\":[[[0,1],[2,3],[4,5],[0,1]]]}",
264            NULL, 0, 0);
265
266        /* Polygon - with internal ring */
267        do_geojson_test(
268            "POLYGON((0 1,2 3,4 5,0 1),(6 7,8 9,10 11,6 7))",
269            "{\"type\":\"Polygon\",\"coordinates\":[[[0,1],[2,3],[4,5],[0,1]],[[6,7],[8,9],[10,11],[6,7]]]}",
270            NULL, 0, 0);
271
272        /* Multiline */
273        do_geojson_test(
274            "MULTILINESTRING((0 1,2 3,4 5),(6 7,8 9,10 11))",
275            "{\"type\":\"MultiLineString\",\"coordinates\":[[[0,1],[2,3],[4,5]],[[6,7],[8,9],[10,11]]]}",
276            NULL, 0, 0);
277
278        /* MultiPolygon */
279        do_geojson_test(
280            "MULTIPOLYGON(((0 1,2 3,4 5,0 1)),((6 7,8 9,10 11,6 7)))",
281            "{\"type\":\"MultiPolygon\",\"coordinates\":[[[[0,1],[2,3],[4,5],[0,1]]],[[[6,7],[8,9],[10,11],[6,7]]]]}",
282            NULL, 0, 0);
283
284        /* GeometryCollection */
285        do_geojson_test(
286            "GEOMETRYCOLLECTION(POINT(0 1),LINESTRING(2 3,4 5))",
287            "{\"type\":\"GeometryCollection\",\"geometries\":[{\"type\":\"Point\",\"coordinates\":[0,1]},{\"type\":\"LineString\",\"coordinates\":[[2,3],[4,5]]}]}",
288            NULL, 0, 0);
289
290        /* Empty GeometryCollection */
291        do_geojson_test(
292            "GEOMETRYCOLLECTION EMPTY",
293            "{\"type\":\"GeometryCollection\",\"geometries\":[]}",
294            NULL, 0, 0);
295
296        /* Nested GeometryCollection */
297        do_geojson_test(
298            "GEOMETRYCOLLECTION(POINT(0 1),GEOMETRYCOLLECTION(LINESTRING(2 3,4 5)))",
299            "{\"type\":\"GeometryCollection\",\"geometries\":[{\"type\":\"Point\",\"coordinates\":[0,1]},]}",
300            NULL, 0, 0);
301
302        /* CircularString */
303        do_geojson_unsupported(
304            "CIRCULARSTRING(-2 0,0 2,2 0,0 2,2 4)",
305            "lwgeom_to_geojson: 'CircularString' geometry type not supported");
306
307        /* CompoundString */
308        do_geojson_unsupported(
309            "COMPOUNDCURVE(CIRCULARSTRING(0 0,1 1,1 0),(1 0,0 1))",
310            "lwgeom_to_geojson: 'CompoundString' geometry type not supported");
311
312        /* CurvePolygon */
313        do_geojson_unsupported(
314            "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))",
315            "lwgeom_to_geojson: 'CurvePolygon' geometry type not supported");
316
317        /* MultiCurve */
318        do_geojson_unsupported(
319            "MULTICURVE((5 5,3 5,3 3,0 3),CIRCULARSTRING(0 0,2 1,2 2))",
320            "lwgeom_to_geojson: 'MultiCurve' geometry type not supported");
321
322        /* MultiSurface */
323        do_geojson_unsupported(
324            "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)))",
325            "lwgeom_to_geojson: 'MultiSurface' geometry type not supported");
326}
Note: See TracBrowser for help on using the repository browser.