def getfeature( self, typename=None, filter=None, bbox=None, featureid=None, featureversion=None, propertyname=None, maxfeatures=None, storedQueryID=None, storedQueryParams=None, method="Get", outputFormat=None, startindex=None, sortby=None, ): """Request and return feature data as a file-like object. #TODO: NOTE: have changed property name from ['*'] to None - check the use of this in WFS 2.0 Parameters ---------- typename : list List of typenames (string) filter : string XML-encoded OGC filter expression. bbox : tuple (left, bottom, right, top) in the feature type's coordinates == (minx, miny, maxx, maxy) featureid : list List of unique feature ids (string) featureversion : string Default is most recent feature version. propertyname : list List of feature property names. '*' matches all. maxfeatures : int Maximum number of features to be returned. method : string Qualified name of the HTTP DCP method to use. outputFormat: string (optional) Requested response format of the request. startindex: int (optional) Start position to return feature set (paging in combination with maxfeatures) sortby: list (optional) List of property names whose values should be used to order (upon presentation) the set of feature instances that satify the query. There are 3 different modes of use 1) typename and bbox (simple spatial query) 2) typename and filter (==query) (more expressive) 3) featureid (direct access to known features) """ storedQueryParams = storedQueryParams or {} url = data = None if typename and type(typename) == type(""): # noqa: E721 typename = [typename] if method.upper() == "GET": (url) = self.getGETGetFeatureRequest( typename, filter, bbox, featureid, featureversion, propertyname, maxfeatures, storedQueryID, storedQueryParams, outputFormat, "Get", startindex, sortby, ) if log.isEnabledFor(logging.DEBUG): log.debug("GetFeature WFS GET url %s" % url) else: (url, data) = self.getPOSTGetFeatureRequest() # If method is 'Post', data will be None here u = openURL(url, data, method, timeout=self.timeout, auth=self.auth) # check for service exceptions, rewrap, and return # We're going to assume that anything with a content-length > 32k # is data. We'll check anything smaller. if "Content-Length" in u.info(): length = int(u.info()["Content-Length"]) have_read = False else: data = u.read() have_read = True length = len(data) if length < 32000: if not have_read: data = u.read() try: tree = etree.fromstring(data) except BaseException: # Not XML return makeStringIO(data) else: if tree.tag == "{%s}ServiceExceptionReport" % OGC_NAMESPACE: se = tree.find(nspath("ServiceException", OGC_NAMESPACE)) raise ServiceException(str(se.text).strip()) else: return makeStringIO(data) else: if have_read: return makeStringIO(data) return u
def getfeature( self, typename=None, filter=None, bbox=None, featureid=None, featureversion=None, propertyname="*", maxfeatures=None, srsname=None, outputFormat=None, method="{http://www.opengis.net/wfs}Get", startindex=None, ): """Request and return feature data as a file-like object. Parameters ---------- typename : list List of typenames (string) filter : string XML-encoded OGC filter expression. bbox : tuple (left, bottom, right, top) in the feature type's coordinates. featureid : list List of unique feature ids (string) featureversion : string Default is most recent feature version. propertyname : list List of feature property names. '*' matches all. maxfeatures : int Maximum number of features to be returned. method : string Qualified name of the HTTP DCP method to use. srsname: string EPSG code to request the data in outputFormat: string (optional) Requested response format of the request. startindex: int (optional) Start position to return feature set (paging in combination with maxfeatures) There are 3 different modes of use 1) typename and bbox (simple spatial query) 2) typename and filter (more expressive) 3) featureid (direct access to known features) """ try: base_url = next( (m.get("url") for m in self.getOperationByName("GetFeature").methods if m.get("type").lower() == method.lower())) except StopIteration: base_url = self.url request = { "service": "WFS", "version": self.version, "request": "GetFeature" } # check featureid if featureid: request["featureid"] = ",".join(featureid) elif bbox and typename: request["bbox"] = ",".join([repr(x) for x in bbox]) elif filter and typename: request["filter"] = str(filter) if srsname: request["srsname"] = str(srsname) assert len(typename) > 0 request["typename"] = ",".join(typename) if propertyname is not None: if not isinstance(propertyname, list): propertyname = [propertyname] request["propertyname"] = ",".join(propertyname) if featureversion: request["featureversion"] = str(featureversion) if maxfeatures: request["maxfeatures"] = str(maxfeatures) if startindex: request["startindex"] = str(startindex) if outputFormat is not None: request["outputFormat"] = outputFormat data = urlencode(request) log.debug("Making request: %s?%s" % (base_url, data)) u = openURL(base_url, data, method, timeout=self.timeout, auth=self.auth) # check for service exceptions, rewrap, and return # We're going to assume that anything with a content-length > 32k # is data. We'll check anything smaller. if "Content-Length" in u.info(): length = int(u.info()["Content-Length"]) have_read = False else: data = u.read() have_read = True length = len(data) if length < 32000: if not have_read: data = u.read() try: tree = etree.fromstring(data) except BaseException: # Not XML return makeStringIO(data) else: if tree.tag == "{%s}ServiceExceptionReport" % OGC_NAMESPACE: se = tree.find(nspath("ServiceException", OGC_NAMESPACE)) raise ServiceException(str(se.text).strip()) else: return makeStringIO(data) else: if have_read: return makeStringIO(data) return u
def getfeature( self, typename=None, filter=None, bbox=None, featureid=None, featureversion=None, propertyname="*", maxfeatures=None, srsname=None, outputFormat=None, method="Get", startindex=None, sortby=None, ): """Request and return feature data as a file-like object. Parameters ---------- typename : list List of typenames (string) filter : string XML-encoded OGC filter expression. bbox : tuple (left, bottom, right, top) in the feature type's coordinates. featureid : list List of unique feature ids (string) featureversion : string Default is most recent feature version. propertyname : list List of feature property names. '*' matches all. maxfeatures : int Maximum number of features to be returned. method : string Qualified name of the HTTP DCP method to use. srsname: string EPSG code to request the data in outputFormat: string (optional) Requested response format of the request. startindex: int (optional) Start position to return feature set (paging in combination with maxfeatures) sortby: list (optional) List of property names whose values should be used to order (upon presentation) the set of feature instances that satify the query. There are 3 different modes of use 1) typename and bbox (simple spatial query). It is assumed, that bbox coordinates are given *always* in the east,north order 2) typename and filter (more expressive) 3) featureid (direct access to known features) """ try: base_url = next( (m.get("url") for m in self.getOperationByName("GetFeature").methods if m.get("type").lower() == method.lower())) except StopIteration: base_url = self.url request = { "service": "WFS", "version": self.version, "request": "GetFeature" } if not isinstance(typename, list): typename = [typename] if srsname is not None: request["srsname"] = str(srsname) # Check, if desired SRS is supported by the service for each # typename. Warning will be thrown if that SRS is not allowed." for name in typename: _ = self.getSRS(srsname, name) # check featureid if featureid: request["featureid"] = ",".join(featureid) # bbox elif bbox and typename: request["bbox"] = self.getBBOXKVP(bbox, typename) # or filter elif filter and typename: request["filter"] = str(filter) assert len(typename) > 0 request["typename"] = ",".join(typename) if propertyname is not None: if not isinstance(propertyname, list): propertyname = [propertyname] request["propertyname"] = ",".join(propertyname) if sortby is not None: if not isinstance(sortby, list): sortby = [sortby] request["sortby"] = ",".join(sortby) if featureversion is not None: request["featureversion"] = str(featureversion) if maxfeatures is not None: request["maxfeatures"] = str(maxfeatures) if startindex is not None: request["startindex"] = str(startindex) if outputFormat is not None: request["outputFormat"] = outputFormat data = urlencode(request) log.debug("Making request: %s?%s" % (base_url, data)) u = openURL(base_url, data, method, timeout=self.timeout, auth=self.auth) # check for service exceptions, rewrap, and return # We're going to assume that anything with a content-length > 32k # is data. We'll check anything smaller. if "Content-Length" in u.info(): length = int(u.info()["Content-Length"]) have_read = False else: data = u.read() have_read = True length = len(data) if length < 32000: if not have_read: data = u.read() try: tree = etree.fromstring(data) except BaseException: # Not XML return makeStringIO(data) else: if tree.tag == "{%s}ServiceExceptionReport" % namespaces["ogc"]: se = tree.find( nspath_eval("ServiceException", namespaces["ogc"])) raise ServiceException(str(se.text).strip()) else: return makeStringIO(data) else: if have_read: return makeStringIO(data) return u