/[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 1149 by frank, Wed Jun 11 10:45:34 2003 UTC revision 1830 by bh, Thu Oct 16 16:36:00 2003 UTC
# Line 5  Line 5 
5  # This program is free software under the GPL (>=v2)  # This program is free software under the GPL (>=v2)
6  # Read the file COPYING coming with Thuban for details.  # Read the file COPYING coming with Thuban for details.
7    
8    """Handle resources loaded from files such as projections"""
9    
10    __version__ = "$Revision$"
11    # $Source$
12    # $Id$
13    
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 _
21    
22  from Thuban.Lib.fileutil import get_application_dir  from Thuban.Lib.fileutil import get_application_dir
23    
24  from Thuban.Model.load import XMLReader  from Thuban.Model.xmlreader import XMLReader
25  from Thuban.Model.save import XMLWriter  from Thuban.Model.xmlwriter import XMLWriter
26  from Thuban.Model.proj import Projection, ProjFile  from Thuban.Model.proj import Projection, ProjFile
27  from xml.sax import SAXParseException  from xml.sax import SAXParseException
28    
29  projdir = \  projdir = \
30          os.path.join(Thuban.__path__[0], os.pardir, "Resources", "Projections")          os.path.join(Thuban.__path__[0], os.pardir, "Resources", "Projections")
31    
 usrdir  = get_application_dir()  
32    
33  PROJ_EXT = ".proj"  PROJ_EXT = ".proj"
34    
35  def ReadProjFile(filename):  has_gdal_support = lambda: False
36      """Read a single .proj file and return a ProjFile object.  try:
37            # first try to see if our extension module is there. if it
38      Raises IOError if the file cannot be opened.      # wasn't even compiled, we obviously don't have gdal support.
39      Raises OSError if the file cannot be read.      import gdalwarp
40      Raises SAXParseException if the file is not valid XML.  
41        # now try to import the python extension. if this doesn't
42        # exist then we can't do anything.
43        import gdal
44    
45        """Return True if the gdal library is available."""
46        has_gdal_support = lambda: True
47    except ImportError:
48        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):
60        """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
63        strings with warnings messages that might have been generated by the
64        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      handler = ProjFileReader()      Raises IOError if the file cannot be opened, OSError if the file
73      handler.read(filename)      cannot be read and SAXParseException if the file is not valid XML.
74      return handler.GetProjFile()      """
75        filename = os.path.abspath(filename)
76        if filename in projfile_cache:
77            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 WriteProjFile(pf):  def write_proj_file(pf):
86      """Write a single .proj file      """Write a single .proj file
87    
88      Raises IOError if the file cannot be written.      Raises IOError if the file cannot be written.
# Line 46  def WriteProjFile(pf): Line 91  def WriteProjFile(pf):
91      saver = ProjFileSaver(pf)      saver = ProjFileSaver(pf)
92      saver.write(pf.GetFilename())      saver.write(pf.GetFilename())
93    
 def GetProjFiles(dir):  
     """Read all .proj files in the given directory and  
     return a list of ProjFile objects.  
     """  
94    
95      list = []  def get_system_proj_file():
96      try:      """Return the standard projections and a list with warnings
         dirlist = os.listdir(dir)  
     except OSError:  
         pass # if we can't get a directory listing just return []  
     else:  
         for file in filter(lambda s: s.endswith(PROJ_EXT), dirlist):  
             try:  
                 filename = os.path.join(dir, file)  
                 list.append(ReadProjFile(filename))  
             except (OSError, IOError, SAXParseException):  
                 pass # just move onto the next file  
   
     return list  
   
 def GetSystemProjFiles():  
     """Return a list of ProjFile objects from files that are  
     supplied by Thuban.  
97    
98      If no files could not be opened return a list with one      The projections read from the default thuban projection file
99      empty projection file set to store data in the default file.      (usually in Resources/Projections/defaults.proj). The return value
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
102        but may contain messages about ignored errors.
103    
104        If the file could could not be opened return an empty projection
105        file object set to store data in the default file.
106      """      """
107      filename = os.path.join(projdir, "defaults.proj")      filename = os.path.join(projdir, "defaults.proj")
108      try:      try:
109          return [ReadProjFile(filename)]          return read_proj_file(filename)
110      except (OSError, IOError, SAXParseException):      except (OSError, IOError, SAXParseException), val:
111          return [ProjFile(filename)]          msg = _('Could not read "%s": %s') % (filename, str(val))
112            return ProjFile(filename), [msg]
113  def GetUserProjFiles():  
114      """Return a list of ProjFile objects from files that are user-defined.  def get_user_proj_file():
115        """Return the user's projections and a list with warnings
116    
117        The projections read from the user's thuban projection file (usually
118        in ~/.thuban/user.proj). The return value is a tuple with the
119        projections in a ProjFile object and a list of strings with warning
120        messages. The warnings list is usually empty but may contain
121        messages about ignored errors.
122    
123      If no files could not be opened return a list with one      If the file could could not be opened return an empty projection
124      empty projection file set to store data in the default file.      file object set to store data in the default file.
125      """      """
126        usrdir  = get_application_dir()
127      filename = os.path.join(usrdir, "user.proj")      filename = os.path.join(usrdir, "user.proj")
128      try:      try:
129          return [ReadProjFile(filename)]          return read_proj_file(filename)
130      except (OSError, IOError, SAXParseException):      except (OSError, IOError, SAXParseException), val:
131          return [ProjFile(filename)]          msg = _('Could not read "%s": %s') % (filename, str(val))
132            return ProjFile(filename), [msg]
133    
134    
135  class ProjFileReader(XMLReader):  class ProjFileReader(XMLReader):
136    
137      def __init__(self):      def __init__(self):
138          XMLReader.__init__(self)          XMLReader.__init__(self)
139          self.__pf = ProjFile("")          self.projfile = ProjFile("")
140            self.warnings = []
141    
142          XMLReader.AddDispatchers(self,          XMLReader.AddDispatchers(self,
143              {'projection': ("start_projection", "end_projection"),              {'projection': ("start_projection", "end_projection"),
144               'parameter':  ("start_parameter", None)})               'parameter':  ("start_parameter", None)})
145                
146      def read(self, file_or_filename):      def read(self, file_or_filename):
147          XMLReader.read(self, file_or_filename)          XMLReader.read(self, file_or_filename)
148    
149          self.__pf.SetFilename(XMLReader.GetFilename(self))          self.projfile.SetFilename(XMLReader.GetFilename(self))
150            
151      def start_projection(self, name, qname, attrs):      def start_projection(self, name, qname, attrs):
152          self.params = []          self.params = []
153          self.name = self.encode(attrs.get((None, 'name'), _("Unknown")))          name = self.encode(attrs.get((None, 'name')))
154            if name is None:
155                name = _("Unknown")
156            self.name = name
157            self.epsg = self.encode(attrs.get((None, 'epsg')))
158    
159      def end_projection(self, name, qname):      def end_projection(self, name, qname):
160          self.__pf.Add(Projection(self.params, self.name))          try:
161                proj = Projection(self.params, self.name, epsg = self.epsg)
162            except IOError, val:
163                self.warnings.append(_('Error in projection "%s": %s')
164                                     % (self.name, str(val)))
165            else:
166                self.projfile.Add(proj)
167    
168      def start_parameter(self, name, qname, attrs):      def start_parameter(self, name, qname, attrs):
169          s = attrs.get((None, 'value'))          s = attrs.get((None, 'value'))
# Line 120  class ProjFileReader(XMLReader): Line 171  class ProjFileReader(XMLReader):
171          self.params.append(s)          self.params.append(s)
172    
173      def GetProjFile(self):      def GetProjFile(self):
174          return self.__pf          return self.projfile
175    
176        def GetWarnings(self):
177            """Return the list of warning messages that may have been produced"""
178            return self.warnings
179    
180    
181  class ProjFileSaver(XMLWriter):  class ProjFileSaver(XMLWriter):
# Line 132  class ProjFileSaver(XMLWriter): Line 187  class ProjFileSaver(XMLWriter):
187      def write(self, file_or_filename):      def write(self, file_or_filename):
188          XMLWriter.write(self, file_or_filename)          XMLWriter.write(self, file_or_filename)
189    
190          self.write_header("projfile", "projfile.dtd")          self.write_header("projectionlist", "projfile.dtd")
191          self.write_projfile(self.__pf)          self.write_projfile(self.__pf)
192          self.close()          self.close()
193    
# Line 141  class ProjFileSaver(XMLWriter): Line 196  class ProjFileSaver(XMLWriter):
196          self.open_element("projectionlist")          self.open_element("projectionlist")
197    
198          for p in pf.GetProjections():          for p in pf.GetProjections():
199              self.open_element("projection", {"name": p.GetName()})              attrs = {"name": p.GetName()}
200                if p.EPSGCode():
201                    attrs["epsg"] = p.EPSGCode()
202                self.open_element("projection", attrs)
203    
204              for param in p.GetAllParameters():              for param in p.GetAllParameters():
205                  self.write_element("parameter", {"value": param})                  self.write_element("parameter", {"value": param})

Legend:
Removed from v.1149  
changed lines
  Added in v.1830

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26