Collects data from WFS service

        :return: dictionary containing info about product tiles
        :rtype: dict

def _fetch_features(self):
        """Collects data from WFS service

        :return: dictionary containing info about product tiles
        :rtype: dict
        """
        if self.feature_offset is None:
            return

        main_url = '{}{}/{}?'.format(self.base_url, ServiceType.WFS.value, self.instance_id)

        params = {'SERVICE': ServiceType.WFS.value,
                  'REQUEST': 'GetFeature',
                  'TYPENAMES': DataSource.get_wfs_typename(self.data_source),
                  'BBOX': str(self.bbox.reverse()) if self.bbox.crs is CRS.WGS84 else str(self.bbox),
                  'OUTPUTFORMAT': MimeType.get_string(MimeType.JSON),
                  'SRSNAME': CRS.ogc_string(self.bbox.crs),
                  'TIME': '{}/{}'.format(self.time_interval[0], self.time_interval[1]),
                  'MAXCC': 100.0 * self.maxcc,
                  'MAXFEATURES': SHConfig().max_wfs_records_per_query,
                  'FEATURE_OFFSET': self.feature_offset}

        url = main_url + urlencode(params)
        LOGGER.debug("URL=%s", url)
        response = get_json(url)

        is_sentinel1 = self.data_source.is_sentinel1()
        for tile_info in response["features"]:
            if not is_sentinel1 or self._sentinel1_product_check(tile_info['properties']['id'], self.data_source):
                self.tile_list.append(tile_info)

        if len(response["features"]) < SHConfig().max_wfs_records_per_query:
            self.feature_offset = None
        else:
            self.feature_offset += SHConfig().max_wfs_records_per_query