示例#1
0
    def _getStoredQueries(self):
        ''' gets descriptions of the stored queries available on the server '''
        sqs=[]
        #This method makes two calls to the WFS - one ListStoredQueries, and one DescribeStoredQueries. The information is then
        #aggregated in 'StoredQuery' objects
        method=nspath('Get')

        #first make the ListStoredQueries response and save the results in a dictionary if form {storedqueryid:(title, returnfeaturetype)}
        try:
            base_url = next((m.get('url') for m in self.getOperationByName('ListStoredQueries').methods if m.get('type').lower() == method.lower()))
        except StopIteration:
            base_url = self.url

        request = {'service': 'WFS', 'version': self.version, 'request': 'ListStoredQueries'}
        encoded_request = urlencode(request)
        u = openURL(base_url, data=encoded_request, timeout=self.timeout,
                    username=self.username, password=self.password)
        tree=etree.fromstring(u.read())
        tempdict={}
        for sqelem in tree[:]:
            title=rft=id=None
            id=sqelem.get('id')
            for elem in sqelem[:]:
                if elem.tag==nspath('Title', WFS_NAMESPACE):
                    title=elem.text
                elif elem.tag==nspath('ReturnFeatureType', WFS_NAMESPACE):
                    rft=elem.text
            tempdict[id]=(title,rft)        #store in temporary dictionary

        #then make the DescribeStoredQueries request and get the rest of the information about the stored queries
        try:
            base_url = next((m.get('url') for m in self.getOperationByName('DescribeStoredQueries').methods if m.get('type').lower() == method.lower()))
        except StopIteration:
            base_url = self.url
        request = {'service': 'WFS', 'version': self.version, 'request': 'DescribeStoredQueries'}
        encoded_request = urlencode(request)
        u = openURL(base_url, data=encoded_request, timeout=self.timeout,
                    username=self.username, password=self.password)
        tree=etree.fromstring(u.read())
        tempdict2={}
        for sqelem in tree[:]:
            params=[] #list to store parameters for the stored query description
            id =sqelem.get('id')
            for elem in sqelem[:]:
                abstract = ''
                if elem.tag==nspath('Abstract', WFS_NAMESPACE):
                    abstract=elem.text
                elif elem.tag==nspath('Parameter', WFS_NAMESPACE):
                    newparam=Parameter(elem.get('name'), elem.get('type'))
                    params.append(newparam)
            tempdict2[id]=(abstract, params) #store in another temporary dictionary

        #now group the results into StoredQuery objects:
        for key in tempdict.keys():
            sqs.append(StoredQuery(key, tempdict[key][0], tempdict[key][1], tempdict2[key][0], tempdict2[key][1]))
        return sqs
示例#2
0
def mundiopenURL2(col="",
                  query="",
                  data=None,
                  method='Get',
                  cookies=None,
                  username=None,
                  password=None,
                  timeout=30,
                  headers=None,
                  verify=True,
                  cert=None):

    if col != "":
        os_query = "https://mundiwebservices.com/acdc/catalog/proxy/search/{mundi_collection}/opensearch?".replace(
            '{mundi_collection}', col.name) + query
    else:
        os_query = "https://mundiwebservices.com/acdc/catalog/proxy/search/global/opensearch?" + query

    response_wrappers = []

    # getting first page (i.e. 'page0')
    page0 = openURL(os_query, data, method, cookies, username, password,
                    timeout, headers, verify, cert)
    response_wrapper_0 = page0.read()
    rw0_node = lxml.etree.fromstring(response_wrapper_0)
    response_wrappers.append(page0)

    nb_total = int(
        rw0_node.xpath('os:totalResults', namespaces=mundi_nsmap)[0].text)
    nb_set = int(
        rw0_node.xpath('os:itemsPerPage', namespaces=mundi_nsmap)[0].text)
    start_index = int(
        rw0_node.xpath('os:startIndex', namespaces=mundi_nsmap)[0].text)

    next_record = start_index + nb_set

    # calculation of page number
    if (nb_total == 0):
        nbPages = 1
    else:
        nbPages = ceil(nb_total / nb_set)

    # getting other/next pages (i.e. 'pageN')
    i = 1
    while (i < nbPages):
        # modifying payload with new start position
        os_query_N = os_query + "&startIndex=" + str(next_record)
        page_N = openURL(os_query_N, data, method, cookies, username, password,
                         timeout, headers, verify, cert)
        response_wrappers.append(page_N)

        next_record += nb_set
        # go next page
        i += 1

    return response_wrappers
示例#3
0
文件: wfs200.py 项目: murdav/OWSLib
    def _getStoredQueries(self):
        ''' gets descriptions of the stored queries available on the server '''
        sqs=[]
        #This method makes two calls to the WFS - one ListStoredQueries, and one DescribeStoredQueries. The information is then
        #aggregated in 'StoredQuery' objects
        method=nspath('Get')

        #first make the ListStoredQueries response and save the results in a dictionary if form {storedqueryid:(title, returnfeaturetype)}
        try:
            base_url = next((m.get('url') for m in self.getOperationByName('ListStoredQueries').methods if m.get('type').lower() == method.lower()))
        except StopIteration:
            base_url = self.url

        request = {'service': 'WFS', 'version': self.version, 'request': 'ListStoredQueries'}
        encoded_request = urlencode(request)
        u = openURL(base_url, data=encoded_request, timeout=self.timeout,
                    username=self.username, password=self.password)
        tree=etree.fromstring(u.read())
        tempdict={}
        for sqelem in tree[:]:
            title=rft=id=None
            id=sqelem.get('id')
            for elem in sqelem[:]:
                if elem.tag==nspath('Title', WFS_NAMESPACE):
                    title=elem.text
                elif elem.tag==nspath('ReturnFeatureType', WFS_NAMESPACE):
                    rft=elem.text
            tempdict[id]=(title,rft)        #store in temporary dictionary

        #then make the DescribeStoredQueries request and get the rest of the information about the stored queries
        try:
            base_url = next((m.get('url') for m in self.getOperationByName('DescribeStoredQueries').methods if m.get('type').lower() == method.lower()))
        except StopIteration:
            base_url = self.url
        request = {'service': 'WFS', 'version': self.version, 'request': 'DescribeStoredQueries'}
        encoded_request = urlencode(request)
        u = openURL(base_url, data=encoded_request, timeout=self.timeout,
                    username=self.username, password=self.password)
        tree=etree.fromstring(u.read())
        tempdict2={}
        for sqelem in tree[:]:
            params=[] #list to store parameters for the stored query description
            id =sqelem.get('id')
            for elem in sqelem[:]:
                abstract = ''
                if elem.tag==nspath('Abstract', WFS_NAMESPACE):
                    abstract=elem.text
                elif elem.tag==nspath('Parameter', WFS_NAMESPACE):
                    newparam=Parameter(elem.get('name'), elem.get('type'))
                    params.append(newparam)
            tempdict2[id]=(abstract, params) #store in another temporary dictionary

        #now group the results into StoredQuery objects:
        for key in tempdict.keys():
            sqs.append(StoredQuery(key, tempdict[key][0], tempdict[key][1], tempdict2[key][0], tempdict2[key][1]))
        return sqs
def opensearch_nb_results(collection=None,
                          query="",
                          data=None,
                          method='Get',
                          cookies=None,
                          username=None,
                          password=None,
                          timeout=30,
                          headers=None,
                          verify=True,
                          cert=None,
                          params=None):
    """Get the number of results from an OpenSearch request"""
    # if params is provided, query is ignored
    if params is not None:
        query = '&'.join(f'{k}={v}' for k, v in params.items())

    # build base request URI
    if collection is None:
        os_query = f'https://mundiwebservices.com/acdc/catalog/proxy/search/global/opensearch?{query}'
    else:
        os_query = f'https://mundiwebservices.com/acdc/catalog/proxy/search/{collection.name}/opensearch?{query}'

    # only get first page to read number of results
    page = openURL(os_query, data, method, cookies, username, password,
                   timeout, headers, verify, cert)
    response_wrapper = page.read()
    response_wrapper_xml = etree.fromstring(response_wrapper)

    return int(
        response_wrapper_xml.find('os:totalResults',
                                  namespaces=MUNDI_NAMESPACES).text)
示例#5
0
def describe_sensor(self,
                    outputFormat=None,
                    procedure=None,
                    method='Post',
                    raw=False,
                    **kwargs):

    try:
        base_url = self.get_operation_by_name(
            'DescribeSensor').methods[method]['url']
    except BaseException:
        base_url = self.url

    ds = DescribeSensorRequest(procedure)
    data = ds.xml()

    response = openURL(base_url,
                       data,
                       method,
                       username=self.username,
                       password=self.password).read()
    # BUG nel server SOS Ve ISMAR
    # response.replace('sml:system', 'sml:System')
    tr = extension_sos_utils.etree.fromstring(response)

    if tr.tag == nspath_eval("ows:ExceptionReport", namespaces):
        raise extension_sos_utils.ows.ExceptionReport(tr)

    if raw:
        return response
    else:
        return SosDescribeSensorResponse(tr)
