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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1830 - (show annotations)
Thu Oct 16 16:36:00 2003 UTC (21 years, 4 months ago) by bh
Original Path: trunk/thuban/Thuban/Model/resource.py
File MIME type: text/x-python
File size: 6553 byte(s)
(projfile_cache): Introduce a cache for
ProjFile objects
(clear_proj_file_cache): New function to clear the cache. Mainly
useful for use by the test suite
(read_proj_file): Use the cache.

1 # Copyright (c) 2003 by Intevation GmbH
2 # Authors:
3 # Jonathan Coles <[email protected]>
4 #
5 # This program is free software under the GPL (>=v2)
6 # 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
16 import os.path
17 import weakref
18
19 import Thuban
20 from Thuban import _
21
22 from Thuban.Lib.fileutil import get_application_dir
23
24 from Thuban.Model.xmlreader import XMLReader
25 from Thuban.Model.xmlwriter import XMLWriter
26 from Thuban.Model.proj import Projection, ProjFile
27 from xml.sax import SAXParseException
28
29 projdir = \
30 os.path.join(Thuban.__path__[0], os.pardir, "Resources", "Projections")
31
32
33 PROJ_EXT = ".proj"
34
35 has_gdal_support = lambda: False
36 try:
37 # first try to see if our extension module is there. if it
38 # wasn't even compiled, we obviously don't have gdal support.
39 import gdalwarp
40
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 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.
74 """
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 write_proj_file(pf):
86 """Write a single .proj file
87
88 Raises IOError if the file cannot be written.
89 """
90
91 saver = ProjFileSaver(pf)
92 saver.write(pf.GetFilename())
93
94
95 def get_system_proj_file():
96 """Return the standard projections and a list with warnings
97
98 The projections read from the default thuban projection file
99 (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")
108 try:
109 return read_proj_file(filename)
110 except (OSError, IOError, SAXParseException), val:
111 msg = _('Could not read "%s": %s') % (filename, str(val))
112 return ProjFile(filename), [msg]
113
114 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 the file could could not be opened return an empty projection
124 file object set to store data in the default file.
125 """
126 usrdir = get_application_dir()
127 filename = os.path.join(usrdir, "user.proj")
128 try:
129 return read_proj_file(filename)
130 except (OSError, IOError, SAXParseException), val:
131 msg = _('Could not read "%s": %s') % (filename, str(val))
132 return ProjFile(filename), [msg]
133
134
135 class ProjFileReader(XMLReader):
136
137 def __init__(self):
138 XMLReader.__init__(self)
139 self.projfile = ProjFile("")
140 self.warnings = []
141
142 XMLReader.AddDispatchers(self,
143 {'projection': ("start_projection", "end_projection"),
144 'parameter': ("start_parameter", None)})
145
146 def read(self, file_or_filename):
147 XMLReader.read(self, file_or_filename)
148
149 self.projfile.SetFilename(XMLReader.GetFilename(self))
150
151 def start_projection(self, name, qname, attrs):
152 self.params = []
153 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):
160 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):
169 s = attrs.get((None, 'value'))
170 s = str(s) # we can't handle unicode in proj
171 self.params.append(s)
172
173 def GetProjFile(self):
174 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):
182
183 def __init__(self, pf):
184 XMLWriter.__init__(self)
185 self.__pf = pf
186
187 def write(self, file_or_filename):
188 XMLWriter.write(self, file_or_filename)
189
190 self.write_header("projectionlist", "projfile.dtd")
191 self.write_projfile(self.__pf)
192 self.close()
193
194 def write_projfile(self, pf):
195
196 self.open_element("projectionlist")
197
198 for p in pf.GetProjections():
199 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():
205 self.write_element("parameter", {"value": param})
206
207 self.close_element("projection")
208
209 self.close_element("projectionlist")
210
211

Properties

Name Value
svn:eol-style native
svn:keywords Author Date Id Revision

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26