/[thuban]/branches/WIP-pyshapelib-bramz/Thuban/Model/resource.py
ViewVC logotype

Diff of /branches/WIP-pyshapelib-bramz/Thuban/Model/resource.py

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

revision 1791 by jan, Wed Oct 8 14:47:53 2003 UTC revision 1940 by bh, Tue Nov 11 18:27:39 2003 UTC
# Line 14  __version__ = "$Revision$" Line 14  __version__ = "$Revision$"
14    
15  import os  import os
16  import os.path  import os.path
17    import weakref
18    
19  import Thuban  import Thuban
20  from Thuban import _  from Thuban import _
# Line 46  try: Line 47  try:
47  except ImportError:  except ImportError:
48      pass      pass
49    
50    projfile_cache = weakref.WeakValueDictionary()
51    
52    def clear_proj_file_cache():
53        """Clear the cache of ProjFile objects maintained by read_proj_file.
54    
55        This function is probably only useful for the test suite.
56        """
57        projfile_cache.clear()
58    
59  def read_proj_file(filename):  def read_proj_file(filename):
60      """Read a .proj file and return a ProjFile object and warnings      """Read a .proj file and return a ProjFile object and warnings
61    
62      The return value is a tuple with the ProjFile object and a list of      The return value is a tuple with the ProjFile object and a list of
63      strings with warnings messages that might have been generated by the      strings with warnings messages that might have been generated by the
64      proj ifle parser.      proj file parser.
65    
66        The objects returned cached so that reading the same file
67        (identified by its absolute name) several times yields the same
68        ProjFile object. The cache uses weak references so the objects will
69        be removed from the cache once the last reference an object in the
70        cache is removed.
71    
72      Raises IOError if the file cannot be opened, OSError if the file      Raises IOError if the file cannot be opened, OSError if the file
73      cannot be read and SAXParseException if the file is not valid XML.      cannot be read and SAXParseException if the file is not valid XML.
74      """      """
75      handler = ProjFileReader()      filename = os.path.abspath(filename)
76      handler.read(filename)      if filename in projfile_cache:
77      return handler.GetProjFile(), handler.GetWarnings()          return projfile_cache[filename], []
78        else:
79            handler = ProjFileReader()
80            handler.read(filename)
81            proj_file = handler.GetProjFile()
82            projfile_cache[filename] = proj_file
83            return proj_file, handler.GetWarnings()
84    
85  def write_proj_file(pf):  def write_proj_file(pf):
86      """Write a single .proj file      """Write a single .proj file
# Line 69  def write_proj_file(pf): Line 91  def write_proj_file(pf):
91      saver = ProjFileSaver(pf)      saver = ProjFileSaver(pf)
92      saver.write(pf.GetFilename())      saver.write(pf.GetFilename())
93    
94    #
95  def get_system_proj_file():  # Constants for the get_system_proj_file function
96      """Return the standard projections and a list with warnings  #
97    
98      The projections read from the default thuban projection file  # The default projection file with a few predefined projections
99      (usually in Resources/Projections/defaults.proj). The return value  DEFAULT_PROJ_FILE = "defaults.proj"
100      is a tuple with the projections in a ProjFile object and a list of  
101      strings with warning messages. The warnings list is usually empty  # The epsg projections.
102      but may contain messages about ignored errors.  EPSG_PROJ_FILE = "epsg.proj"
103    
104    # Deprecated EPSG projections.
105    EPSG_DEPRECATED_PROJ_FILE = "epsg-deprecated.proj"
106    
107    def get_system_proj_file(filename):
108        """Return the projections from the indicated file and a list with warnings
109    
110        The filename argument should be the name of a file in the directory
111        with Thuban's default projection files (Resources/Projections/). If
112        possible callers should not use hardwired string literal for the
113        name to avoid unnecessary duplication. Instead they should use one
114        of the predefined constants, currently DEFAULT_PROJ_FILE,
115        EPSG_PROJ_FILE or EPSG_DEPRECATED_PROJ_FILE.
116    
117        The return value is a tuple with the projections in a ProjFile
118        object and a list of strings with warning messages. The warnings
119        list is usually empty but may contain messages about ignored errors.
120    
121      If the file could could not be opened return an empty projection      If the file could could not be opened return an empty projection
122      file object set to store data in the default file.      file object set to store data in the indicated default file.
123      """      """
124      filename = os.path.join(projdir, "defaults.proj")      fullname = os.path.join(projdir, filename)
125      try:      try:
126          return read_proj_file(filename)          return read_proj_file(fullname)
127      except (OSError, IOError, SAXParseException), val:      except (OSError, IOError, SAXParseException), val:
128          msg = _('Could not read "%s": %s') % (filename, str(val))          msg = _('Could not read "%s": %s') % (fullname, str(val))
129          return ProjFile(filename), [msg]          return ProjFile(fullname), [msg]
130    
131  def get_user_proj_file():  def get_user_proj_file():
132      """Return the user's projections and a list with warnings      """Return the user's projections and a list with warnings
# Line 132  class ProjFileReader(XMLReader): Line 171  class ProjFileReader(XMLReader):
171          if name is None:          if name is None:
172              name = _("Unknown")              name = _("Unknown")
173          self.name = name          self.name = name
174            self.epsg = self.encode(attrs.get((None, 'epsg')))
175    
176      def end_projection(self, name, qname):      def end_projection(self, name, qname):
177          try:          try:
178              proj = Projection(self.params, self.name)              proj = Projection(self.params, self.name, epsg = self.epsg)
179          except IOError, val:          except IOError, val:
180              self.warnings.append(_('Error in projection "%s": %s')              self.warnings.append(_('Error in projection "%s": %s')
181                                   % (self.name, str(val)))                                   % (self.name, str(val)))
# Line 173  class ProjFileSaver(XMLWriter): Line 213  class ProjFileSaver(XMLWriter):
213          self.open_element("projectionlist")          self.open_element("projectionlist")
214    
215          for p in pf.GetProjections():          for p in pf.GetProjections():
216              self.open_element("projection", {"name": p.GetName()})              attrs = {"name": p.GetName()}
217                if p.EPSGCode():
218                    attrs["epsg"] = p.EPSGCode()
219                self.open_element("projection", attrs)
220    
221              for param in p.GetAllParameters():              for param in p.GetAllParameters():
222                  self.write_element("parameter", {"value": param})                  self.write_element("parameter", {"value": param})

Legend:
Removed from v.1791  
changed lines
  Added in v.1940

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26