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 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
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)
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)
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)
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
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
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
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
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
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)
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
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
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
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
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
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)
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)
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
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
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)
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
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)
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)
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()
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))
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
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
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
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)
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
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
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
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
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
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())
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
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
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())
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
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())
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
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())
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())
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')
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)
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
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()
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
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
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