PostGIS  3.4.0dev-r@@SVN_REVISION@@

◆ parse_gml_srs()

static void parse_gml_srs ( xmlNodePtr  xnode,
gmlSrs srs 
)
static

Parse gml srsName attribute.

Definition at line 414 of file lwgeom_in_gml.c.

415 {
416  char *p;
417  int is_axis_order_gis_friendly;
418  xmlNodePtr node;
419  xmlChar *srsname;
420  bool honours_authority_axis_order = false;
421  char sep = ':';
422 
423  node = xnode;
424  srsname = gmlGetProp(node, (xmlChar *) "srsName");
425  /*printf("srsname %s\n",srsname);*/
426  if (!srsname)
427  {
428  if (node->parent == NULL)
429  {
430  srs->srid = SRID_UNKNOWN;
431  srs->reverse_axis = false;
432  return;
433  }
434  parse_gml_srs(node->parent, srs);
435  }
436  else
437  {
438  /* Severals srsName formats are available...
439  * cf WFS 1.1.0 -> 9.2 (p36)
440  * cf ISO 19142:2009 -> 7.9.2.4.4 (p34)
441  * cf RFC 5165 <http://tools.ietf.org/html/rfc5165>
442  * cf CITE WFS-1.1 (GetFeature-tc17.2)
443  */
444 
445  /* SRS pattern like: EPSG:4326
446  urn:EPSG:geographicCRS:4326
447  urn:ogc:def:crs:EPSG:4326
448  urn:ogc:def:crs:EPSG::4326
449  urn:ogc:def:crs:EPSG:6.6:4326
450  urn:x-ogc:def:crs:EPSG:6.6:4326
451  http://www.opengis.net/gml/srs/epsg.xml#4326
452  http://www.epsg.org/6.11.2/4326
453  */
454 
455  if (!strncmp((char *) srsname, "EPSG:", 5))
456  {
457  sep = ':';
458  honours_authority_axis_order = false;
459  }
460  else if (!strncmp((char *) srsname, "urn:ogc:def:crs:EPSG:", 21)
461  || !strncmp((char *) srsname, "urn:x-ogc:def:crs:EPSG:", 23)
462  || !strncmp((char *) srsname, "urn:EPSG:geographicCRS:", 23))
463  {
464  sep = ':';
465  honours_authority_axis_order = true;
466  }
467  else if (!strncmp((char *) srsname,
468  "http://www.opengis.net/gml/srs/epsg.xml#", 40))
469  {
470  sep = '#';
471  honours_authority_axis_order = false;
472  }
473  else gml_lwpgerror("unknown spatial reference system", 4);
474 
475  /* retrieve the last ':' or '#' char */
476  for (p = (char *) srsname ; *p ; p++);
477  for (--p ; *p != sep ; p--)
478  if (!isdigit(*p)) gml_lwpgerror("unknown spatial reference system", 5);
479 
480  srs->srid = atoi(++p);
481 
482  /* Check into spatial_ref_sys that this SRID really exist */
483  is_axis_order_gis_friendly = gml_is_srs_axis_order_gis_friendly(srs->srid);
484  if (srs->srid == SRID_UNKNOWN || is_axis_order_gis_friendly == -1)
485  gml_lwpgerror("unknown spatial reference system", 6);
486 
487  /* Reverse axis order if the srsName is meant to honour the axis
488  order defined by the authority and if that axis order is not
489  the GIS friendly one. */
490  srs->reverse_axis = !is_axis_order_gis_friendly && honours_authority_axis_order;
491 
492  xmlFree(srsname);
493  return;
494  }
495 }
#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, xmlChar *prop)
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: