PostGIS  3.7.0dev-r@@SVN_REVISION@@

◆ parse_gml_srs()

static void parse_gml_srs ( xmlNodePtr  xnode,
gmlSrs srs 
)
static

Parse gml srsName attribute.

Definition at line 450 of file lwgeom_in_gml.c.

451 {
452  char *p;
453  int is_axis_order_gis_friendly;
454  xmlNodePtr node;
455  xmlChar *srsname;
456  bool honours_authority_axis_order = false;
457  char sep = ':';
458 
459  node = xnode;
460  srsname = gmlGetProp(node, "srsName");
461  /*printf("srsname %s\n",srsname);*/
462  if (!srsname)
463  {
464  if (node->parent == NULL)
465  {
466  srs->srid = SRID_UNKNOWN;
467  srs->reverse_axis = false;
468  return;
469  }
470  parse_gml_srs(node->parent, srs);
471  }
472  else
473  {
474  /* Severals srsName formats are available...
475  * cf WFS 1.1.0 -> 9.2 (p36)
476  * cf ISO 19142:2009 -> 7.9.2.4.4 (p34)
477  * cf RFC 5165 <http://tools.ietf.org/html/rfc5165>
478  * cf CITE WFS-1.1 (GetFeature-tc17.2)
479  */
480 
481  /* SRS pattern like: EPSG:4326
482  urn:EPSG:geographicCRS:4326
483  urn:ogc:def:crs:EPSG:4326
484  urn:ogc:def:crs:EPSG::4326
485  urn:ogc:def:crs:EPSG:6.6:4326
486  urn:x-ogc:def:crs:EPSG:6.6:4326
487  http://www.opengis.net/gml/srs/epsg.xml#4326
488  http://www.epsg.org/6.11.2/4326
489  */
490 
491  if (!strncmp((char *) srsname, "EPSG:", 5))
492  {
493  sep = ':';
494  honours_authority_axis_order = false;
495  }
496  else if (!strncmp((char *) srsname, "urn:ogc:def:crs:EPSG:", 21)
497  || !strncmp((char *) srsname, "urn:x-ogc:def:crs:EPSG:", 23)
498  || !strncmp((char *) srsname, "urn:EPSG:geographicCRS:", 23))
499  {
500  sep = ':';
501  honours_authority_axis_order = true;
502  }
503  else if (!strncmp((char *) srsname,
504  "http://www.opengis.net/gml/srs/epsg.xml#", 40))
505  {
506  sep = '#';
507  honours_authority_axis_order = false;
508  }
509  else gml_lwpgerror("unknown spatial reference system", 4);
510 
511  /* retrieve the last ':' or '#' char */
512  for (p = (char *) srsname ; *p ; p++);
513  for (--p ; *p != sep ; p--)
514  if (!isdigit(*p)) gml_lwpgerror("unknown spatial reference system", 5);
515 
516  srs->srid = atoi(++p);
517 
518  /* Check into spatial_ref_sys that this SRID really exist */
519  is_axis_order_gis_friendly = gml_is_srs_axis_order_gis_friendly(srs->srid);
520  if (srs->srid == SRID_UNKNOWN || is_axis_order_gis_friendly == -1)
521  gml_lwpgerror("unknown spatial reference system", 6);
522 
523  /* Reverse axis order if the srsName is meant to honour the axis
524  order defined by the authority and if that axis order is not
525  the GIS friendly one. */
526  srs->reverse_axis = !is_axis_order_gis_friendly && honours_authority_axis_order;
527 
528  xmlFree(srsname);
529  return;
530  }
531 }
#define SRID_UNKNOWN
Unknown SRID value.
Definition: liblwgeom.h:215
static int gml_is_srs_axis_order_gis_friendly(int32_t srid)
Return 1 if the SRS definition from the authority has a GIS friendly order, that is easting,...
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 parse_gml_srs(xmlNodePtr xnode, gmlSrs *srs)
Parse gml srsName attribute.
static void gml_lwpgerror(char *msg, __attribute__((__unused__)) int error_code)
Definition: lwgeom_in_gml.c:81

References gml_is_srs_axis_order_gis_friendly(), gml_lwpgerror(), gmlGetProp(), struct_gmlSrs::reverse_axis, struct_gmlSrs::srid, and SRID_UNKNOWN.

Referenced by parse_gml(), parse_gml_coll(), parse_gml_curve(), parse_gml_data(), parse_gml_line(), parse_gml_linearring(), parse_gml_mcurve(), parse_gml_mline(), parse_gml_mpoint(), parse_gml_mpoly(), parse_gml_msurface(), parse_gml_patch(), parse_gml_point(), parse_gml_polygon(), parse_gml_psurface(), parse_gml_tin(), and parse_gml_triangle().

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