def __init__(self, x, y, epsg=31370): """Initialise a Point. To initialise a Point using GPS coordinates in decimal degrees, use epsg=4326 and enter the longitude as `x` and the latitude as `y`. Parameters ---------- x : float X coordinate (or longitude) of the point. y : float Y coordinate (or latitude) of the point. epsg : int, optional EPSG code of the coordinate reference system (CRS) of the coordinates specified in `x`, `y`. Defaults to 31370 (Belgian Lambert72). """ self.x = x self.y = y self.element = etree.Element('{http://www.opengis.net/gml}Point') self.element.set('srsDimension', '2') self.element.set( 'srsName', 'http://www.opengis.net/gml/srs/epsg.xml#{:d}'.format(epsg)) coordinates = etree.Element('{http://www.opengis.net/gml}pos') coordinates.text = '{:.06f} {:.06f}'.format(self.x, self.y) self.element.append(coordinates)
def __init__(self, location, distance, distance_unit='meter'): """Initialise a WithinDistance filter. Parameters ---------- location : AbstractLocation An instance of a location to use as location for the WithinDistance filter. distance : float Amount of distance units to use for the filter. distance_unit : string, optional, defaults to 'meter' The distance unit of the value of `distance`. """ self.location = location self.distance = distance self.distance_unit = distance_unit self.geom_column = '' self.element = etree.Element('{http://www.opengis.net/ogc}DWithin') geom = etree.Element('{http://www.opengis.net/ogc}PropertyName') geom.text = self.geom_column distance = etree.Element('{http://www.opengis.net/ogc}Distance') distance.set('units', self.distance_unit) distance.text = '{:.06f}'.format(self.distance) self.element.append(geom) self.element.append(location.get_element()) self.element.append(distance)
def __init__(self, box): self.box = box self.geom_column = '' self.element = etree.Element('{http://www.opengis.net/ogc}Within') geom = etree.Element('{http://www.opengis.net/ogc}PropertyName') geom.text = self.geom_column self.element.append(geom) self.element.append(box.get_element())
def __init__(self, minx, miny, maxx, maxy, epsg=31370): """Initialise a Box. To initialise a Box using GPS coordinates in decimal degrees, use epsg=4326 and enter the longitude range as `minx` and `maxx` and the latitude range as `miny` and `maxy`. Parameters ---------- minx : float X coordinate of the lower left corner of the box. miny : float Y coordinate of the lower left corner of the box. maxx : float X coordinate of the upper right corner of the box. maxy : float Y coordinate of the upper right corner of the box. epsg : int, optional EPSG code of the coordinate reference system (CRS) of the coordinates specified in `minx`, `miny`, `maxx`, `maxy`. Defaults to 31370 (Belgian Lambert72). Raises ------ ValueError If `maxx` is lower than or equal to `minx`. If `maxy` is lower than or equal to `miny`. """ if maxx <= minx: raise ValueError("MaxX should be greater than MinX.") if maxy <= miny: raise ValueError("MaxY should be greater than MinY.") self.minx = minx self.miny = miny self.maxx = maxx self.maxy = maxy self.element = etree.Element('{http://www.opengis.net/gml}Envelope') self.element.set('srsDimension', '2') self.element.set( 'srsName', 'http://www.opengis.net/gml/srs/epsg.xml#{:d}'.format(epsg)) lower_corner = etree.Element('{http://www.opengis.net/gml}lowerCorner') lower_corner.text = '{:.06f} {:.06f}'.format(self.minx, self.miny) self.element.append(lower_corner) upper_corner = etree.Element('{http://www.opengis.net/gml}upperCorner') upper_corner.text = '{:.06f} {:.06f}'.format(self.maxx, self.maxy) self.element.append(upper_corner)
def __init__(self, x, y, epsg=31370): self.x = x self.y = y self.element = etree.Element('{http://www.opengis.net/gml}Point') self.element.set('srsName', 'http://www.opengis.net/gml/srs/epsg.xml#%i' % epsg) coordinates = etree.Element('{http://www.opengis.net/gml}coordinates') coordinates.set('decimal', '.') coordinates.set('cs', ',') coordinates.set('ts', ' ') coordinates.text = '%f,%f' % (self.x, self.y)
def axml_operation(d): # <owc:operation code="GetCapabilities" method="GET" # type="applica..." href="..." # <owc:request type="application/xml"> .. # etree.SubElement(entry, ns_elem("owc", "offering"), name="blah").text = "some value1" if is_empty(d): return None else: try: operation = etree.Element(ns_elem("owc", "operation"), nsmap=ns) operations_code = extract_p('code', d, None) if operations_code is not None: operation.set("code", operations_code) http_method = extract_p('method', d, None) if http_method is not None: operation.set("method", http_method) mimetype = extract_p('type', d, None) if mimetype is not None: operation.set("type", mimetype) request_url = extract_p('href', d, None) if request_url is not None: operation.set("href", request_url) # use axml_content here request = extract_p('request', d, None) request_enc = None if request is None else axml_content(request) if request_enc is not None: operation.append(request_enc) # use axml_content here result = extract_p('result', d, None) result_enc = None if result is None else axml_content(result) if result_enc is not None: operation.append(result_enc) return operation except Exception as ex: log.warn('could encode operation', ex) return None
def toXML(self): node0 = etree.Element( util.nspath_eval('ogc:PropertyIsNull', namespaces)) etree.SubElement(node0, util.nspath_eval('ogc:PropertyName', namespaces)).text = self.propertyname return node0
def toXML(self): node0 = etree.Element(util.nspath_eval(self.propertyoperator, namespaces)) if not self.matchcase: node0.set('matchCase', 'false') etree.SubElement(node0, util.nspath_eval('ogc:PropertyName', namespaces)).text = self.propertyname etree.SubElement(node0, util.nspath_eval('ogc:Literal', namespaces)).text = self.literal return node0
def axml_offering(d): # <owc:offering code="http://www.opengis.net/spec/owc-at..."> # <owc:offering code="http://www.opengis.net/spec....l"> # <owc:content type="application/gml+xml"> if is_empty(d): return None else: try: offering_code = extract_p('code', d, None) offering = etree.Element(ns_elem("owc", "offering"), attrib={"code": offering_code}, nsmap=ns) # use axml_operation here operations = [ axml_operation(do) for do in extract_p('operations', d, []) ] [offering.append(el) for el in operations if el is not None] # use axml_content here contents = [ axml_content(do) for do in extract_p('contents', d, []) ] [offering.append(el) for el in contents if el is not None] # use axml_styeset here styles = [axml_styleset(do) for do in extract_p('styles', d, [])] [offering.append(el) for el in styles if el is not None] return offering except Exception as ex: log.warning('could encode offering', ex) return None
def axml_link(d): # < link rel = "via" type = "application/xml" href = "..." title = "..." if is_empty(d): return None else: try: link = etree.Element("link", nsmap=ns) href = extract_p('href', d, None) if href is not None: link.set("href", href) rel = extract_p('rel', d, None) if rel is not None: link.set("rel", rel) mimetype = extract_p('type', d, None) if mimetype is not None: link.set("type", mimetype) lang = extract_p('lang', d, None) if lang is not None: link.set("lang", lang) title = extract_p('title', d, None) if title is not None: link.set("title", title) length = try_int(extract_p('length', d, None)) if length is not None: link.set("length", str(length)) return link except Exception as ex: log.warning('could not encode link', ex) return None
def describerecord(self, typename='csw:Record', format=outputformat): """ Construct and process DescribeRecord request Parameters ---------- - typename: the typename to describe (default is 'csw:Record') - format: the outputFormat (default is 'application/xml') """ # construct request node0 = etree.Element( util.nspath_eval('csw:DescribeRecord', namespaces)) node0.set('service', self.service) node0.set('version', self.version) node0.set('outputFormat', format) node0.set('schemaLanguage', namespaces['xs2']) node0.set(util.nspath_eval('xsi:schemaLocation', namespaces), schema_location) etree.SubElement(node0, util.nspath_eval('csw:TypeName', namespaces)).text = typename self.request = util.xml2string(etree.tostring(node0)) self._invoke()
def axml_content(d): """ OwcContent dict to Atom XML :param d: :return: """ # <owc:content type="image/tiff" href=".." if is_empty(d): return None else: try: content_elem = etree.Element(ns_elem("owc", "content"), nsmap=ns) mimetype = extract_p('type', d, None) if mimetype is not None: content_elem.set("type", mimetype) url = extract_p('url', d, None) if url is not None: content_elem.set("href", url) title = extract_p('title', d, None) if title is not None: content_elem.set("title", title) content = extract_p('content', d, None) if content is None: content_elem.text = content return content_elem except Exception as ex: log.warning('could encode content', ex) return None
def axml_display(d): # <owc:display> # <owc:pixelWidth> if is_empty(d): return None else: try: creator_display = etree.Element(ns_elem("owc", "display"), nsmap=ns) pixel_width = try_int(extract_p('pixelWidth', d, None)) if pixel_width is not None: etree.SubElement(creator_display, ns_elem("owc", "pixelWidth")).text = str(pixel_width) pixel_height = try_int(extract_p('pixelHeight', d, None)) if pixel_height is not None: etree.SubElement(creator_display, ns_elem( "owc", "pixelHeight")).text = str(pixel_height) mm_per_pixel = try_float(extract_p('mmPerPixel', d, None)) if mm_per_pixel is not None: etree.SubElement(creator_display, ns_elem( "owc", "mmPerPixel")).text = str(mm_per_pixel) return creator_display except Exception as ex: log.warning('could encode creator_display', ex) return None
def toXML(self): tmp = etree.Element(util.nspath_eval('ogc:BBOX', namespaces)) etree.SubElement(tmp, util.nspath_eval('ogc:PropertyName', namespaces)).text = 'ows:BoundingBox' tmp2 = etree.SubElement(tmp, util.nspath_eval('gml:Envelope', namespaces)) etree.SubElement(tmp2, util.nspath_eval('gml:lowerCorner', namespaces)).text = '%s %s' % (self.bbox[0], self.bbox[1]) etree.SubElement(tmp2, util.nspath_eval('gml:upperCorner', namespaces)).text = '%s %s' % (self.bbox[2], self.bbox[3]) return tmp
def toXML(self): node0 = etree.Element(util.nspath_eval('ogc:PropertyIsBetween', namespaces)) etree.SubElement(node0, util.nspath_eval('ogc:PropertyName', namespaces)).text = self.propertyname node1 = etree.SubElement(node0, util.nspath_eval('ogc:LowerBoundary', namespaces)) etree.SubElement(node1, util.nspath_eval('ogc:Literal', namespaces)).text = '%s' % self.lower node2 = etree.SubElement(node0, util.nspath_eval('ogc:UpperBoundary', namespaces)) etree.SubElement(node2, util.nspath_eval('ogc:Literal', namespaces)).text = '%s' % self.upper return node0
def toXML(self): node0 = etree.Element(util.nspath_eval('ogc:PropertyIsLike', namespaces)) node0.set('wildCard', self.wildCard) node0.set('singleChar', self.singleChar) node0.set('escapeChar', self.escapeChar) etree.SubElement(node0, util.nspath_eval('ogc:PropertyName', namespaces)).text = self.propertyname etree.SubElement(node0, util.nspath_eval('ogc:Literal', namespaces)).text = self.literal return node0
def toXML(self): node0 = etree.Element(util.nspath_eval("ogc:SortProperty", namespaces)) etree.SubElement(node0, util.nspath_eval('ogc:PropertyName', namespaces)).text = self.propertyname etree.SubElement(node0, util.nspath_eval('ogc:SortOrder', namespaces)).text = self.order return node0
def __init__(self, point, distance, distance_units='meter'): self.point = point self.distance = distance self.distance_units = distance_units self.geom_column = '' self.element = etree.Element('{http://www.opengis.net/ogc}DWithin') geom = etree.Element('{http://www.opengis.net/ogc}PropertyName') geom.text = self.geom_column distance = etree.Element('{http://www.opengis.net/ogc}Distance') distance.set('units', self.distance_units) distance.text = '%f' % self.distance self.element.append(geom) self.element.append(point.get_element()) self.element.append(distance)
def __init__(self, minx, miny, maxx, maxy, epsg=31370): self.minx = minx self.miny = miny self.maxx = maxx self.maxy = maxy self.element = etree.Element('{http://www.opengis.net/gml}Envelope') self.element.set('srsDimension', '2') self.element.set('srsName', 'http://www.opengis.net/gml/srs/epsg.xml#%i' % epsg) lower_corner = etree.Element('{http://www.opengis.net/gml}lowerCorner') lower_corner.text = '%0.3f %0.3f' % (self.minx, self.miny) self.element.append(lower_corner) upper_corner = etree.Element('{http://www.opengis.net/gml}upperCorner') upper_corner.text = '%0.3f %0.3f' % (self.maxx, self.maxy) self.element.append(upper_corner)
def set_featureid(self, featureid): """Set filter by feature id. Cannot be used with set_bbox() or set_filter(). """ feature_tree = etree.SubElement(self._query, util.nspath('Filter', FES_NAMESPACE)) for ft in featureid: prop_id = etree.Element(util.nspath('ResourceId', FES_NAMESPACE)) prop_id.set('rid', ft) feature_tree.append(prop_id)
def toXML(self): tmp = etree.Element(util.nspath_eval('ogc:BBOX', namespaces)) etree.SubElement(tmp, util.nspath_eval('ogc:PropertyName', namespaces)).text = 'ows:BoundingBox' tmp2 = etree.SubElement(tmp, util.nspath_eval('gml:Envelope', namespaces)) if self.crs is not None: tmp2.set('srsName', self.crs) etree.SubElement(tmp2, util.nspath_eval('gml:lowerCorner', namespaces)).text = '{} {}'.format( self.bbox[0], self.bbox[1]) etree.SubElement(tmp2, util.nspath_eval('gml:upperCorner', namespaces)).text = '{} {}'.format( self.bbox[2], self.bbox[3]) return tmp
def set_featureid(self, featureid): """Set filter by feature id. Cannot be used with set_bbox() or set_filter(). """ feature_tree = etree.SubElement(self._query, util.nspath('Filter', OGC_NAMESPACE)) for ft in featureid: prop_id = etree.Element(util.nspath('GmlObjectId', OGC_NAMESPACE)) prop_id.set(util.nspath('id', GML_NAMESPACE), ft) feature_tree.append(prop_id)
def __init__(self, type, location): """Initialise a Binary spatial filter. Parameters ---------- type : str Type of this filter: one of Equals, Disjoint, Touches, Within, Overlaps, Crosses, Intersects or Contains. location : AbstractLocation An instance of a location to use as location for the Within filter. """ self.location = location self.geom_column = '' self.element = etree.Element('{http://www.opengis.net/ogc}%s' % type) geom = etree.Element('{http://www.opengis.net/ogc}PropertyName') geom.text = self.geom_column self.element.append(geom) self.element.append(location.get_element())
def getdomain(self, dname, dtype='parameter'): """ Construct and process a GetDomain request Parameters ---------- - dname: the value of the Parameter or Property to query - dtype: whether to query a parameter (parameter) or property (property) """ # construct request dtypename = 'ParameterName' node0 = etree.Element(util.nspath_eval('csw:GetDomain', namespaces)) node0.set('service', self.service) node0.set('version', self.version) node0.set(util.nspath_eval('xsi:schemaLocation', namespaces), schema_location) if dtype == 'property': dtypename = 'PropertyName' etree.SubElement(node0, util.nspath_eval('csw:%s' % dtypename, namespaces)).text = dname self.request = util.xml2string(etree.tostring(node0)) self._invoke() if self.exceptionreport is None: self.results = {} val = self._exml.find( util.nspath_eval('csw:DomainValues', namespaces)).attrib.get('type') self.results['type'] = util.testXMLValue(val, True) val = self._exml.find( util.nspath_eval('csw:DomainValues/csw:%s' % dtypename, namespaces)) self.results[dtype] = util.testXMLValue(val) # get the list of values associated with the Domain self.results['values'] = [] for f in self._exml.findall( util.nspath_eval( 'csw:DomainValues/csw:ListOfValues/csw:Value', namespaces)): self.results['values'].append(util.testXMLValue(f))
def __init__(self, parent=None, version='1.1.0'): """ filter Constructor Parameters ---------- - parent: parent etree.Element object (default is None) - version: version (default is '1.1.0') """ self.version = version self._root = etree.Element(util.nspath_eval('ogc:Filter', namespaces)) if parent is not None: self._root.set(util.nspath_eval('xsi:schemaLocation', namespaces), schema_location)
def axml_creator_app(d): # <generator uri="http://w.." version="1.0">MiraMon</generator> if is_empty(d): return None else: try: creator_app = etree.Element("generator", nsmap=ns) title = extract_p('title', d, None) if title is not None: creator_app.text = title uri = extract_p('uri', d, None) if uri is not None: creator_app.set("uri", uri) version = extract_p('version', d, None) if version is not None: creator_app.set("version", version) return creator_app except Exception as ex: log.warn('could encode creator_app', ex) return None
def axml_category(d): # <category term="maps" label="This file contains maps"/> if is_empty(d): return None else: try: category = etree.Element("category", nsmap=ns) term = extract_p('term', d, None) if term is not None: category.set("term", term) scheme = extract_p('scheme', d, None) if scheme is not None: category.set("scheme", scheme) label = extract_p('label', d, None) if label is not None: category.set("label", label) return category except Exception as ex: log.warn('could encode category', ex) return None
def from_wfs(cls, response, namespace): """Build instances of this type from a WFS response. Parameters ---------- response : str or bytes or etree.Element or iterable<etree.Element> WFS response containing GML features. Can either be a GML `str` or `byte` sequence, in which case it will be parsed and scanned for `gml:featureMembers`. Can also be a single instance of `etree.Element` containing the parsed GML response. It can also be an iterable (list, tuple or generator) of `etree.Element` in which case it will be looped over. namespace : str Namespace associated with this WFS featuretype. Yields ------ An instance of this type for each record in the WFS response. """ if type(response) is str: response = response.encode('utf-8') if type(response) is bytes: response = etree.fromstring(response) element_type = type(etree.Element(b'xml')) if isinstance(response, element_type): feature_members = response.find('.//{http://www.opengis.net/gml}' 'featureMembers') if feature_members is not None: for ft in feature_members: yield (cls.from_wfs_element(ft, namespace)) if type(response) in (list, tuple, set) \ or isinstance(response, types.GeneratorType): for el in response: yield (cls.from_wfs_element(el, namespace))
def getrecordbyid(self, id=[], esn='full', outputschema=namespaces['csw'], format=outputformat): """ Construct and process a GetRecordById request Parameters ---------- - id: the list of Ids - esn: the ElementSetName 'full', 'brief' or 'summary' (default is 'full') - outputschema: the outputSchema (default is 'http://www.opengis.net/cat/csw/2.0.2') - format: the outputFormat (default is 'application/xml') """ # construct request node0 = etree.Element(util.nspath_eval('csw:GetRecordById', namespaces)) node0.set('outputSchema', outputschema) node0.set('outputFormat', format) node0.set('version', self.version) node0.set('service', self.service) node0.set(util.nspath_eval('xsi:schemaLocation', namespaces), schema_location) for i in id: etree.SubElement(node0, util.nspath_eval('csw:Id', namespaces)).text = i etree.SubElement(node0, util.nspath_eval('csw:ElementSetName', namespaces)).text = esn self.request = util.xml2string(etree.tostring(node0)) self._invoke() if self.exceptionreport is None: self.results = {} self.records = {} self._parserecords(outputschema, esn)
def axml_styleset(d): # <owc:styleSet> # <owc:name>raster</owc:name> # <owc:title>Default Raster</owc:title> # <owc:abstract>A sample style that draws a </owc:abstract> # <owc:legendURL href="h...." type="image/png"/> # </owc:styleSet> if is_empty(d): return None else: try: styleset = etree.Element(ns_elem("owc", "styleSet"), nsmap=ns) name = extract_p('name', d, None) if name is not None: etree.SubElement(styleset, ns_elem("owc", "name")).text = name title = extract_p('title', d, None) if title is not None: etree.SubElement(styleset, ns_elem("owc", "title")).text = title subtitle = extract_p('abstract', d, None) if subtitle is not None: etree.SubElement(styleset, ns_elem("owc", "abstract")).text = subtitle is_default = extract_p('default', d, None) # TODO no example for default setting on style set if is_default is not None: etree.SubElement(styleset, ns_elem("owc", "default")).text = is_default legend_url = extract_p('legendURL', d, None) if legend_url is not None: etree.SubElement(styleset, ns_elem("owc", "legendURL")).text = legend_url # TODO no example for content on style set content = extract_p('content', d, None) content_enc = None if content is None else axml_content(content) if content_enc is not None: styleset.append(content_enc) return styleset except Exception as ex: log.warning('could encode styleset', ex) return None