PostGIS  3.1.6dev-r@@SVN_REVISION@@

◆ parse_gml_poslist()

static POINTARRAY* parse_gml_poslist ( xmlNodePtr  xnode,
bool *  hasz 
)
static

Parse gml:posList.

Definition at line 896 of file lwgeom_in_gml.c.

897 {
898  xmlChar *dimension, *gmlposlist;
899  char *poslist, *p;
900  int dim, gml_dim;
901  POINTARRAY *dpa;
902  POINT4D pt = {0, 0, 0, 0};
903  bool digit;
904 
905  /* Retrieve gml:srsDimension attribute if any */
906  dimension = gmlGetProp(xnode, "srsDimension");
907  if (dimension == NULL) /* in GML 3.0.0 it was dimension */
908  dimension = gmlGetProp(xnode, "dimension");
909  if (dimension == NULL) dim = 2; /* We assume that we are in common 2D */
910  else
911  {
912  dim = atoi((char *) dimension);
913  xmlFree(dimension);
914  if (dim < 2 || dim > 3) gml_lwpgerror("invalid GML representation", 27);
915  }
916  if (dim == 2) *hasz = false;
917 
918  /* Retrieve gml:posList string */
919  gmlposlist = xmlNodeGetContent(xnode);
920  poslist = (char *) gmlposlist;
921 
922  /* HasZ?, !HasM, 1 point */
923  dpa = ptarray_construct_empty(1, 0, 1);
924 
925  /* gml:posList pattern: x1 y1 x2 y2
926  * x1 y1 z1 x2 y2 z2
927  */
928  while (isspace(*poslist)) poslist++; /* Eat extra whitespaces if any */
929  for (p=poslist, gml_dim=0, digit=false ; *poslist ; poslist++)
930  {
931  if (isdigit(*poslist)) digit = true;
932  if (digit && (*poslist == ' ' || *(poslist+1) == '\0'))
933  {
934  if (*poslist == ' ') *poslist = '\0';
935 
936  gml_dim++;
937  if (gml_dim == 1) pt.x = parse_gml_double(p, true, true);
938  else if (gml_dim == 2) pt.y = parse_gml_double(p, true, true);
939  else if (gml_dim == 3) pt.z = parse_gml_double(p, true, true);
940 
941  if (gml_dim == dim)
942  {
943  /* Add to ptarray, allowing dupes */
944  ptarray_append_point(dpa, &pt, LW_TRUE);
945  pt.x = pt.y = pt.z = pt.m = 0.0;
946  gml_dim = 0;
947  }
948  else if (*(poslist+1) == '\0')
949  gml_lwpgerror("invalid GML representation", 28);
950 
951  p = poslist+1;
952  digit = false;
953  }
954  }
955 
956  xmlFree(gmlposlist);
957 
958  return dpa; /* ptarray_clone_deep(dpa); */
959 }
POINTARRAY * ptarray_construct_empty(char hasz, char hasm, uint32_t maxpoints)
Create a new POINTARRAY with no points.
Definition: ptarray.c:59
int ptarray_append_point(POINTARRAY *pa, const POINT4D *pt, int allow_duplicates)
Append a point to the end of an existing POINTARRAY If allow_duplicate is LW_FALSE,...
Definition: ptarray.c:147
#define LW_TRUE
Return types for functions with status returns.
Definition: liblwgeom.h:107
static double parse_gml_double(char *d, bool space_before, bool space_after)
Parse a string supposed to be a double.
static xmlChar * gmlGetProp(xmlNodePtr xnode, const char *charProp)
Retrieve a GML property from a node or NULL otherwise Respect namespaces if presents in the node elem...
static void gml_lwpgerror(char *msg, __attribute__((__unused__)) int error_code)
Definition: lwgeom_in_gml.c:81
double m
Definition: liblwgeom.h:428
double x
Definition: liblwgeom.h:428
double z
Definition: liblwgeom.h:428
double y
Definition: liblwgeom.h:428

References gml_lwpgerror(), gmlGetProp(), LW_TRUE, POINT4D::m, parse_gml_double(), ptarray_append_point(), ptarray_construct_empty(), POINT4D::x, POINT4D::y, and POINT4D::z.

Referenced by parse_gml_data().

Here is the call graph for this function:
Here is the caller graph for this function: