Ejemplo n.º 1
0
    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

        nsmap = {
                'csw' : ns.get_namespace('csw'),
                'xsi' : ns.get_namespace('xsi'),
            }

        node0 = setrootelement('csw:DescribeRecord', nsmap)
        node0.set('outputFormat', format)
        node0.set('schemaLanguage',ns.get_namespace('xs2'))
        node0.set('service', self.service)
        node0.set('version', self.version)
        node0.set(nsp('xsi:schemaLocation'), schema_location)
        etree.SubElement(node0, nsp('csw:TypeName')).text = typename
        self.request = xml2string(etree.tostring(node0))

        self._invoke()
Ejemplo n.º 2
0
    def __init__(self, url, lang='en-US', version='2.0.2', timeout=10, skip_caps=False):
        """

        Construct and process a GetCapabilities request

        Parameters
        ----------

        - url: the URL of the CSW
        - lang: the language (default is 'en-US')
        - version: version (default is '2.0.2')
        - timeout: timeout in seconds
        - skip_caps: whether to skip GetCapabilities processing on init (default is False)

        """

        self.url = url
        self.lang = lang
        self.version = version
        self.timeout = timeout
        self.service = 'CSW'
        self.exceptionreport = None

        if not skip_caps:  # process GetCapabilities
            # construct request
            nsmap = {
                'csw' : ns.get_namespace('csw'),
                'ows' : ns.get_versioned_namespace('ows',_ows_version),
                'xsi' : ns.get_namespace('xsi'),
            }

            node0 = setrootelement('csw:GetCapabilities', nsmap)

            node0.set('service', self.service)
            node0.set(nsp('xsi:schemaLocation'), schema_location)

            tmp = etree.SubElement(node0, nsp_ows('ows:AcceptVersions'))
            etree.SubElement(tmp, nsp_ows('ows:Version')).text = self.version
            tmp2 = etree.SubElement(node0, nsp_ows('ows:AcceptFormats'))
            etree.SubElement(tmp2, nsp_ows('ows:OutputFormat')).text = outputformat
            self.request = xml2string(etree.tostring(node0))
    
            self._invoke()
    
            if self.exceptionreport is None:
                # ServiceIdentification
                val = self._exml.find(nsp_ows('ows:ServiceIdentification'))
                self.identification=ows.ServiceIdentification(val,ns.get_versioned_namespace('ows', _ows_version))
                # ServiceProvider
                val = self._exml.find(nsp_ows('ows:ServiceProvider'))
                self.provider=ows.ServiceProvider(val)
                # ServiceOperations metadata 
                op = self._exml.find(nsp_ows('ows:OperationsMetadata'))
                self.operations = ows.OperationsMetadata(op, ns.get_versioned_namespace('ows', _ows_version)).operations
        
                # FilterCapabilities
                val = self._exml.find(nsp('ogc:Filter_Capabilities'))
                self.filters=fes.FilterCapabilities(val)
Ejemplo n.º 3
0
    def harvest(self, source, resourcetype, resourceformat=None, harvestinterval=None, responsehandler=None):
        """

        Construct and process a Harvest request

        Parameters
        ----------

        - source: a URI to harvest
        - resourcetype: namespace identifying the type of resource
        - resourceformat: MIME type of the resource
        - harvestinterval: frequency of harvesting, in ISO8601
        - responsehandler: endpoint that CSW should responsd to with response

        """

        # construct request
        node0 = setrootelement('csw:Harvest')
        node0.set('version', self.version)
        node0.set('service', self.service)
        node0.set(nsp('xsi:schemaLocation'), schema_location)
        etree.SubElement(node0, nsp('csw:Source')).text = source
        etree.SubElement(node0, nsp('csw:ResourceType')).text = resourcetype
        if resourceformat is not None:
            etree.SubElement(node0, nsp('csw:ResourceFormat')).text = resourceformat
        if harvestinterval is not None:
            etree.SubElement(node0, nsp('csw:HarvestInterval')).text = harvestinterval
        if responsehandler is not None:
            etree.SubElement(node0, nsp('csw:ResponseHandler')).text = responsehandler
       
        self.request = xml2string(etree.tostring(node0))

        self._invoke()
        self.results = {}

        if self.exceptionreport is None:
            val = self._exml.find(nsp('csw:Acknowledgement'))
            if testXMLValue(val) is not None:
                ts = val.attrib.get('timeStamp')
                self.timestamp = testXMLValue(ts, True)
                id = val.find(nsp('csw:RequestId'))
                self.id = testXMLValue(id) 
            else:
                self._parsetransactionsummary()
                self._parseinsertresult()
