PostGIS  2.5.1dev-r@@SVN_REVISION@@

◆ parse_geojson_multipolygon()

static LWGEOM* parse_geojson_multipolygon ( json_object *  geojson,
int *  hasz,
int  root_srid 
)
static

Definition at line 393 of file lwin_geojson.c.

References findMemberByName(), geojson_lwerror(), lwcollection_construct_empty(), lwgeom_has_m(), lwgeom_has_z(), lwmpoly_add_lwpoly(), lwpoly_add_ring(), lwpoly_construct_empty(), MULTIPOLYGONTYPE, parse_geojson_coord(), ptarray_construct_empty(), and LWGEOM::srid.

Referenced by parse_geojson().

394 {
395  LWGEOM *geom = NULL;
396  int i, j, k;
397  json_object* poObjPolys = NULL;
398 
399  if (!root_srid)
400  {
401  geom = (LWGEOM *)lwcollection_construct_empty(MULTIPOLYGONTYPE, root_srid, 1, 0);
402  }
403  else
404  {
406  }
407 
408  poObjPolys = findMemberByName( geojson, "coordinates" );
409  if ( ! poObjPolys )
410  {
411  geojson_lwerror("Unable to find 'coordinates' in GeoJSON string", 4);
412  return NULL;
413  }
414 
415  if( json_type_array == json_object_get_type( poObjPolys ) )
416  {
417  const int nPolys = json_object_array_length( poObjPolys );
418 
419  for(i = 0; i < nPolys; ++i)
420  {
421  json_object* poObjPoly = json_object_array_get_idx( poObjPolys, i );
422 
423  if( json_type_array == json_object_get_type( poObjPoly ) )
424  {
425  LWPOLY *lwpoly = lwpoly_construct_empty(geom->srid, lwgeom_has_z(geom), lwgeom_has_m(geom));
426  int nRings = json_object_array_length( poObjPoly );
427 
428  for(j = 0; j < nRings; ++j)
429  {
430  json_object* points = json_object_array_get_idx( poObjPoly, j );
431 
432  if( json_type_array == json_object_get_type( points ) )
433  {
434 
435  POINTARRAY *pa = ptarray_construct_empty(1, 0, 1);
436 
437  int nPoints = json_object_array_length( points );
438  for ( k=0; k < nPoints; k++ )
439  {
440  json_object* coords = json_object_array_get_idx( points, k );
441  parse_geojson_coord(coords, hasz, pa);
442  }
443 
444  lwpoly_add_ring(lwpoly, pa);
445  }
446  }
447  geom = (LWGEOM*)lwmpoly_add_lwpoly((LWMPOLY*)geom, lwpoly);
448  }
449  }
450  }
451 
452  return geom;
453 }
static void geojson_lwerror(char *msg, __attribute__((__unused__)) int error_code)
Definition: lwin_geojson.c:55
POINTARRAY * ptarray_construct_empty(char hasz, char hasm, uint32_t maxpoints)
Create a new POINTARRAY with no points.
Definition: ptarray.c:70
static int parse_geojson_coord(json_object *poObj, int *hasz, POINTARRAY *pa)
Definition: lwin_geojson.c:103
int lwgeom_has_z(const LWGEOM *geom)
Return LW_TRUE if geometry has Z ordinates.
Definition: lwgeom.c:930
int32_t srid
Definition: liblwgeom.h:401
#define MULTIPOLYGONTYPE
Definition: liblwgeom.h:89
static json_object * findMemberByName(json_object *poObj, const char *pszName)
Definition: lwin_geojson.c:65
LWPOLY * lwpoly_construct_empty(int srid, char hasz, char hasm)
Definition: lwpoly.c:161
int lwpoly_add_ring(LWPOLY *poly, POINTARRAY *pa)
Add a ring, allocating extra space if necessary.
Definition: lwpoly.c:247
LWCOLLECTION * lwcollection_construct_empty(uint8_t type, int srid, char hasz, char hasm)
Definition: lwcollection.c:94
int lwgeom_has_m(const LWGEOM *geom)
Return LW_TRUE if geometry has M ordinates.
Definition: lwgeom.c:937
LWMPOLY * lwmpoly_add_lwpoly(LWMPOLY *mobj, const LWPOLY *obj)
Definition: lwmpoly.c:47
Here is the call graph for this function:
Here is the caller graph for this function: