/[thuban]/branches/WIP-pyshapelib-bramz/Extensions/wms/parser.py
ViewVC logotype

Diff of /branches/WIP-pyshapelib-bramz/Extensions/wms/parser.py

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 2145 by joey, Tue Mar 30 18:05:53 2004 UTC revision 2170 by joey, Tue Apr 13 17:21:19 2004 UTC
# Line 52  import xml.dom.minidom Line 52  import xml.dom.minidom
52    
53  from domutils import getElementsByName, getElementByName  from domutils import getElementsByName, getElementByName
54    
55    from Thuban import _
56    
57  class WMSCapabilitiesParser:  class WMSCapabilitiesParser:
58      """      """
59      Thuban class to parse capabilities supplied as large string.      Thuban class to parse capabilities supplied as large string.
# Line 68  class WMSCapabilitiesParser: Line 70  class WMSCapabilitiesParser:
70      access = None      access = None
71      formats = None      formats = None
72      srs_discrepancies = None      srs_discrepancies = None
73        error = None
74    
75    
76      def __init__(self):      def __init__(self):
# Line 78  class WMSCapabilitiesParser: Line 81  class WMSCapabilitiesParser:
81          # Note that we must not initialise internal variables of the          # Note that we must not initialise internal variables of the
82          # class in a mutable way or it will be shared among all          # class in a mutable way or it will be shared among all
83          # instances.  None is immutable, [] is not.          # instances.  None is immutable, [] is not.
84          layers = []          self.error = []
85    
86    
87      def grok(self, data):      def grok(self, data):
# Line 89  class WMSCapabilitiesParser: Line 92  class WMSCapabilitiesParser:
92          Information should only be retrieved with the respective          Information should only be retrieved with the respective
93          get*() methods.          get*() methods.
94          """          """
95          root = xml.dom.minidom.parseString(data).documentElement          xml_dom = xml.dom.minidom.parseString(data)
96            root = xml_dom.documentElement
97    
98          # Extract the title          # Extract the title
99          foo = getElementByName(getElementByName(root, 'Service'), 'Title')          foo = getElementByName(getElementByName(root, 'Service'), 'Title')
# Line 104  class WMSCapabilitiesParser: Line 108  class WMSCapabilitiesParser:
108          # Extract fees information          # Extract fees information
109          foo = getElementByName(getElementByName(root, 'Service'), 'Fees')          foo = getElementByName(getElementByName(root, 'Service'), 'Fees')
110          if foo and len(foo.childNodes[0].data) \          if foo and len(foo.childNodes[0].data) \
111                 and lower(foo.childNodes[0].data) != 'none':                 and foo.childNodes[0].data.lower() != 'none':
112              self.fees = foo.childNodes[0].data              self.fees = foo.childNodes[0].data
113                    
114          # Extract access information          # Extract access information
115          foo = getElementByName(getElementByName(root, 'Service'),          foo = getElementByName(getElementByName(root, 'Service'),
116                                 'AccessConstraints')                                 'AccessConstraints')
117          if foo and len(foo.childNodes[0].data) \          if foo and len(foo.childNodes[0].data) \
118                 and lower(foo.childNodes[0].data) != 'none':                 and foo.childNodes[0].data.lower() != 'none':
119              self.access = foo.childNodes[0].data              self.access = foo.childNodes[0].data
120                    
121          # Extract output format information          # Extract output format information
# Line 125  class WMSCapabilitiesParser: Line 129  class WMSCapabilitiesParser:
129          self.peekLayers(getElementByName(getElementByName(          self.peekLayers(getElementByName(getElementByName(
130              root, 'Capability'), 'Layer'), -1)              root, 'Capability'), 'Layer'), -1)
131    
132            xml_dom.unlink()
133    
134    
135      def peekLayers(self, top, parent):      def peekLayers(self, top, parent):
136          """          """
# Line 149  class WMSCapabilitiesParser: Line 155  class WMSCapabilitiesParser:
155          foo = getElementByName(top, 'Title')          foo = getElementByName(top, 'Title')
156          if foo and len(foo.childNodes[0].data):          if foo and len(foo.childNodes[0].data):
157              self.layers[index]['title'] = foo.childNodes[0].data              self.layers[index]['title'] = foo.childNodes[0].data
158            else:
159                # A <Title> is required for each layer, <name> is optional
160                # See OGC 01-068r3, 7.1.4.5.1 and 7.1.4.5.2
161                self.error.append(_("No title found for layer #%d") % index)
162    
163          foo = getElementByName(top, 'Name')          foo = getElementByName(top, 'Name')
164          if foo and len(foo.childNodes[0].data):          if foo and len(foo.childNodes[0].data):
# Line 160  class WMSCapabilitiesParser: Line 170  class WMSCapabilitiesParser:
170                  if srs[0:5] == 'EPSG:':                  if srs[0:5] == 'EPSG:':
171                      srs = srs[5:]                      srs = srs[5:]
172                  try:                  try:
173                      self.layers[index]['srs'].append(srs)                      int(srs)
174                  except KeyError:                      try:
175                      self.layers[index]['srs'] = [srs]                          self.layers[index]['srs'].append(srs)
176                        except KeyError:
177                            self.layers[index]['srs'] = [srs]
178                    except ValueError:
179                        if srs[0:4].upper() == 'AUTO' \
180                               or srs[0:4].upper() == 'NONE':
181                            try:
182                                self.layers[index]['_srs_'].append(srs)
183                            except KeyError:
184                                self.layers[index]['_srs_'] = [srs]
185                        else:
186                            self.error.append(_("SRS '%s' is not numerical and not"
187                                                " AUTO/NONE in layer '%s'") \
188                                              % (srs, self.layers[index]['title']))
189    
190          foo = getElementByName(top, 'LatLonBoundingBox')          foo = getElementByName(top, 'LatLonBoundingBox')
191          if foo is not None:          if foo is not None:
# Line 435  class WMSCapabilitiesParser: Line 458  class WMSCapabilitiesParser:
458                              if srs in pivot['bbox']:                              if srs in pivot['bbox']:
459                                  return pivot['bbox'][srs]                                  return pivot['bbox'][srs]
460    
461            # No matching BBox found, let's see if it was EPSG:4326
462            if srs == '4326':
463                return self.getLayerLatLonBBox(name)
464    
465          return None          return None
466    
467    
# Line 479  if __name__ == "__main__": Line 506  if __name__ == "__main__":
506    
507      import os      import os
508    
509        sample = "test/sample.xml"
510      try:      try:
511          f = open("test/sample.xml", "r")          f = open(sample, "r")
512      except IOError:      except IOError:
513          try:          try:
514              f = open(os.path.dirname(__file__) + "/test/sample.xml", "r")              f = open(os.path.dirname(__file__) + "/" + sample, "r")
515          except IOError:          except IOError:
516              print "Cannot open sample.xml for reading"              print "Cannot open %s for reading" % sample
517    
518      if f is not None:      if f is not None:
519          sample = f.read();          sample = f.read();

Legend:
Removed from v.2145  
changed lines
  Added in v.2170

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26