示例#6
0
文件: wfs110.py 项目: yalaudah/OWSLib
 def getcapabilities(self):
     """Request and return capabilities document from the WFS as a
     file-like object.
     NOTE: this is effectively redundant now"""
     reader = WFSCapabilitiesReader(self.version, auth=self.auth)
     return openURL(reader.capabilities_url(self.url),
                    timeout=self.timeout, auth=self.auth)
示例#7
0
def get_result_template(self,
                        offering=None,
                        observedProperty=None,
                        method='Post',
                        **kwargs):

    base_url = 'http://sp7.irea.cnr.it/tomcat/MareeVe/sos/json'
    request = {
        'service': 'SOS',
        'version': self.version,
        'request': 'GetResultTemplate'
    }
    request['offering'] = offering
    request['observedProperty'] = observedProperty

    if kwargs:
        for kw in kwargs:
            request[kw] = kwargs[kw]

    data = json.dumps(request)

    print data

    response = openURL(base_url,
                       data,
                       method,
                       username=self.username,
                       password=self.password).read()
    return response
示例#8
0
    def describe_sensor(self,   outputFormat=None,
                                procedure=None,
                                method='Get',
                                **kwargs):

        base_url = self.get_operation_by_name('DescribeSensor').methods[method]['url']        
        request = {'service': 'SOS', 'version': self.version, 'request': 'DescribeSensor'}

        # Required Fields
        assert isinstance(outputFormat, str)
        request['outputFormat'] = outputFormat

        assert isinstance(procedure, str)
        request['procedure'] = procedure

        # Optional Fields
        if kwargs:
            for kw in kwargs:
                request[kw]=kwargs[kw]
       
        data = urlencode(request)        

        response = openURL(base_url, data, method, username=self.username, password=self.password).read()
        tr = etree.fromstring(response)

        if tr.tag == nspath_eval("ows:ExceptionReport", namespaces):
            raise ows.ExceptionReport(tr)

        return response
示例#9
0
def insert_observation_json(self,
                            time,
                            value,
                            offering=None,
                            procedure=None,
                            observedProperty=None,
                            featureOfInterest=None,
                            method='Post',
                            **kwargs):

    _foi = self.get_feature_of_interest_json(
        featureOfInterest=featureOfInterest,
        observedProperty=observedProperty,
        procedure=procedure)
    if len(_foi['featureOfInterest']) != 1:
        raise Exception("Foi not found")

    foi = _foi['featureOfInterest'][0]

    base_url = 'http://sp7.irea.cnr.it/tomcat/MareeVe/sos/json'
    request = {
        'service': 'SOS',
        'version': self.version,
        'request': 'InsertObservation',
        "offering": offering,
        "observation": {
            "identifier": {
                "value": "http://www.52north.org/test/observation/9",
                "codespace": "http://www.opengis.net/def/nil/OGC/0/unknown"
            },
            "type":
            "http://www.opengis.net/def/observationType/OGC-OM/2.0/OM_Measurement",
            "procedure": procedure,
            "observedProperty": observedProperty,
            "featureOfInterest": foi,
            "phenomenonTime": time,
            "resultTime": time,
            "result": {
                "uom": "test_unit_6",
                "value": value
            }
        }
    }

    if kwargs:
        for kw in kwargs:
            request[kw] = kwargs[kw]

    #return request

    data = json.dumps(request)

    # print data

    response = openURL(base_url,
                       data,
                       method,
                       username=self.username,
                       password=self.password).read()
    return response
示例#10
0
    def parse_remote_metadata(self, timeout=30):
        """Parse remote metadata for MetadataURL and add it as metadataUrl['metadata']"""
        for metadataUrl in self.metadataUrls:
            if metadataUrl["url"] is not None:
                try:
                    content = openURL(metadataUrl["url"],
                                      timeout=timeout,
                                      headers=self.headers,
                                      auth=self.auth)
                    doc = etree.fromstring(content.read())

                    mdelem = doc.find(".//metadata")
                    if mdelem is not None:
                        metadataUrl["metadata"] = Metadata(mdelem)
                        continue

                    mdelem = doc.find(".//" + util.nspath_eval(
                        "gmd:MD_Metadata", n.get_namespaces(
                            ["gmd"]))) or doc.find(".//" + util.nspath_eval(
                                "gmi:MI_Metadata", n.get_namespaces(["gmi"])))
                    if mdelem is not None:
                        metadataUrl["metadata"] = MD_Metadata(mdelem)
                        continue
                except Exception:
                    metadataUrl["metadata"] = None
示例#11
0
    def parse_remote_metadata(self, timeout=30):
        """Parse remote metadata for MetadataURL of format 'text/xml' and add it as metadataUrl['metadata']"""
        for metadataUrl in self.metadataUrls:
            if (metadataUrl["url"] is not None
                    and metadataUrl["format"].lower() == "text/xml"):
                try:
                    content = openURL(metadataUrl["url"],
                                      timeout=timeout,
                                      headers=self.headers,
                                      auth=self.auth)
                    doc = etree.fromstring(content.read())

                    if metadataUrl["type"] == "FGDC":
                        mdelem = doc.find(".//metadata")
                        if mdelem is not None:
                            metadataUrl["metadata"] = Metadata(mdelem)
                        else:
                            metadataUrl["metadata"] = None
                    elif metadataUrl["type"] in ["TC211", "19115", "19139"]:
                        mdelem = doc.find(".//" + nspath_eval(
                            "gmd:MD_Metadata", namespaces)) or doc.find(
                                ".//" +
                                nspath_eval("gmi:MI_Metadata", namespaces))
                        if mdelem is not None:
                            metadataUrl["metadata"] = MD_Metadata(mdelem)
                        else:
                            metadataUrl["metadata"] = None
                except Exception:
                    metadataUrl["metadata"] = None
示例#12
0
def WebCoverageService(url, version=None, xml=None, cookies=None, timeout=30):
    ''' wcs factory function, returns a version specific WebCoverageService object '''

    if version is None:
        if xml is None:
            reader = wcsBase.WCSCapabilitiesReader()
            request = reader.capabilities_url(url)
            xml = openURL(request, cookies=cookies, timeout=timeout).read()

        capabilities = etree.etree.fromstring(xml)
        version = capabilities.get('version')
        del capabilities

    clean_url = clean_ows_url(url)

    if version == '1.0.0':
        return wcs100.WebCoverageService_1_0_0.__new__(
            wcs100.WebCoverageService_1_0_0, clean_url, xml, cookies)
    elif version == '1.1.0':
        return wcs110.WebCoverageService_1_1_0.__new__(
            wcs110.WebCoverageService_1_1_0, url, xml, cookies)
    elif version == '1.1.1':
        return wcs111.WebCoverageService_1_1_1.__new__(
            wcs111.WebCoverageService_1_1_1, url, xml, cookies)
    elif version == '2.0.0':
        return wcs200.WebCoverageService_2_0_0.__new__(
            wcs200.WebCoverageService_2_0_0, url, xml, cookies)
    elif version == '2.0.1':
        return wcs201.WebCoverageService_2_0_1.__new__(
            wcs201.WebCoverageService_2_0_1, url, xml, cookies)
示例#13
0
    def get_observation(self,
                        responseFormat=None,
                        offerings=None,
                        observedProperties=None,
                        eventTime=None,
                        method='Get',
                        **kwargs):
        """
        Parameters
        ----------
        format : string
            Output format. Provide one that is available for all offerings
        method : string
            Optional. HTTP DCP method name: Get or Post.  Must
        **kwargs : extra arguments
            anything else e.g. vendor specific parameters
        """

        base_url = self.get_operation_by_name(
            'GetObservation').methods[method]['url']
        request = {
            'service': 'SOS',
            'version': self.version,
            'request': 'GetObservation'
        }

        # Required Fields
        assert isinstance(offerings, list) and len(offerings) > 0
        request['offering'] = ','.join(offerings)

        assert isinstance(observedProperties,
                          list) and len(observedProperties) > 0
        request['observedproperty'] = ','.join(observedProperties)

        assert isinstance(responseFormat, str)
        request['responseFormat'] = responseFormat

        # Optional Fields
        if eventTime is not None:
            request['eventTime'] = eventTime

        if kwargs:
            for kw in kwargs:
                request[kw] = kwargs[kw]

        data = urlencode(request)

        response = openURL(base_url,
                           data,
                           method,
                           username=self.username,
                           password=self.password).read()
        try:
            tr = etree.fromstring(response)
            if tr.tag == nspath_eval("ows:ExceptionReport", namespaces):
                raise ows.ExceptionReport(tr)
        except ows.ExceptionReport:
            raise
        except BaseException:
            return response
示例#14
0
    def parse_remote_metadata(self, timeout=30):
        """Parse remote metadata for MetadataURL of format 'text/xml' and add it as metadataUrl['metadata']"""
        for metadataUrl in self.metadataUrls:
            if metadataUrl['url'] is not None \
                    and metadataUrl['format'].lower() == 'text/xml':
                try:
                    content = openURL(metadataUrl['url'], timeout=timeout)
                    doc = etree.fromstring(content.read())

                    if metadataUrl['type'] == 'FGDC':
                        mdelem = doc.find('.//metadata')
                        if mdelem is not None:
                            metadataUrl['metadata'] = Metadata(mdelem)
                        else:
                            metadataUrl['metadata'] = None
                    elif metadataUrl['type'] in ['TC211', '19115', '19139']:
                        mdelem = doc.find(
                            './/' +
                            util.nspath_eval('gmd:MD_Metadata', namespaces)
                        ) or doc.find(
                            './/' +
                            util.nspath_eval('gmi:MI_Metadata', namespaces))
                        if mdelem is not None:
                            metadataUrl['metadata'] = MD_Metadata(mdelem)
                        else:
                            metadataUrl['metadata'] = None
                except:
                    metadataUrl['metadata'] = None
示例#15
0
    def describe_sensor(self, outputFormat=None, procedure=None, method=None, **kwargs):

        method = method or 'Get'

        try:
            base_url = next((m.get('url') for m in self.getOperationByName('DescribeSensor').methods if m.get('type').lower() == method.lower()))
        except StopIteration:
            base_url = self.url
        request = {'service': 'SOS', 'version': self.version, 'request': 'DescribeSensor'}

        # Required Fields
        assert isinstance(outputFormat, str)
        request['procedureDescriptionFormat'] = outputFormat

        assert isinstance(procedure, str)
        request['procedure'] = procedure

        url_kwargs = {}
        if 'timeout' in kwargs:
            url_kwargs['timeout'] = kwargs.pop('timeout')  # Client specified timeout value

        # Optional Fields
        if kwargs:
            for kw in kwargs:
                request[kw] = kwargs[kw]

        response = openURL(base_url, request, method, username=self.username, password=self.password, **url_kwargs).read()
        tr = etree.fromstring(response)

        if tr.tag == nspath_eval("ows:ExceptionReport", namespaces):
            raise ows.ExceptionReport(tr)

        return response
示例#16
0
    def parse_remote_metadata(self, timeout=30):
        """Parse remote metadata for MetadataURL and add it as metadataUrl['metadata']"""
        for metadataUrl in self.metadataUrls:
            if metadataUrl['url'] is not None \
                    and metadataUrl['format'].lower() in ['application/xml', 'text/xml']:  # download URL
                try:
                    content = openURL(metadataUrl['url'],
                                      timeout=timeout,
                                      auth=self.auth)
                    doc = etree.fromstring(content.read())

                    if metadataUrl['type'] == 'FGDC':
                        mdelem = doc.find('.//metadata')
                        if mdelem is not None:
                            metadataUrl['metadata'] = Metadata(mdelem)
                            continue

                    if metadataUrl['type'] == 'TC211':
                        mdelem = doc.find('.//' + nspath_eval('gmd:MD_Metadata', n.get_namespaces(['gmd']))) \
                            or doc.find('.//' + nspath_eval('gmi:MI_Metadata', n.get_namespaces(['gmi'])))
                        if mdelem is not None:
                            metadataUrl['metadata'] = MD_Metadata(mdelem)
                            continue
                except Exception:
                    metadataUrl['metadata'] = None
示例#17
0
def mundinbopenURL2(col="",
                    query="",
                    data=None,
                    method='Get',
                    cookies=None,
                    username=None,
                    password=None,
                    timeout=30,
                    headers=None,
                    verify=True,
                    cert=None):

    if col != "":
        os_query = "https://mundiwebservices.com/acdc/catalog/proxy/search/{mundi_collection}/opensearch?".replace(
            '{mundi_collection}', col.name) + query
    else:
        os_query = "https://mundiwebservices.com/acdc/catalog/proxy/search/global/opensearch?" + query

    # getting first page (i.e. 'page0')
    page0 = openURL(os_query, data, method, cookies, username, password,
                    timeout, headers, verify, cert)
    response_wrapper_0 = page0.read()
    rw0_node = lxml.etree.fromstring(response_wrapper_0)

    nb = int(rw0_node.xpath('os:totalResults', namespaces=mundi_nsmap)[0].text)

    return nb
示例#18
0
def WebCoverageService(url, version=None, xml=None, cookies=None, timeout=30):
    ''' wcs factory function, returns a version specific WebCoverageService object '''

    if version is None:
        if xml is None:
            reader = wcsBase.WCSCapabilitiesReader()
            request = reader.capabilities_url(url)
            xml = openURL(request, cookies=cookies, timeout=timeout).read()

        capabilities = etree.etree.fromstring(xml)
        version = capabilities.get('version')
        del capabilities

    clean_url = clean_ows_url(url)

    if version == '1.0.0':
        return wcs100.WebCoverageService_1_0_0.__new__(wcs100.WebCoverageService_1_0_0, clean_url, xml, cookies)
    elif version == '1.1.0':
        return wcs110.WebCoverageService_1_1_0.__new__(wcs110.WebCoverageService_1_1_0, url, xml, cookies)
    elif version == '1.1.1':
        return wcs111.WebCoverageService_1_1_1.__new__(wcs111.WebCoverageService_1_1_1, url, xml, cookies)
    elif version == '2.0.0':
        return wcs200.WebCoverageService_2_0_0.__new__(wcs200.WebCoverageService_2_0_0, url, xml, cookies)
    elif version == '2.0.1':
        return wcs201.WebCoverageService_2_0_1.__new__(wcs201.WebCoverageService_2_0_1, url, xml, cookies)
示例#19
0
def get_schema(url,
               typename,
               version='1.0.0',
               timeout=30,
               username=None,
               password=None):
    """Parses DescribeFeatureType response and creates schema compatible
    with :class:`fiona`

    :param str url: url of the service
    :param str version: version of the service
    :param str typename: name of the layer
    :param int timeout: request timeout
    """

    url = _get_describefeaturetype_url(url, version, typename)
    res = openURL(url, timeout=timeout, username=username, password=password)
    root = etree.fromstring(res.read())

    if ':' in typename:
        typename = typename.split(':')[1]
    type_element = findall(root,
                           '{%s}element' % XS_NAMESPACE,
                           attribute_name='name',
                           attribute_value=typename)[0]
    complex_type = type_element.attrib['type'].split(":")[1]
    elements = _get_elements(complex_type, root)
    nsmap = None
    if hasattr(root, 'nsmap'):
        nsmap = root.nsmap
    return _construct_schema(elements, nsmap)
示例#20
0
文件: wfs100.py 项目: yalaudah/OWSLib
 def parse_remote_metadata(self, timeout=30):
     """Parse remote metadata for MetadataURL of format 'XML' and add it as metadataUrl['metadata']"""
     for metadataUrl in self.metadataUrls:
         if metadataUrl['url'] is not None \
                 and metadataUrl['format'].lower() == 'xml':
             try:
                 content = openURL(metadataUrl['url'],
                                   timeout=timeout,
                                   auth=self.auth)
                 doc = etree.fromstring(content.read())
                 if metadataUrl['type'] == 'FGDC':
                     mdelem = doc.find('.//metadata')
                     if mdelem is not None:
                         metadataUrl['metadata'] = Metadata(mdelem)
                     else:
                         metadataUrl['metadata'] = None
                 elif metadataUrl['type'] == 'TC211':
                     mdelem = doc.find('.//' + util.nspath_eval('gmd:MD_Metadata', n.get_namespaces(['gmd']))) \
                              or doc.find('.//' + util.nspath_eval('gmi:MI_Metadata', n.get_namespaces(['gmi'])))
                     if mdelem is not None:
                         metadataUrl['metadata'] = MD_Metadata(mdelem)
                     else:
                         metadataUrl['metadata'] = None
             except Exception:
                 metadataUrl['metadata'] = None
示例#21
0
    def describe_sensor(self, outputFormat=None, procedure=None, method="Get", **kwargs):

        base_url = self.get_operation_by_name("DescribeSensor").methods[method]["url"]
        request = {"service": "SOS", "version": self.version, "request": "DescribeSensor"}

        # Required Fields
        assert isinstance(outputFormat, str)
        request["outputFormat"] = outputFormat

        assert isinstance(procedure, str)
        request["procedure"] = procedure

        # Optional Fields
        if kwargs:
            for kw in kwargs:
                request[kw] = kwargs[kw]

        data = urlencode(request)

        response = openURL(base_url, data, method, username=self.username, password=self.password).read()
        tr = etree.fromstring(response)

        if tr.tag == nspath_eval("ows:ExceptionReport", namespaces):
            raise ows.ExceptionReport(tr)

        return response
示例#22
0
    def describe_sensor(self, outputFormat=None, procedure=None, method=None, **kwargs):

        method = method or 'Get'

        try:
            base_url = next((m.get('url') for m in self.getOperationByName('DescribeSensor').methods if m.get('type').lower() == method.lower()))
        except StopIteration:
            base_url = self.url
        request = {'service': 'SOS', 'version': self.version, 'request': 'DescribeSensor'}

        # Required Fields
        assert isinstance(outputFormat, str)
        request['procedureDescriptionFormat'] = outputFormat

        assert isinstance(procedure, str)
        request['procedure'] = procedure

        url_kwargs = {}
        if 'timeout' in kwargs:
            url_kwargs['timeout'] = kwargs.pop('timeout')  # Client specified timeout value

        # Optional Fields
        if kwargs:
            for kw in kwargs:
                request[kw] = kwargs[kw]

        response = openURL(base_url, request, method, username=self.username, password=self.password, **url_kwargs).read()
        tr = etree.fromstring(response)

        if tr.tag == nspath_eval("ows:ExceptionReport", namespaces):
            raise ows.ExceptionReport(tr)

        return response
示例#23
0
def describe_sensor(self, outputFormat=None,
                          procedure=None,
                          method='Post',
                          raw=False,
                          **kwargs):

    try:
        base_url = self.get_operation_by_name('DescribeSensor').methods[method]['url']        
    except:
        base_url = self.url
    
    ds = DescribeSensorRequest(procedure)
    data = ds.xml()

    response = openURL(base_url, data, method, username=self.username, password=self.password).read()
    # BUG nel server SOS Ve ISMAR
    # response.replace('sml:system', 'sml:System')
    tr = etree.fromstring(response)

    if tr.tag == nspath_eval("ows:ExceptionReport", namespaces):
        raise ows.ExceptionReport(tr)

    if raw:
        return response
    else:
        return SosDescribeSensorResponse(tr)
示例#24
0
def get_feature_of_interest(self,
                          foi=None,
                          method='Get',
                          **kwargs):

    try:
        base_url = self.get_operation_by_name('GetFeatureOfInterest').methods[method]['url']        
    except:
        base_url = self.url
    request = {'service': 'SOS', 'version': self.version, 'request': 'GetFeatureOfInterest'}

    # Required Fields
    assert isinstance(foi, str)
    request['featureOfInterest'] = foi

    # Optional Fields
    if kwargs:
        for kw in kwargs:
            request[kw]=kwargs[kw]
   
    data = urlencode(request)        

    response = openURL(base_url, data, method, username=self.username, password=self.password).read()
    tr = etree.fromstring(response)

    if tr.tag == nspath_eval("ows:ExceptionReport", namespaces):
        raise ows.ExceptionReport(tr)

    return tr
示例#25
0
文件: wfs110.py 项目: KeyproOy/OWSLib
 def getcapabilities(self):
     """Request and return capabilities document from the WFS as a
     file-like object.
     NOTE: this is effectively redundant now"""
     reader = WFSCapabilitiesReader(self.version)
     return openURL(reader.capabilities_url(self.url), timeout=self.timeout,
                    username=self.username, password=self.password)
示例#26
0
def get_feature_of_interest_json(self,
                                 featureOfInterest = None,
                                 observedProperty = None,
                                 procedure = None,
                                 method = 'Post',
                                 **kwargs
                                 ):
    base_url = 'http://sp7.irea.cnr.it/tomcat/MareeVe/sos/json'
    request = {
        'service': 'SOS', 
        'version': self.version, 
        'request': 'GetFeatureOfInterest'
        }
    if featureOfInterest is not None:
        request['featureOfInterest'] = featureOfInterest

    if observedProperty is not None:
        request['observedProperty'] = observedProperty

    if procedure is not None:
        request['procedure'] = procedure

    if kwargs:
        for kw in kwargs:
            request[kw]=kwargs[kw]

    data = json.dumps(request)
    
    response = openURL(base_url, data, method, username=self.username, password=self.password).read()
    return json.loads(response)
示例#27
0
 def getpropertyvalue(
     self, query=None, storedquery_id=None, valuereference=None, typename=None, method=nspath("Get"), **kwargs
 ):
     """ the WFS GetPropertyValue method"""
     try:
         base_url = next(
             (
                 m.get("url")
                 for m in self.getOperationByName("GetPropertyValue").methods
                 if m.get("type").lower() == method.lower()
             )
         )
     except StopIteration:
         base_url = self.url
     request = {"service": "WFS", "version": self.version, "request": "GetPropertyValue"}
     if query:
         request["query"] = str(query)
     if valuereference:
         request["valueReference"] = str(valuereference)
     if storedquery_id:
         request["storedQuery_id"] = str(storedquery_id)
     if typename:
         request["typename"] = str(typename)
     if kwargs:
         for kw in kwargs.keys():
             request[kw] = str(kwargs[kw])
     encoded_request = urlencode(request)
     u = openURL(base_url + encoded_request, timeout=self.timeout, username=self.username, password=self.password)
     return u.read()
示例#28
0
def get_grid_refs(shapefile_name):
    #Retrieve Shapefile Layer ID and GRID_REFs list from WFS to Geoserver
    #~ wfs_version="1.0.0"
    #~ username="******"
    #~ password="******"
    #~ method="Get"
    #~ base_url=OGC_SERVER['default']['PUBLIC_LOCATION'] + "wfs"
    #~ layer_name=shapefile_name
    request = { "version"       : WFS_SETTINGS['VERSION'], 
                "request"       : "GetFeature",
                "format_options": "charset:UTF-8",
                "service"       : "WFS",
                "typename"      : shapefile_name,
                }

    data = urlencode(request)
    print("WFS URL: {0}/{1}".format(WFS_SETTINGS['URL'],data))
    u = openURL(WFS_SETTINGS['URL'], data, 'Get', username = OGC_SERVER['default']['USER'], password = OGC_SERVER['default']['PASSWORD'])

    #Create lxml tree and namespace map
    wfs_xml = u.read()
    wfs_etree = etree.fromstring(wfs_xml)
    wfs_nsmap = wfs_etree.nsmap
    wfs_nsmap.pop(None,None)
    
    #Get a list of gridrefs using xpath
    return list(wfs_etree.xpath("//{0}GRID_REF/text()".format(WFS_SETTINGS['GEONODE_NS']),
                                namespaces=wfs_nsmap))
示例#29
0
    def getCoverage(self, identifier=None, bbox=None, time=None, format = None, store=False, rangesubset=None, gridbaseCRS=None, gridtype=None, gridCS=None, gridorigin=None, gridoffsets=None, method='Get',**kwargs):
        """Request and return a coverage from the WCS as a file-like object
        note: additional **kwargs helps with multi-version implementation
        core keyword arguments should be supported cross version
        example:
        cvg=wcs.getCoverageRequest(identifier=['TuMYrRQ4'], time=['2792-06-01T00:00:00.0'], bbox=(-112,36,-106,41),format='application/netcdf', store='true')

        is equivalent to:
        http://myhost/mywcs?SERVICE=WCS&REQUEST=GetCoverage&IDENTIFIER=TuMYrRQ4&VERSION=1.1.0&BOUNDINGBOX=-180,-90,180,90&TIMESEQUENCE=2792-06-01T00:00:00.0&FORMAT=application/netcdf
        
        if store = true, returns a coverages XML file
        if store = false, returns a multipart mime
        """
        self.log.debug('WCS 1.1.0 DEBUG: Parameters passed to GetCoverage: identifier=%s, bbox=%s, time=%s, format=%s,        rangesubset=%s, gridbaseCRS=%s, gridtype=%s, gridCS=%s, gridorigin=%s, gridoffsets=%s, method=%s, other_arguments=%s'%(identifier, bbox, time, format, rangesubset, gridbaseCRS, gridtype, gridCS, gridorigin, gridoffsets, method, str(kwargs)))
        
        
        if method == 'Get':
            method='{http://www.opengis.net/wcs/1.1/ows}Get'
        base_url = self.getOperationByName('GetCoverage').methods[method]['url']


        #process kwargs
        request = {'version': self.version, 'request': 'GetCoverage', 'service':'WCS'}
        assert len(identifier) > 0
        request['identifier']=identifier
        #request['identifier'] = ','.join(identifier)
        if bbox:
            request['boundingbox']=','.join([repr(x) for x in bbox])
        if time:
            request['timesequence']=','.join(time)
        request['format']=format
        request['store']=store
        
        #rangesubset: untested - require a server implementation
        if rangesubset:
            request['RangeSubset']=rangesubset
        
        #GridCRS structure: untested - require a server implementation
        if gridbaseCRS:
            request['gridbaseCRS']=gridbaseCRS
        if gridtype:
            request['gridtype']=gridtype
        if gridCS:
            request['gridCS']=gridCS
        if gridorigin:
            request['gridorigin']=gridorigin
        if gridoffsets:
            request['gridoffsets']=gridoffsets
       
       #anything else e.g. vendor specific parameters must go through kwargs
        if kwargs:
            for kw in kwargs:
                request[kw]=kwargs[kw]
        
        #encode and request
        data = urlencode(request)
        
        u=openURL(base_url, data, method, self.cookies)
        return u
示例#30
0
文件: sos100.py 项目: SiggyF/OWSLib
    def get_observation(self,   responseFormat=None,
                                offerings=None,
                                observedProperties=None,
                                eventTime=None,
                                method='Get',
                                **kwargs):
        """
        Parameters
        ----------
        format : string
            Output format. Provide one that is available for all offerings
        method : string
            Optional. HTTP DCP method name: Get or Post.  Must
        **kwargs : extra arguments
            anything else e.g. vendor specific parameters
        """
        try:
            base_url = next((m.get('url') for m in self.getOperationByName('GetObservation').methods if m.get('type').lower() == method.lower()))
        except StopIteration:
            base_url = self.url

        request = {'service': 'SOS', 'version': self.version, 'request': 'GetObservation'}

        # Required Fields
        assert isinstance(offerings, list) and len(offerings) > 0
        request['offering'] = ','.join(offerings)

        assert isinstance(observedProperties, list) and len(observedProperties) > 0
        request['observedProperty'] = ','.join(observedProperties)

        assert isinstance(responseFormat, str)
        request['responseFormat'] = responseFormat


        # Optional Fields
        if eventTime is not None:
            request['eventTime'] = eventTime
        
        url_kwargs = {}
        if 'timeout' in kwargs:
            url_kwargs['timeout'] = kwargs.pop('timeout') # Client specified timeout value

        if kwargs:
            for kw in kwargs:
                request[kw]=kwargs[kw]

        data = urlencode(request)        

        response = openURL(base_url, data, method, username=self.username, password=self.password, **kwargs).read()
        try:
            tr = etree.fromstring(response)
            if tr.tag == nspath_eval("ows:ExceptionReport", namespaces):
                raise ows.ExceptionReport(tr)
            else:
                return response                
        except ows.ExceptionReport:
            raise
        except BaseException:
            return response
示例#31
0
    def getCoverage(self, identifier=None, bbox=None, time=None, format = None, store=False, rangesubset=None, gridbaseCRS=None, gridtype=None, gridCS=None, gridorigin=None, gridoffsets=None, method='Get',**kwargs):
        """Request and return a coverage from the WCS as a file-like object
        note: additional **kwargs helps with multi-version implementation
        core keyword arguments should be supported cross version
        example:
        cvg=wcs.getCoverageRequest(identifier=['TuMYrRQ4'], time=['2792-06-01T00:00:00.0'], bbox=(-112,36,-106,41),format='application/netcdf', store='true')

        is equivalent to:
        http://myhost/mywcs?SERVICE=WCS&REQUEST=GetCoverage&IDENTIFIER=TuMYrRQ4&VERSION=1.1.0&BOUNDINGBOX=-180,-90,180,90&TIMESEQUENCE=2792-06-01T00:00:00.0&FORMAT=application/netcdf
        
        if store = true, returns a coverages XML file
        if store = false, returns a multipart mime
        """
        self.log.debug('WCS 1.1.0 DEBUG: Parameters passed to GetCoverage: identifier=%s, bbox=%s, time=%s, format=%s,        rangesubset=%s, gridbaseCRS=%s, gridtype=%s, gridCS=%s, gridorigin=%s, gridoffsets=%s, method=%s, other_arguments=%s'%(identifier, bbox, time, format, rangesubset, gridbaseCRS, gridtype, gridCS, gridorigin, gridoffsets, method, str(kwargs)))
        
        
        if method == 'Get':
            method='{http://www.opengis.net/wcs/1.1/ows}Get'
        base_url = self.getOperationByName('GetCoverage').methods[method]['url']


        #process kwargs
        request = {'version': self.version, 'request': 'GetCoverage', 'service':'WCS'}
        assert len(identifier) > 0
        request['identifier']=identifier
        #request['identifier'] = ','.join(identifier)
        if bbox:
            request['boundingbox']=','.join([repr(x) for x in bbox])
        if time:
            request['timesequence']=','.join(time)
        request['format']=format
        request['store']=store
        
        #rangesubset: untested - require a server implementation
        if rangesubset:
            request['RangeSubset']=rangesubset
        
        #GridCRS structure: untested - require a server implementation
        if gridbaseCRS:
            request['gridbaseCRS']=gridbaseCRS
        if gridtype:
            request['gridtype']=gridtype
        if gridCS:
            request['gridCS']=gridCS
        if gridorigin:
            request['gridorigin']=gridorigin
        if gridoffsets:
            request['gridoffsets']=gridoffsets
       
       #anything else e.g. vendor specific parameters must go through kwargs
        if kwargs:
            for kw in kwargs:
                request[kw]=kwargs[kw]
        
        #encode and request
        data = urlencode(request)
        
        u=openURL(base_url, data, method, self.cookies)
        return u
示例#32
0
    def Subgetmap_url(self,
                      layers=None,
                      styles=None,
                      srs=None,
                      bbox=None,
                      format=None,
                      size=None,
                      time=None,
                      transparent=False,
                      bgcolor='#FFFFFF',
                      exceptions='application/vnd.ogc.se_xml',
                      method='Get',
                      timeout=None,
                      **kwargs):
        try:
            base_url = next((m.get('url')
                             for m in self.getOperationByName('GetMap').methods
                             if m.get('type').lower() == method.lower()))
        except StopIteration:
            base_url = self.url
        request = {'version': self.version, 'request': 'GetMap'}

        request = self.__build_getmap_request(layers=layers,
                                              styles=styles,
                                              srs=srs,
                                              bbox=bbox,
                                              format=format,
                                              size=size,
                                              time=time,
                                              transparent=transparent,
                                              bgcolor=bgcolor,
                                              exceptions=exceptions,
                                              **kwargs)

        data = urlencode(request)
        ##########
        #Replace + with %20
        ##########
        data = data.replace("+", "%20")
        request = bind_url(base_url) + data

        # GetMap validity
        u = openURL(base_url,
                    data,
                    method,
                    username=self.username,
                    password=self.password,
                    timeout=timeout or self.timeout)
        # check for service exceptions, and return
        if u.info()['Content-Type'].split(';')[0] in [
                'application/vnd.ogc.se_xml'
        ]:
            se_xml = u.read()
            se_tree = etree.fromstring(se_xml)
            err_message = six.text_type(
                se_tree.find('ServiceException').text).strip()
            raise ServiceException(err_message)
        return request
示例#33
0
文件: wfs100.py 项目: wsidl/OWSLib
    def __init__(self, elem, parent, parse_remote_metadata=False, timeout=30):
        """."""
        self.id = testXMLValue(elem.find(nspath('Name')))
        self.title = testXMLValue(elem.find(nspath('Title')))
        self.abstract = testXMLValue(elem.find(nspath('Abstract')))
        self.keywords = [f.text for f in elem.findall(nspath('Keywords'))]

        # bboxes
        self.boundingBox = None
        b = elem.find(nspath('BoundingBox'))
        if b is not None:
            self.boundingBox = (float(b.attrib['minx']),float(b.attrib['miny']),
                    float(b.attrib['maxx']), float(b.attrib['maxy']),
                    b.attrib['SRS'])
        self.boundingBoxWGS84 = None
        b = elem.find(nspath('LatLongBoundingBox'))
        if b is not None:
            self.boundingBoxWGS84 = (
                    float(b.attrib['minx']),float(b.attrib['miny']),
                    float(b.attrib['maxx']), float(b.attrib['maxy']),
                    )
        # crs options
        self.crsOptions = [Crs(srs.text) for srs in elem.findall(nspath('SRS'))]

        # verbs
        self.verbOptions = [op.tag for op \
            in parent.findall(nspath('Operations/*'))]
        self.verbOptions + [op.tag for op \
            in elem.findall(nspath('Operations/*')) \
            if op.tag not in self.verbOptions]
        
        #others not used but needed for iContentMetadata harmonisation
        self.styles=None
        self.timepositions=None
        self.defaulttimeposition=None

        # MetadataURLs
        self.metadataUrls = []
        for m in elem.findall(nspath('MetadataURL')):
            metadataUrl = {
                'type': testXMLValue(m.attrib['type'], attrib=True),
                'format': testXMLValue(m.find('Format')),
                'url': testXMLValue(m)
            }

            if metadataUrl['url'] is not None and parse_remote_metadata:  # download URL
                try:
                    content = openURL(metadataUrl['url'], timeout=timeout)
                    doc = etree.parse(content)
                    if metadataUrl['type'] is not None:
                        if metadataUrl['type'] == 'FGDC':
                            metadataUrl['metadata'] = Metadata(doc)
                        if metadataUrl['type'] == 'TC211':
                            metadataUrl['metadata'] = MD_Metadata(doc)
                except Exception:
                    metadataUrl['metadata'] = None

            self.metadataUrls.append(metadataUrl)
示例#34
0
    def getCoverage(self, identifier=None, bbox=None, time=None, format = None,  crs=None, width=None, height=None, resx=None, resy=None, resz=None,parameter=None,method='Get',**kwargs):
        """Request and return a coverage from the WCS as a file-like object
        note: additional **kwargs helps with multi-version implementation
        core keyword arguments should be supported cross version
        example:
        cvg=wcs.getCoverage(identifier=['TuMYrRQ4'], timeSequence=['2792-06-01T00:00:00.0'], bbox=(-112,36,-106,41),format='cf-netcdf')

        is equivalent to:
        http://myhost/mywcs?SERVICE=WCS&REQUEST=GetCoverage&IDENTIFIER=TuMYrRQ4&VERSION=1.1.0&BOUNDINGBOX=-180,-90,180,90&TIME=2792-06-01T00:00:00.0&FORMAT=cf-netcdf
           
        """
        if log.isEnabledFor(logging.DEBUG):
            log.debug('WCS 1.0.0 DEBUG: Parameters passed to GetCoverage: identifier=%s, bbox=%s, time=%s, format=%s, crs=%s, width=%s, height=%s, resx=%s, resy=%s, resz=%s, parameter=%s, method=%s, other_arguments=%s'%(identifier, bbox, time, format, crs, width, height, resx, resy, resz, parameter, method, str(kwargs)))
                
        base_url = self.getOperationByName('GetCoverage').methods[method]['url']
        
        if log.isEnabledFor(logging.DEBUG):
            log.debug('WCS 1.0.0 DEBUG: base url of server: %s'%base_url)
        
        #process kwargs
        request = {'version': self.version, 'request': 'GetCoverage', 'service':'WCS'}
        assert len(identifier) > 0
        request['Coverage']=identifier
        #request['identifier'] = ','.join(identifier)
        if bbox:
            request['BBox']=','.join([self.__makeString(x) for x in bbox])
        else:
            request['BBox']=None
        if time:
            request['time']=','.join(time)
        if crs:
            request['crs']=crs
        request['format']=format
        if width:
            request['width']=width
        if height:
            request['height']=height
        if resx:
            request['resx']=resx
        if resy:
            request['resy']=resy
        if resz:
            request['resz']=resz
        
        #anything else e.g. vendor specific parameters must go through kwargs
        if kwargs:
            for kw in kwargs:
                request[kw]=kwargs[kw]
        
        #encode and request
        data = urlencode(request)
        if log.isEnabledFor(logging.DEBUG):
            log.debug('WCS 1.0.0 DEBUG: Second part of URL: %s'%data)
        
        
        u=openURL(base_url, data, method, self.cookies)

        return u
示例#35
0
    def __init__(self, elem, parse_remote_metadata=False, timeout=30):
        """."""
        self.id = testXMLValue(elem.find(nspath_eval('wfs:Name', namespaces)))
        self.title = testXMLValue(elem.find(nspath_eval('wfs:Title', namespaces)))
        self.abstract = testXMLValue(elem.find(nspath_eval('wfs:Abstract', namespaces)))
        self.keywords = [f.text for f in elem.findall(nspath_eval('ows:Keywords/ows:Keyword', namespaces))]

        # bbox
        self.boundingBoxWGS84 = None
        b = BoundingBox(elem.find(nspath_eval('ows:WGS84BoundingBox', namespaces)), namespaces['ows'])
        if b is not None:
            try:
                self.boundingBoxWGS84 = (
                        float(b.minx), float(b.miny),
                        float(b.maxx), float(b.maxy),
                        )
            except TypeError:
                self.boundingBoxWGS84 = None
        # crs options
        self.crsOptions = [Crs(srs.text) for srs in elem.findall(nspath_eval('wfs:OtherSRS', namespaces))]
        dsrs = testXMLValue(elem.find(nspath_eval('wfs:DefaultSRS', namespaces)))
        if dsrs is not None:  # first element is default srs
            self.crsOptions.insert(0, Crs(dsrs))

        # verbs
        self.verbOptions = [op.text for op in elem.findall(nspath_eval('wfs:Operations/wfs:Operation', namespaces))]

        # output formats
        self.outputFormats = [op.text for op in elem.findall(nspath_eval('wfs:OutputFormats/wfs:Format', namespaces))]

        # MetadataURLs
        self.metadataUrls = []
        for m in elem.findall(nspath_eval('wfs:MetadataURL', namespaces)):
            metadataUrl = {
                'type': testXMLValue(m.attrib['type'], attrib=True),
                'format': testXMLValue(m.find('Format')),
                'url': testXMLValue(m)
            }

            if metadataUrl['url'] is not None and parse_remote_metadata:  # download URL
                try:
                    content = openURL(metadataUrl['url'], timeout=timeout)
                    doc = etree.parse(content)
                    if metadataUrl['type'] is not None:
                        if metadataUrl['type'] == 'FGDC':
                            metadataUrl['metadata'] = Metadata(doc)
                        if metadataUrl['type'] in ['TC211', '19115', '19139']:
                            metadataUrl['metadata'] = MD_Metadata(doc)
                except Exception:
                    metadataUrl['metadata'] = None

            self.metadataUrls.append(metadataUrl)

        #others not used but needed for iContentMetadata harmonisation
        self.styles=None
        self.timepositions=None
        self.defaulttimeposition=None
示例#36
0
文件: sos100.py 项目: Geoneer/QGIS
    def get_observation(
        self, responseFormat=None, offerings=None, observedProperties=None, eventTime=None, method="Get", **kwargs
    ):
        """
        Parameters
        ----------
        format : string
            Output format. Provide one that is available for all offerings
        method : string
            Optional. HTTP DCP method name: Get or Post.  Must
        **kwargs : extra arguments
            anything else e.g. vendor specific parameters
        """
        try:
            base_url = next(
                (
                    m.get("url")
                    for m in self.getOperationByName("GetObservation").methods
                    if m.get("type").lower() == method.lower()
                )
            )
        except StopIteration:
            base_url = self.url

        request = {"service": "SOS", "version": self.version, "request": "GetObservation"}

        # Required Fields
        assert isinstance(offerings, list) and len(offerings) > 0
        request["offering"] = ",".join(offerings)

        assert isinstance(observedProperties, list) and len(observedProperties) > 0
        request["observedProperty"] = ",".join(observedProperties)

        assert isinstance(responseFormat, str)
        request["responseFormat"] = responseFormat

        # Optional Fields
        if eventTime is not None:
            request["eventTime"] = eventTime

        if kwargs:
            for kw in kwargs:
                request[kw] = kwargs[kw]

        data = urlencode(request)

        response = openURL(base_url, data, method, username=self.username, password=self.password).read()
        try:
            tr = etree.fromstring(response)
            if tr.tag == nspath_eval("ows:ExceptionReport", namespaces):
                raise ows.ExceptionReport(tr)
            else:
                return response
        except ows.ExceptionReport:
            raise
        except BaseException:
            return response
示例#37
0
    def getCoverage(self, identifier=None, bbox=None, time=None, format = None,  crs=None, width=None, height=None, resx=None, resy=None, resz=None,parameter=None,method='Get',**kwargs):
        """Request and return a coverage from the WCS as a file-like object
        note: additional **kwargs helps with multi-version implementation
        core keyword arguments should be supported cross version
        example:
        cvg=wcs.getCoverage(identifier=['TuMYrRQ4'], timeSequence=['2792-06-01T00:00:00.0'], bbox=(-112,36,-106,41),format='cf-netcdf')

        is equivalent to:
        http://myhost/mywcs?SERVICE=WCS&REQUEST=GetCoverage&IDENTIFIER=TuMYrRQ4&VERSION=1.1.0&BOUNDINGBOX=-180,-90,180,90&TIME=2792-06-01T00:00:00.0&FORMAT=cf-netcdf
           
        """
        
        self.log.debug('WCS 1.0.0 DEBUG: Parameters passed to GetCoverage: identifier=%s, bbox=%s, time=%s, format=%s, crs=%s, width=%s, height=%s, resx=%s, resy=%s, resz=%s, parameter=%s, method=%s, other_arguments=%s'%(identifier, bbox, time, format, crs, width, height, resx, resy, resz, parameter, method, str(kwargs)))
                
        base_url = self.getOperationByName('GetCoverage').methods[method]['url']
        
        self.log.debug('WCS 1.0.0 DEBUG: base url of server: %s'%base_url)
        
        #process kwargs
        request = {'version': self.version, 'request': 'GetCoverage', 'service':'WCS'}
        assert len(identifier) > 0
        request['Coverage']=identifier
        #request['identifier'] = ','.join(identifier)
        if bbox:
            request['BBox']=','.join([self.__makeString(x) for x in bbox])
        else:
            request['BBox']=None
        if time:
            request['time']=','.join(time)
        if crs:
            request['crs']=crs
        request['format']=format
        if width:
            request['width']=width
        if height:
            request['height']=height
        if resx:
            request['resx']=resx
        if resy:
            request['resy']=resy
        if resz:
            request['resz']=resz
        
        #anything else e.g. vendor specific parameters must go through kwargs
        if kwargs:
            for kw in kwargs:
                request[kw]=kwargs[kw]
        
        #encode and request
        data = urlencode(request)
        self.log.debug('WCS 1.0.0 DEBUG: Second part of URL: %s'%data)
        
        
        u=openURL(base_url, data, method, self.cookies)

        return u
示例#38
0
def insert_observation_json(self, 
                       time,
                       value,
                       offering = None,
                       procedure = None,
                       observedProperty = None,
                       featureOfInterest = None,
                       method = 'Post',                       
                       **kwargs):

    _foi = self.get_feature_of_interest_json(featureOfInterest = featureOfInterest,
                                            observedProperty = observedProperty,
                                            procedure = procedure
                                            )
    if len(_foi['featureOfInterest']) != 1:
        raise Exception("Foi not found")

    foi = _foi['featureOfInterest'][0]
      
    base_url = 'http://sp7.irea.cnr.it/tomcat/MareeVe/sos/json'
    request = {
        'service': 'SOS', 
        'version': self.version, 
        'request': 'InsertObservation',
        "offering": offering,
        "observation": {
            "identifier": {
                "value": "http://www.52north.org/test/observation/9",
                "codespace": "http://www.opengis.net/def/nil/OGC/0/unknown"
                },
            "type": "http://www.opengis.net/def/observationType/OGC-OM/2.0/OM_Measurement",
            "procedure": procedure,
            "observedProperty": observedProperty,
            "featureOfInterest": foi,
            "phenomenonTime": time,
            "resultTime": time,
            "result": {
                "uom": "test_unit_6",
                "value": value
                }
            }
        }

    if kwargs:
        for kw in kwargs:
            request[kw]=kwargs[kw]

    #return request

    data = json.dumps(request)
    
    # print data

    response = openURL(base_url, data, method, username=self.username, password=self.password).read()
    return response
示例#39
0
def _get_remote_describefeaturetype(url, timeout, headers, auth):
    """Gets the DescribeFeatureType response from the remote server.

    :param str url: url of the service
    :param int timeout: request timeout
    :param Authentication auth: instance of owslib.util.Authentication

    :return etree.Element with the root of the DescribeFeatureType response
    """
    res = openURL(url, timeout=timeout, headers=headers, auth=auth)
    return etree.fromstring(res.read())
示例#40
0
文件: wfs110.py 项目: KeyproOy/OWSLib
    def __init__(self, elem, parse_remote_metadata=False, timeout=30):
        """."""
        self.id = testXMLValue(elem.find(nspath_eval('wfs:Name', namespaces)))
        self.title = testXMLValue(elem.find(nspath_eval('wfs:Title', namespaces)))
        self.abstract = testXMLValue(elem.find(nspath_eval('wfs:Abstract', namespaces)))
        self.keywords = [f.text for f in elem.findall(nspath_eval('ows:Keywords/ows:Keyword', namespaces))]

        # bbox
        self.boundingBoxWGS84 = None
        b = BoundingBox(elem.find(nspath_eval('ows:WGS84BoundingBox', namespaces)), namespaces['ows'])
        if b is not None:
            self.boundingBoxWGS84 = (
                    float(b.minx), float(b.miny),
                    float(b.maxx), float(b.maxy),
                    )
        # crs options
        self.crsOptions = [Crs(srs.text) for srs in elem.findall(nspath_eval('wfs:OtherSRS', namespaces))]
        dsrs = testXMLValue(elem.find(nspath_eval('wfs:DefaultSRS', namespaces)))
        if dsrs is not None:  # first element is default srs
            self.crsOptions.insert(0, Crs(dsrs))

        # verbs
        self.verbOptions = [op.text for op in elem.findall(nspath_eval('wfs:Operations/wfs:Operation', namespaces))]

        # output formats
        self.outputFormats = [op.text for op in elem.findall(nspath_eval('wfs:OutputFormats/wfs:Format', namespaces))]

        # MetadataURLs
        self.metadataUrls = []
        for m in elem.findall(nspath_eval('wfs:MetadataURL', namespaces)):
            metadataUrl = {
                'type': testXMLValue(m.attrib['type'], attrib=True),
                'format': testXMLValue(m.find('Format')),
                'url': testXMLValue(m)
            }

            if metadataUrl['url'] is not None and parse_remote_metadata:  # download URL
                try:
                    content = openURL(metadataUrl['url'], timeout=timeout)
                    doc = etree.parse(content)
                    if metadataUrl['type'] is not None:
                        if metadataUrl['type'] == 'FGDC':
                            metadataUrl['metadata'] = Metadata(doc)
                        if metadataUrl['type'] in ['TC211', '19115', '19139']:
                            metadataUrl['metadata'] = MD_Metadata(doc)
                except Exception:
                    metadataUrl['metadata'] = None

            self.metadataUrls.append(metadataUrl)

        #others not used but needed for iContentMetadata harmonisation
        self.styles=None
        self.timepositions=None
        self.defaulttimeposition=None
示例#41
0
    def getCoverage(self,
                    identifier=None,
                    format=None,
                    subsets=None,
                    method='Get',
                    **kwargs):
        """Request and return a coverage from the WCS as a file-like object
        note: additional **kwargs helps with multi-version implementation
        core keyword arguments should be supported cross version
        example:
        cvg=wcs.getCoverageRequest(identifier=['TuMYrRQ4'], time=['2792-06-01T00:00:00.0'], bbox=(-112,36,-106,41),format='application/netcdf', store='true')

        is equivalent to:
        http://myhost/mywcs?SERVICE=WCS&REQUEST=GetCoverage&IDENTIFIER=TuMYrRQ4&VERSION=1.1.0&BOUNDINGBOX=-180,-90,180,90&TIMESEQUENCE=2792-06-01T00:00:00.0&FORMAT=application/netcdf
        
        if store = true, returns a coverages XML file
        if store = false, returns a multipart mime
        """

        if method == 'Get':
            method = OWS.Get

        base_url = self.getOperationByName(
            'GetCoverage').methods[method]['url']

        #process kwargs
        request = {
            'version': self.version,
            'request': 'GetCoverage',
            'service': 'WCS'
        }
        assert len(identifier) > 0
        request['coverageId'] = identifier
        #request['identifier'] = ','.join(identifier)
        request['format'] = format

        #subsets: untested - require a server implementation
        if subsets:
            request = request.items()
            for k, v in subsets.items():
                if isinstance(v, (list, tuple)):
                    v = ','.join('%s' % vv for vv in v)
                request.append(('subset', '%s(%s)' % (k, v)))

        #anything else e.g. vendor specific parameters must go through kwargs
        if kwargs:
            for kw in kwargs:
                request[kw] = kwargs[kw]

        #encode and request
        data = urlencode(request)
        u = openURL(base_url, data, method, self.cookies)
        return u
示例#42
0
    def read(self, service_url):
        """
            Get and parse a WMS capabilities document, returning an
            elementtree instance

            service_url is the base url, to which is appended the service,
            acceptVersions, and request parameters
        """
        getcaprequest = self.capabilities_url(service_url)
        spliturl=getcaprequest.split('?')
        u = openURL(spliturl[0], spliturl[1], method='Get', username=self.username, password=self.password)
        return etree.fromstring(u.read())
示例#43
0
    def read(self, service_url):
        """
            Get and parse a WMS capabilities document, returning an
            elementtree instance

            service_url is the base url, to which is appended the service,
            acceptVersions, and request parameters
        """
        getcaprequest = self.capabilities_url(service_url)
        spliturl=getcaprequest.split('?')
        u = openURL(spliturl[0], spliturl[1], method='Get', username=self.username, password=self.password)
        return etree.fromstring(u.read())
示例#44
0
文件: sos200.py 项目: ACorradini/QGIS
    def get_observation(self, responseFormat=None,
                              offerings=None,
                              observedProperties=None,
                              eventTime=None,
                              method='Get',
                              **kwargs):
        """
        Parameters
        ----------
        format : string
            Output format. Provide one that is available for all offerings
        method : string
            Optional. HTTP DCP method name: Get or Post.  Must
        **kwargs : extra arguments
            anything else e.g. vendor specific parameters
        """

        base_url = self.get_operation_by_name('GetObservation').methods[method]['url']        

        request = {'service': 'SOS', 'version': self.version, 'request': 'GetObservation'}

        # Required Fields
        assert isinstance(offerings, list) and len(offerings) > 0
        request['offering'] = ','.join(offerings)

        assert isinstance(observedProperties, list) and len(observedProperties) > 0
        request['observedProperty'] = ','.join(observedProperties)

        if responseFormat is not None:
            request['responseFormat'] = responseFormat

        # Optional Fields
        if eventTime is not None:
            request['temporalFilter'] = eventTime

        if kwargs:
            for kw in kwargs:
                request[kw]=kwargs[kw]

        data = urlencode(request)        

        response = openURL(base_url, data, method, username=self.username, password=self.password).read()
        try:
            tr = etree.fromstring(response)
            if tr.tag == nspath_eval("ows:ExceptionReport", namespaces):
                raise ows.ExceptionReport(tr)
            else:
                return response                
        except ows.ExceptionReport:
            raise
        except BaseException:
            return response
示例#45
0
    def read(self, service_url, timeout=30):
        """Get and parse a WMS capabilities document, returning an
        elementtree instance

        service_url is the base url, to which is appended the service,
        version, and request parameters
        """
        getcaprequest = self.capabilities_url(service_url)

        #now split it up again to use the generic openURL function...
        spliturl=getcaprequest.split('?')
        u = openURL(spliturl[0], spliturl[1], method='Get', username=self.username, password=self.password, timeout=timeout)
        return etree.fromstring(u.read())
示例#46
0
    def read(self, service_url, timeout=30):
        """Get and parse a WCS capabilities document, returning an
        elementtree tree

        @type service_url: string
        @param service_url: The base url, to which is appended the service,
        version, and request parameters
        @rtype: elementtree tree
        @return: An elementtree tree representation of the capabilities document
        """
        request = self.capabilities_url(service_url)
        u = openURL(request, timeout=timeout, cookies=self.cookies)
        return etree.fromstring(u.read())