Ejemplo n.º 4
0
    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'

        nsmap = {
                'csw' : ns.get_namespace('csw'),
                'xsi' : ns.get_namespace('xsi'),
            }

        node0 = setrootelement('csw:GetDomain', nsmap)
        node0.set('service', self.service)
        node0.set('version', self.version)
        node0.set(nsp('xsi:schemaLocation'), schema_location)
        if dtype == 'property':
            dtypename = 'PropertyName'
        etree.SubElement(node0, nsp('csw:%s' % dtypename)).text = dname
        self.request = xml2string(etree.tostring(node0))

        self._invoke()

        if self.exceptionreport is None:
            self.results = {}

            val = self._exml.find(nsp('csw:DomainValues')).attrib.get('type')
            self.results['type'] = testXMLValue(val, True)

            val = self._exml.find(nsp('csw:DomainValues/csw:%s' % dtypename))
            self.results[dtype] = testXMLValue(val)
            # get the list of values associated with the Domain
            self.results['values'] = []

            for f in self._exml.findall(nsp('csw:DomainValues/csw:ListOfValues/csw:Value')):
                self.results['values'].append(testXMLValue(f))
Ejemplo n.º 5
0
    def getrecordbyid(self, id=[], esn='full', outputschema=None, 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')

        """

        if outputschema is None:
            outputschema = ns.get_namespace('csw')

        nsmap = {
            'csw' : ns.get_namespace('csw'),
            'xsi' : ns.get_namespace('xsi')
        }   

        # construct request 
        node0 = setrootelement('csw:GetRecordById', nsmap)
        node0.set('outputFormat', format)
        node0.set('outputSchema', outputschema)
        node0.set('service', self.service)
        node0.set('version', self.version)
        node0.set(nsp('xsi:schemaLocation'), schema_location)
        for i in id:
            etree.SubElement(node0, nsp('csw:Id')).text = i
        etree.SubElement(node0, nsp('csw:ElementSetName')).text = esn
        self.request = xml2string(etree.tostring(node0))

        self._invoke()
 
        if self.exceptionreport is None:
            self.results = {}
            self.records = {}
            self._parserecords(outputschema, esn)
Ejemplo n.º 6
0
    def transaction(self, ttype=None, typename='csw:Record', record=None, propertyname=None, propertyvalue=None, bbox=None, keywords=[], cql=None, identifier=None):
        """

        Construct and process a Transaction request

        Parameters
        ----------

        - ttype: the type of transaction 'insert, 'update', 'delete'
        - typename: the typename to describe (default is 'csw:Record')
        - record: the XML record to insert
        - propertyname: the RecordProperty/PropertyName to Filter against
        - propertyvalue: the RecordProperty Value to Filter against (for updates)
        - bbox: the bounding box of the spatial query in the form [minx,miny,maxx,maxy]
        - keywords: list of keywords
        - cql: common query language text.  Note this overrides bbox, qtype, keywords
        - identifier: record identifier.  Note this overrides bbox, qtype, keywords, cql

        """

        # construct request
        node0 = setrootelement('csw:Transaction')
        node0.set('version', self.version)
        node0.set('service', self.service)
        node0.set(nsp('xsi:schemaLocation'), schema_location)

        validtransactions = ['insert', 'update', 'delete']

        if ttype not in validtransactions:  # invalid transaction
            raise RuntimeError, 'Invalid transaction \'%s\'.' % ttype

        node1 = etree.SubElement(node0, nsp('csw:%s' % ttype.capitalize()))

        if ttype != 'update':  
            node1.set('typeName', typename)

        if ttype == 'insert':
            if record is None:
                raise RuntimeError, 'Nothing to insert.'
            node1.append(etree.fromstring(record))
 
        if ttype == 'update':
            if record is not None:
                node1.append(etree.fromstring(record))
            else:
                if propertyname is not None and propertyvalue is not None:
                    node2 = etree.SubElement(node1, nsp('csw:RecordProperty'))
                    etree.SubElement(node2, nsp('csw:Name')).text = propertyname
                    etree.SubElement(node2, nsp('csw:Value')).text = propertyvalue
                    self._setconstraint(node1, qtype, propertyname, keywords, bbox, cql, identifier)

        if ttype == 'delete':
            self._setconstraint(node1, None, propertyname, keywords, bbox, cql, identifier)
        self.request = xml2string(etree.tostring(node0))

        self._invoke()
        self.results = {}

        if self.exceptionreport is None:
            self._parsetransactionsummary()
            self._parseinsertresult()
Ejemplo n.º 7
0
    def getrecords(self, qtype=None, keywords=[], typenames='csw:Record', propertyname='csw:AnyText', bbox=None, esn='summary', sortby=None, outputschema=None, format=outputformat, startposition=0, maxrecords=10, cql=None, xml=None):
        """

        Construct and process a  GetRecords request

        Parameters
        ----------

        - qtype: type of resource to query (i.e. service, dataset)
        - keywords: list of keywords
        - typenames: the typeNames to query against (default is csw:Record)
        - propertyname: the PropertyName to Filter against 
        - bbox: the bounding box of the spatial query in the form [minx,miny,maxx,maxy]
        - esn: the ElementSetName 'full', 'brief' or 'summary' (default is 'summary')
        - sortby: property to sort results on (default is 'dc:title')
        - outputschema: the outputSchema (default is 'http://www.opengis.net/cat/csw/2.0.2')
        - format: the outputFormat (default is 'application/xml')
        - startposition: requests a slice of the result set, starting at this position (default is 0)
        - maxrecords: the maximum number of records to return. No records are returned if 0 (default is 10)
        - cql: common query language text.  Note this overrides bbox, qtype, keywords
        - xml: raw XML request.  Note this overrides all other options
        """

        if outputschema is None:
            outputschema = ns.get_namespace('csw')

        if xml is not None:
            self.request = xml
            e=etree.fromstring(xml)
            val = e.find(nsp('csw:Query/csw:ElementSetName'))
            if val is not None:
                esn = testXMLValue(val)
        else:
            # construct request

            nsmap = {
                'xsi' : ns.get_namespace('xsi'),
                'ogc' : ns.get_namespace('ogc'),
                'dif' : ns.get_namespace('dif'),
                'ows' : ns.get_versioned_namespace('ows', _ows_version),
                'fgdc': ns.get_namespace('fgdc'),
                'gmd' : ns.get_namespace('gmd'),
                'csw' : ns.get_namespace('csw')
            }

            node0 = setrootelement('csw:GetRecords', nsmap)
            node0.set('outputSchema', outputschema)
            node0.set('outputFormat', format)
            node0.set('version', self.version)
            node0.set('resultType', 'results')
            node0.set('service', self.service)
            if startposition > 0:
                node0.set('startPosition', str(startposition))
            node0.set('maxRecords', str(maxrecords))
            node0.set(nsp('xsi:schemaLocation'), schema_location)
    
            node1 = etree.SubElement(node0, nsp('csw:Query'))
            node1.set('typeNames', typenames)
        
            etree.SubElement(node1, nsp('csw:ElementSetName')).text = esn
    
            self._setconstraint(node1, qtype, propertyname, keywords, bbox, cql)
    
            if sortby is not None:
                fes.setsortby(node1, sortby)
    
            self.request = xml2string(etree.tostring(node0))

        self._invoke()
 
        if self.exceptionreport is None:
            self.results = {}
    
            # process search results attributes
            val = self._exml.find(nsp('csw:SearchResults')).attrib.get('numberOfRecordsMatched')
            self.results['matches'] = int(testXMLValue(val, True))
            val = self._exml.find(nsp('csw:SearchResults')).attrib.get('numberOfRecordsReturned')
            self.results['returned'] = int(testXMLValue(val, True))
            val = self._exml.find(nsp('csw:SearchResults')).attrib.get('nextRecord')
            self.results['nextrecord'] = int(testXMLValue(val, True))
    
            # process list of matching records
            self.records = {}

            self._parserecords(outputschema, esn)