/**
   * Precondition: parser cursor positioned on a geometry property (ej, {@code gml:Point}, etc)
   *
   * <p>Postcondition: parser gets positioned at the end tag of the element it started parsing the
   * geometry at
   *
   * @return
   * @throws FactoryException
   * @throws NoSuchAuthorityCodeException
   * @throws IOException
   * @throws XmlPullParserException
   */
  private Geometry parseGeom()
      throws NoSuchAuthorityCodeException, FactoryException, XmlPullParserException, IOException {
    final QName startingGeometryTagName = new QName(parser.getNamespace(), parser.getName());
    int dimension = crsDimension(2);
    CoordinateReferenceSystem crs = crs(DefaultGeographicCRS.WGS84);

    Geometry geom;
    if (GML.Point.equals(startingGeometryTagName)) {
      geom = parsePoint(dimension, crs);
    } else if (GML.LineString.equals(startingGeometryTagName)) {
      geom = parseLineString(dimension, crs);
    } else if (GML.Polygon.equals(startingGeometryTagName)) {
      geom = parsePolygon(dimension, crs);
    } else if (GML.MultiPoint.equals(startingGeometryTagName)) {
      geom = parseMultiPoint(dimension, crs);
    } else if (GML.MultiLineString.equals(startingGeometryTagName)) {
      geom = parseMultiLineString(dimension, crs);
    } else if (GML.MultiSurface.equals(startingGeometryTagName)) {
      geom = parseMultiSurface(dimension, crs);
    } else if (GML.MultiPolygon.equals(startingGeometryTagName)) {
      geom = parseMultiPolygon(dimension, crs);
    } else {
      throw new IllegalStateException("Unrecognized geometry element " + startingGeometryTagName);
    }

    parser.require(
        END_TAG, startingGeometryTagName.getNamespaceURI(), startingGeometryTagName.getLocalPart());

    return geom;
  }