266{
269 uint32_t i, j, k;
270
271 double *xpts, *ypts, *zpts, *mpts;
272
273 int *shpparts, shppointtotal = 0, shppoint = 0, shpringtotal = 0, shpring = 0;
274
275
276
277
278 for (i = 0; i < lwmultipolygon->
ngeoms; i++)
279 {
280 for (j = 0; j < lwmultipolygon->
geoms[i]->
nrings; j++)
281 {
282 shpringtotal++;
284 }
285 }
286
287
288 shpparts =
malloc(
sizeof(
int) * shpringtotal);
289
290
291 xpts =
malloc(
sizeof(
double) * shppointtotal);
292 ypts =
malloc(
sizeof(
double) * shppointtotal);
293 zpts =
malloc(
sizeof(
double) * shppointtotal);
294 mpts =
malloc(
sizeof(
double) * shppointtotal);
295
296 LWDEBUGF(4,
"Total number of rings: %d Total number of points: %d", shpringtotal, shppointtotal);
297
298
299 for (i = 0; i < lwmultipolygon->
ngeoms; i++)
300 {
301 for (j = 0; j < lwmultipolygon->
geoms[i]->
nrings; j++)
302 {
303
304 shpparts[shpring] = shppoint;
305
306 LWDEBUGF(4,
"Ring offset: %d", shpring);
307
309 {
311
312 xpts[shppoint] = p4d.
x;
313 ypts[shppoint] = p4d.
y;
314 zpts[shppoint] = p4d.
z;
315 mpts[shppoint] = p4d.
m;
316
317 LWDEBUGF(4,
"MultiPolygon %d Polygon Ring %d - Point: %g %g %g %g", i, j, xpts[shppoint], ypts[shppoint], zpts[shppoint], mpts[shppoint]);
318
319
320 shppoint++;
321 }
322
323
324
325
326
327 if ( j == 0 )
328 {
330 &xpts[shpparts[shpring]], &ypts[shpparts[shpring]], NULL) )
331 {
332 LWDEBUG(4,
"Outer ring not clockwise, forcing clockwise\n");
333
335 &xpts[shpparts[shpring]], &ypts[shpparts[shpring]],
336 &zpts[shpparts[shpring]], &mpts[shpparts[shpring]]);
337 }
338 }
339 else
340 {
342 &xpts[shpparts[shpring]], &ypts[shpparts[shpring]], NULL) )
343 {
344 LWDEBUGF(4,
"Inner ring %d not counter-clockwise, forcing counter-clockwise\n", i);
345
347 &xpts[shpparts[shpring]], &ypts[shpparts[shpring]],
348 &zpts[shpparts[shpring]], &mpts[shpparts[shpring]]);
349 }
350 }
351
352
353 shpring++;
354 }
355 }
356
358
364
365 return obj;
366}
POINT4D getPoint4d(const POINTARRAY *pa, uint32_t n)
#define LWDEBUG(level, msg)
#define LWDEBUGF(level, msg,...)
static int reverse_points(int num_points, double *x, double *y, double *z, double *m)
static int is_clockwise(int num_points, double *x, double *y, double *z)
SHPObject SHPAPI_CALL1 * SHPCreateObject(int nSHPType, int nShapeId, int nParts, const int *panPartStart, const int *panPartType, int nVertices, const double *padfX, const double *padfY, const double *padfZ, const double *padfM);SHPObject SHPAPI_CALL1(*) SHPCreateSimpleObject(int nSHPType, int nVertices, const double *padfX, const double *padfY, const double *padfZ