root/OWSLib/trunk/owslib/iso.py

Revision 1670, 13.5 KB (checked in by tomkralidis, 2 months ago)

support email, edition, and supplmental information (#227)

Line 
1#!/usr/bin/python
2# -*- coding: ISO-8859-15 -*-
3# =============================================================================
4# Copyright (c) 2009 Tom Kralidis
5#
6# Authors : Tom Kralidis <tomkralidis@hotmail.com>
7#
8# Contact email: tomkralidis@hotmail.com
9# =============================================================================
10
11""" ISO metadata parser """
12
13from owslib.etree import etree
14from owslib import util
15
16# default variables
17
18namespaces = {
19    None : 'http://www.isotc211.org/2005/gmd',
20    'gco': 'http://www.isotc211.org/2005/gco',
21    'gmd': 'http://www.isotc211.org/2005/gmd',
22    'gts': 'http://www.isotc211.org/2005/gts',
23    'srv': 'http://www.isotc211.org/2005/srv',
24    'xlink': 'http://www.w3.org/1999/xlink'
25}
26
27class MD_Metadata(object):
28    """ Process gmd:MD_Metadata """
29    def __init__(self, md):
30        val = md.find(util.nspath('fileIdentifier', namespaces['gmd']) + '/' + util.nspath('CharacterString', namespaces['gco']))
31        self.identifier = util.testXMLValue(val)
32
33        val = md.find(util.nspath('language', namespaces['gmd']) + '/' + util.nspath('CharacterString', namespaces['gco']))
34        self.language = util.testXMLValue(val)
35
36        self.charset = _testCodeListValue(md.find(util.nspath('characterSet/MD_CharacterSetCode', namespaces['gmd'])))
37 
38        self.hierarchy = _testCodeListValue(md.find(util.nspath('hierarchyLevel/MD_ScopeCode', namespaces['gmd'])))
39
40        val = md.find(util.nspath('contact/CI_ResponsibleParty', namespaces['gmd']))
41        if val is not None:
42            self.contact = CI_ResponsibleParty(val)
43        else:
44            self.contact = None
45
46        val = md.find(util.nspath('dateStamp', namespaces['gmd']) + '/' + util.nspath('DateTime', namespaces['gco']))
47        self.datestamp = util.testXMLValue(val)
48       
49        val = md.find(util.nspath('metadataStandardName', namespaces['gmd']) + '/' + util.nspath('CharacterString', namespaces['gco']))
50        self.stdname = util.testXMLValue(val)
51
52        val = md.find(util.nspath('metadataStandardVersion', namespaces['gmd']) + '/' + util.nspath('CharacterString', namespaces['gco']))
53        self.stdver = util.testXMLValue(val)
54
55        val = md.find(util.nspath('referenceSystemInfo/MD_ReferenceSystem', namespaces['gmd']))
56        if val is not None:
57            self.referencesystem = MD_ReferenceSystem(val)
58        else:
59            self.referencesystem = None
60
61        val = md.find(util.nspath('identificationInfo/MD_DataIdentification', namespaces['gmd']))
62        val2 = md.find(util.nspath('identificationInfo', namespaces['gmd']) + '/' + util.nspath('SV_ServiceIdentification', namespaces['srv']))
63
64        if val is not None:
65            self.identification = MD_DataIdentification(val, 'dataset')
66        elif val2 is not None:
67            self.identification = MD_DataIdentification(val2, 'service')
68            self.identification.service = SV_ServiceIdentification(val2)
69        else:
70            self.identification = None
71
72        val = md.find(util.nspath('distributionInfo/MD_Distribution', namespaces['gmd']))
73        if val is not None:
74            self.distribution = MD_Distribution(val)
75        else:
76            self.distribution = None
77
78class CI_ResponsibleParty(object):
79    """ process CI_ResponsibleParty """
80    def __init__(self, md):
81        val = md.find(util.nspath('individualName', namespaces['gmd']) + '/' + util.nspath('CharacterString', namespaces['gco']))
82        self.name = util.testXMLValue(val)
83
84        val = md.find(util.nspath('organisationName', namespaces['gmd']) + '/' + util.nspath('CharacterString', namespaces['gco']))
85        self.organization = util.testXMLValue(val)
86
87        val = md.find(util.nspath('positionName', namespaces['gmd']) + '/' + util.nspath('CharacterString', namespaces['gco']))
88        self.position = util.testXMLValue(val)
89
90        val = md.find(util.nspath('contactInfo/CI_Contact/phone/CI_Telephone/voice', namespaces['gmd']) + '/' + util.nspath('CharacterString', namespaces['gco']))
91        self.phone = util.testXMLValue(val)
92
93        val = md.find(util.nspath('contactInfo/CI_Contact/phone/CI_Telephone/facsimile', namespaces['gmd']) + '/' + util.nspath('CharacterString', namespaces['gco']))
94        self.fax = util.testXMLValue(val)
95
96        val = md.find(util.nspath('contactInfo/CI_Contact/address/CI_Address/deliveryPoint', namespaces['gmd']) + '/' + util.nspath('CharacterString', namespaces['gco']))
97        self.address = util.testXMLValue(val)
98
99        val = md.find(util.nspath('contactInfo/CI_Contact/address/CI_Address/city', namespaces['gmd']) + '/' + util.nspath('CharacterString', namespaces['gco']))
100        self.city = util.testXMLValue(val)
101
102        val = md.find(util.nspath('contactInfo/CI_Contact/address/CI_Address/administrativeArea', namespaces['gmd']) + '/' + util.nspath('CharacterString', namespaces['gco']))
103        self.region = util.testXMLValue(val)
104
105        val = md.find(util.nspath('contactInfo/CI_Contact/address/CI_Address/postalCode', namespaces['gmd']) + '/' + util.nspath('CharacterString', namespaces['gco']))
106        self.postcode = util.testXMLValue(val)
107
108        val = md.find(util.nspath('contactInfo/CI_Contact/address/CI_Address/country', namespaces['gmd']) + '/' + util.nspath('CharacterString', namespaces['gco']))
109        self.country = util.testXMLValue(val)
110
111        val = md.find(util.nspath('contactInfo/CI_Contact/address/CI_Address/electronicMailAddress', namespaces['gmd']) + '/' + util.nspath('CharacterString', namespaces['gco']))
112        self.email = util.testXMLValue(val)
113
114        val = md.find(util.nspath('contactInfo/CI_Contact/onlineResource/CI_OnlineResource', namespaces['gmd']))
115        if val is not None:
116          self.onlineresource = CI_OnlineResource(val)
117        else:
118          self.onlineresource = None
119     
120        self.role = _testCodeListValue(md.find(util.nspath('role/CI_RoleCode', namespaces['gmd'])))
121
122class MD_DataIdentification(object):
123    """ process MD_DataIdentification """
124    def __init__(self, md, identtype):
125        self.identtype = identtype
126        val = md.find(util.nspath('citation/CI_Citation/title', namespaces['gmd']) + '/' + util.nspath('CharacterString', namespaces['gco']))
127        self.title = util.testXMLValue(val)
128
129        val = md.find(util.nspath('citation/CI_Citation/date/CI_Date/date', namespaces['gmd']) + '/' + util.nspath('DateTime', namespaces['gco']))
130        self.date = util.testXMLValue(val)
131
132        self.datetype = _testCodeListValue(md.find(util.nspath('citation/CI_Citation/date/CI_Date/dateType/CI_DateTypeCode', namespaces['gmd'])))
133
134        val = md.find(util.nspath('edition', namespaces['gmd']) + '/' + util.nspath('CharacterString', namespaces['gco']))
135        self.edition = util.testXMLValue(val)
136
137        val = md.find(util.nspath('abstract', namespaces['gmd']) + '/' + util.nspath('CharacterString', namespaces['gco']))
138        self.abstract = util.testXMLValue(val)
139
140        val = md.find(util.nspath('purpose', namespaces['gmd']) + '/' + util.nspath('CharacterString', namespaces['gco']))
141        self.purpose = util.testXMLValue(val, True)
142
143        self.status = _testCodeListValue(md.find(util.nspath('status/MD_ProgressCode', namespaces['gmd'])))
144
145        val = md.find(util.nspath('pointOfContact/CI_ResponsibleParty', namespaces['gmd']))
146
147        if val is not None:
148            self.contact = CI_ResponsibleParty(val)
149        else:
150            self.contact = None
151
152        self.keywords = {}
153
154        self.keywords['type'] = _testCodeListValue(md.find(util.nspath('descriptiveKeywords/MD_Keywords/type/MD_KeywordTypeCode', namespaces['gmd'])))
155
156        self.keywords['list'] = [] 
157        for i in md.findall(util.nspath('descriptiveKeywords/MD_Keywords/keyword', namespaces['gmd'])):
158            k = i.find(util.nspath('CharacterString', namespaces['gco']))
159            self.keywords['list'].append(util.testXMLValue(k))
160
161        val = md.find(util.nspath('topicCategory/MD_TopicCategoryCode', namespaces['gmd']))
162        self.topiccategory = util.testXMLValue(val)
163
164        val = md.find(util.nspath('extent/EX_Extent', namespaces['gmd']))
165
166        val = md.find(util.nspath('supplementalInformation', namespaces['gmd'])+ '/' + util.nspath('CharacterString', namespaces['gco']))
167        self.supplementalinformation = util.testXMLValue(val)
168
169        if val is not None:
170            self.bbox = EX_Extent(val)
171        else:
172            self.bbox = None
173       
174class MD_Distribution(object):
175    """ process MD_Distribution """
176    def __init__(self, md):
177        val = md.find(util.nspath('distributionFormat/MD_Format/name', namespaces['gmd']) + '/' + util.nspath('CharacterString', namespaces['gco']))
178        self.format = util.testXMLValue(val)
179
180        val = md.find(util.nspath('distributionFormat/MD_Format/version', namespaces['gmd']) + '/' + util.nspath('CharacterString', namespaces['gco']))
181        self.version = util.testXMLValue(val)
182
183        val = md.find(util.nspath('transferOptions/MD_DigitalTransferOptions/onLine/CI_OnlineResource', namespaces['gmd']))
184
185        if val is not None:
186            self.onlineresource = CI_OnlineResource(val)
187        else:
188            self.onlineresource = None
189       
190class SV_ServiceIdentification(object):
191    """ process SV_ServiceIdentification """
192    def __init__(self, md):
193        val = md.find(util.nspath('serviceType', namespaces['srv']) + '/' + util.nspath('LocalName', namespaces['gco']))
194        self.type = util.testXMLValue(val)
195     
196        val = md.find(util.nspath('serviceTypeVersion', namespaces['srv']) + '/' + util.nspath('CharacterString', namespaces['gco']))
197        self.version = util.testXMLValue(val)
198
199        val = md.find(util.nspath('accessProperties', namespaces['srv']) + '/' + util.nspath('MD_StandardOrderProcess/fees', namespaces['gmd']) + '/' + util.nspath('CharacterString', namespaces['gco']))
200        self.fees = util.testXMLValue(val)
201
202        val = md.find(util.nspath('extent', namespaces['srv']) + '/' + util.nspath('EX_Extent', namespaces['gmd']))
203
204        if val is not None:
205            self.bbox = EX_Extent(val)
206        else:
207            self.bbox = None
208
209        self.couplingtype = _testCodeListValue(md.find(util.nspath('couplingType/SV_CouplingType', namespaces['gmd'])))
210
211        self.operations = []
212
213        for i in md.findall(util.nspath('containsOperations', namespaces['srv'])):
214            tmp = {}
215            val = i.find(util.nspath('SV_OperationMetadata/operationName', namespaces['srv']) + '/' + util.nspath('CharacterString', namespaces['gco']))
216            tmp['name'] = util.testXMLValue(val)
217            tmp['dcplist'] = []
218            for d in i.findall(util.nspath('SV_OperationMetadata/DCP', namespaces['srv'])):
219                tmp2 = _testCodeListValue(d.find(util.nspath('DCPList', namespaces['srv'])))
220                tmp['dcplist'].append(tmp2)
221         
222            tmp['connectpoint'] = []
223 
224            for d in i.findall(util.nspath('SV_OperationMetadata/connectPoint', namespaces['srv'])):
225                tmp3 = d.find(util.nspath('CI_OnlineResource', namespaces['gmd']))
226                tmp['connectpoint'].append(CI_OnlineResource(tmp3))
227            self.operations.append(tmp)
228
229        self.operateson = []
230         
231        for i in md.findall(util.nspath('operatesOn', namespaces['srv'])):
232            tmp = {}
233            tmp['uuidref'] = i.attrib.get('uuidref')
234            tmp['href'] = i.attrib.get(util.nspath('href', namespaces['xlink']))
235            tmp['title'] = i.attrib.get(util.nspath('title', namespaces['xlink']))
236            self.operateson.append(tmp)
237
238class CI_OnlineResource(object):
239    """ process CI_OnlineResource """
240    def __init__(self,md):
241        val = md.find(util.nspath('linkage/URL', namespaces['gmd']))
242        self.url = util.testXMLValue(val)
243
244        val = md.find(util.nspath('protocol', namespaces['gmd']) + '/' + util.nspath('CharacterString', namespaces['gco']))
245        self.protocol = util.testXMLValue(val)
246
247        val = md.find(util.nspath('name', namespaces['gmd']) + '/' + util.nspath('CharacterString', namespaces['gco']))
248        self.name = util.testXMLValue(val)
249
250        val = md.find(util.nspath('description', namespaces['gmd']) + '/' + util.nspath('CharacterString', namespaces['gco']))
251        self.description = util.testXMLValue(val)
252
253        self.function = _testCodeListValue(md.find(util.nspath('function/CI_OnLineFunctionCode', namespaces['gmd'])))
254
255class EX_Extent(object):
256    """ process EX_Extent """
257    def __init__(self, md):
258        val = md.find(util.nspath('geographicElement/EX_GeographicBoundingBox/westBoundLongitude', namespaces['gmd']) + '/' + util.nspath('Decimal', namespaces['gco']))
259        self.minx = util.testXMLValue(val)
260        val = md.find(util.nspath('geographicElement/EX_GeographicBoundingBox/eastBoundLongitude', namespaces['gmd']) + '/' + util.nspath('Decimal', namespaces['gco']))
261        self.maxx = util.testXMLValue(val)
262        val = md.find(util.nspath('geographicElement/EX_GeographicBoundingBox/southBoundLatitude', namespaces['gmd']) + '/' + util.nspath('Decimal', namespaces['gco']))
263        self.miny = util.testXMLValue(val)
264        val = md.find(util.nspath('geographicElement/EX_GeographicBoundingBox/northBoundLatitude', namespaces['gmd']) + '/' + util.nspath('Decimal', namespaces['gco']))
265        self.maxy = util.testXMLValue(val)
266
267class MD_ReferenceSystem(object):
268    """ process MD_ReferenceSystem """
269    def __init__(self, md):
270        val = md.find(util.nspath('referenceSystemIdentifier/RS_Identifier/code', namespaces['gmd']) + '/' + util.nspath('CharacterString', namespaces['gco']))
271        self.code = util.testXMLValue(val)
272
273def _testCodeListValue(elpath):
274    if elpath is not None:
275        return util.testXMLValue(elpath.attrib.get('codeListValue'), True)
276    else:
277        return None
Note: See TracBrowser for help on using the browser.