def opensearch_query(collection=None,
                     query='',
                     data=None,
                     method='Get',
                     cookies=None,
                     username=None,
                     password=None,
                     timeout=30,
                     headers=None,
                     verify=True,
                     cert=None,
                     params=None):
    """Get a list of ResponseWrappers from a given OpenSearch request"""
    # if params is provided, query is ignored
    if params is not None:
        query = '&'.join(f'{k}={v}' for k, v in params.items())

    # build base request URI
    if collection is None:
        os_query_base = f'https://mundiwebservices.com/acdc/catalog/proxy/search/global/opensearch?{query}'
    else:
        os_query_base = f'https://mundiwebservices.com/acdc/catalog/proxy/search/{collection.name}/opensearch?{query}'

    # loop through all matched records
    response_wrappers = []
    os_query = f'{os_query_base}&startIndex=1'
    while True:
        # get current page
        page = openURL(os_query, data, method, cookies, username, password,
                       timeout, headers, verify, cert)
        response_wrapper = page.read()
        response_wrapper_xml = etree.fromstring(response_wrapper)
        response_wrappers.append(page)

        nb_total = int(
            response_wrapper_xml.find('os:totalResults',
                                      namespaces=MUNDI_NAMESPACES).text)
        nb_page = int(
            response_wrapper_xml.find('os:itemsPerPage',
                                      namespaces=MUNDI_NAMESPACES).text)
        start_index = int(
            response_wrapper_xml.find('os:startIndex',
                                      namespaces=MUNDI_NAMESPACES).text)

        next_record = start_index + nb_page
        if next_record > nb_total:
            break

        os_query = f'{os_query_base}&startIndex={next_record}'

    return response_wrappers
示例#48
0
    def read(self, url, timeout=30):
        """Get and parse a WFS capabilities document, returning an
        instance of WFSCapabilitiesInfoset

        Parameters
        ----------
        url : string
            The URL to the WFS capabilities document.
        timeout : number
            A timeout value (in seconds) for the request.
        """
        request = self.capabilities_url(url)
        u = openURL(request, timeout=timeout)
        return etree.fromstring(u.read())
示例#49
0
文件: common.py 项目: yalaudah/OWSLib
    def read(self, url, timeout=30):
        """Get and parse a WFS capabilities document, returning an
        instance of WFSCapabilitiesInfoset

        Parameters
        ----------
        url : string
            The URL to the WFS capabilities document.
        timeout : number
            A timeout value (in seconds) for the request.
        """
        request = self.capabilities_url(url)
        u = openURL(request, timeout=timeout, auth=self.auth)
        return etree.fromstring(u.read())
示例#50
0
def update_file(filepath, url, process_fn=None):
    sys.stdout.write('Updating {} ...'.format(filepath))
    try:
        data = openURL(url).read()
        if type(data) is bytes:
            data = data.decode('utf-8')
    except Exception as e:
        sys.stdout.write(' FAILED:\n   {}.\n'.format(e))
        return
    else:
        with open(filepath, 'wb') as f:
            if process_fn:
                data = process_fn(data)
            f.write(data.encode('utf-8'))
            sys.stdout.write(' OK.\n')
示例#51
0
文件: schema.py 项目: Gustry/QGIS
def get_schema(url, typename, version="1.0.0", timeout=30):
    """Parses DescribeFeatureType response and creates schema compatible
    with :class:`fiona`

    :param str url: url of the service
    :param str version: version of the service
    :param str typename: name of the layer
    :param int timeout: request timeout
    """

    url = _get_describefeaturetype_url(url, version, typename)
    res = openURL(url, timeout=timeout)
    root = etree.fromstring(res.read())
    type_element = findall(root, "{%s}element" % XS_NAMESPACE, attribute_name="name", attribute_value=typename)[0]
    complex_type = type_element.attrib["type"].split(":")[1]
    elements = _get_elements(complex_type, root)
    nsmap = None
    if hasattr(root, "nsmap"):
        nsmap = root.nsmap
    return _construct_schema(elements, nsmap)
示例#52
0
    def parse_remote_metadata(self, timeout=30):
        """Parse remote metadata for MetadataURL and add it as metadataUrl['metadata']"""
        for metadataUrl in self.metadataUrls:
            if metadataUrl['url'] is not None \
                    and metadataUrl['format'].lower() in ['application/xml', 'text/xml']:  # download URL
                try:
                    content = openURL(metadataUrl['url'], timeout=timeout)
                    doc = etree.fromstring(content.read())

                    mdelem = doc.find('.//metadata')
                    if mdelem is not None:
                        metadataUrl['metadata'] = Metadata(mdelem)
                        continue

                    mdelem = doc.find('.//' + nspath_eval('gmd:MD_Metadata', n.get_namespaces(['gmd']))) \
                             or doc.find('.//' + nspath_eval('gmi:MI_Metadata', n.get_namespaces(['gmi'])))
                    if mdelem is not None:
                        metadataUrl['metadata'] = MD_Metadata(mdelem)
                        continue
                except Exception:
                    metadataUrl['metadata'] = None
示例#53
0
 def getpropertyvalue(self, query=None, storedquery_id=None, valuereference=None, typename=None, method=nspath('Get'),**kwargs):
     ''' the WFS GetPropertyValue method'''
     try:
         base_url = next((m.get('url') for m in self.getOperationByName('GetPropertyValue').methods if m.get('type').lower() == method.lower()))
     except StopIteration:
         base_url = self.url
     request = {'service': 'WFS', 'version': self.version, 'request': 'GetPropertyValue'}
     if query:
         request['query'] = str(query)
     if valuereference: 
         request['valueReference'] = str(valuereference)
     if storedquery_id: 
         request['storedQuery_id'] = str(storedquery_id)
     if typename:
         request['typename']=str(typename)
     if kwargs:
         for kw in kwargs.keys():
             request[kw]=str(kwargs[kw])
     encoded_request=urlencode(request)
     u = openURL(base_url + encoded_request)
     return u.read()
示例#54
0
def get_feature_of_interest(feature_id):

    request = {'service': 'SOS',
               'version': SOS.version,
               'request': 'GetFeatureOfInterest'}
    request['FeatureOfInterestId'] = feature_id

    data = urlencode(request)
    response = openURL(BASE_URL, data, method='Get').read()

    if isinstance(response, bytes):
        response = io.BytesIO(response)
    elif isinstance(response, str):
        response = io.StringIO(response)

    #tree = ET.parse('temp.xml')
    tree = ET.parse(response)

    root = tree.getroot()

    if not root.tag == '{http://www.opengis.net/sampling/1.0}SamplingPoint':
        raise ValueError(
            "feature_id {feature_id} is not a SamplingPoint".format(
                feature_id=feature_id))

    st_info = {}
    st_info['id'] = root.attrib['{http://www.opengis.net/gml}id']
    st_info['description'] = root.find('{http://www.opengis.net/gml}description').text
    st_info['long_name'] = root.find('{http://www.opengis.net/gml}name').text
    name, _ = st_info['long_name'].split(' - ')
    st_info['name'] = name
    position = root.find('{http://www.opengis.net/sampling/1.0}position')
    point = position.find('{http://www.opengis.net/gml}Point')
    pos = point.find('{http://www.opengis.net/gml}pos').text
    x, y = pos.split(' ')
    st_info['x'] = x
    st_info['y'] = y

    return st_info
示例#55
0
def get_result_template(self, 
                        offering=None,
                        observedProperty=None,
                        method='Post',
                        **kwargs):

    base_url = 'http://sp7.irea.cnr.it/tomcat/MareeVe/sos/json'
    request = {'service': 'SOS', 
               'version': self.version, 
               'request': 'GetResultTemplate'}
    request['offering'] = offering
    request['observedProperty'] = observedProperty
    
    if kwargs:
        for kw in kwargs:
            request[kw]=kwargs[kw]

    data = json.dumps(request)
    
    print data

    response = openURL(base_url, data, method, username=self.username, password=self.password).read()
    return response
示例#56
0
    def parse_remote_metadata(self, timeout=30):
        """Parse remote metadata for MetadataURL of format 'text/xml' and add it as metadataUrl['metadata']"""
        for metadataUrl in self.metadataUrls:
            if metadataUrl['url'] is not None \
                    and metadataUrl['format'].lower() == 'text/xml':
                try:
                    content = openURL(metadataUrl['url'], timeout=timeout)
                    doc = etree.fromstring(content.read())

                    if metadataUrl['type'] == 'FGDC':
                        mdelem = doc.find('.//metadata')
                        if mdelem is not None:
                            metadataUrl['metadata'] = Metadata(mdelem)
                        else:
                            metadataUrl['metadata'] = None
                    elif metadataUrl['type'] in ['TC211', '19115', '19139']:
                        mdelem = doc.find('.//'+util.nspath_eval('gmd:MD_Metadata', namespaces)) or doc.find('.//'+util.nspath_eval('gmi:MI_Metadata', namespaces))
                        if mdelem is not None:
                            metadataUrl['metadata'] = MD_Metadata(mdelem)
                        else:
                            metadataUrl['metadata'] = None
                except:
                    metadataUrl['metadata'] = None
示例#57
0
def get_schema(url, typename, version='1.0.0', timeout=30, username=None, password=None):
    """Parses DescribeFeatureType response and creates schema compatible
    with :class:`fiona`

    :param str url: url of the service
    :param str version: version of the service
    :param str typename: name of the layer
    :param int timeout: request timeout
    """

    url = _get_describefeaturetype_url(url, version, typename)
    res = openURL(url, timeout=timeout, username=username, password=password)
    root = etree.fromstring(res.read())

    if ':' in typename:
        typename = typename.split(':')[1]
    type_element = findall(root, '{%s}element' % XS_NAMESPACE,
                           attribute_name='name', attribute_value=typename)[0]
    complex_type = type_element.attrib['type'].split(":")[1]
    elements = _get_elements(complex_type, root)
    nsmap = None
    if hasattr(root, 'nsmap'):
        nsmap = root.nsmap
    return _construct_schema(elements, nsmap)